Kontekst:Co zrobić, aby Perl nie zużywał ton pamięci po wyłączeniu widełek dużego procesu nadrzędnego?
Mam multi-rozwidlone Perl (5,16) Proces, który działa na Linux. Widget nadrzędny ładuje bardzo dużą ilość kodu Perla (przez use/require
) i przydziela wiele struktur danych (kilka GB). Następnie tworzy wiele rozwidleń dla dzieci, z których wszystkie działają równolegle. Odbywa się to w celu zmniejszenia śladu pamięciowego procesu podczas jego działania, ponieważ funkcja kopiowania przy zapisie z dnia fork()
oznacza, że dzieci mogą korzystać z danych, które posiada rodzic, bez utrzymywania własnego dużego obrazu pamięci.
Problem:
Wszystko to działa dobrze, dopóki próbuję zamknąć grupę procesów. Kiedy przerywam rodzic (sygnał propaguje się do wszystkich dzieci), pamięć serwera uruchamiającego kod natychmiast się zapełnia, zaczyna się zamieniać, a inne procesy na serwerze mielą się do zatrzymania. Gdy widelec do kopiowania na piśmie zostanie zamknięty, Perl wydaje się próbować ponownie przydzielić całą pamięć zarezerwowaną w systemie nadrzędnym, aby można go było zgłosić pod kątem free
lub coś podobnego.
Pytanie:
Jak mogę zapobiec uwędzić na zamknięciu dzieje? Czy jest jakiś sposób, by powiedzieć dziecinnym widelcom, że próbują tylko przechodzić i odzyskiwać pamięć, którą przydzielono te widełki?
Czy rodzic powinien najpierw złapać sygnał i wyłączyć dzieci? – Schwern