W naszym klastrze ograniczamy zasoby naszych procesów, np. Pamięć ( memory.limit_in_bytes
).
Myślę, że ostatecznie jest to również obsługiwane przez zabójcę OOM w jądrze Linuksa (wygląda to tak, czytając kod źródłowy ).
Czy jest jakiś sposób na uzyskanie sygnału, zanim mój proces zostanie zabity? (Podobnie jak -notify
opcja dla SGEqsub
, które wyślą SIGUSR1
przed zakończeniem procesu).
Czytam o tym /dev/mem_notify
tutaj, ale nie mam tego - czy jest coś jeszcze w dzisiejszych czasach? Przeczytałem również to, co wydaje się dość istotne.
Chcę być w stanie przynajmniej zrzucić ślad małego stosu i może jakieś inne przydatne informacje debugowania - ale może uda mi się nawet odzyskać, zwalniając trochę pamięci.
Jednym z obejść, których obecnie używam, jest ten mały skrypt, który często sprawdza, czy jestem blisko (95%) limitu, a jeśli tak, wysyła proces a SIGUSR1
. W Bash uruchamiam ten skrypt w tle ( cgroup-mem-limit-watcher.py &
), aby szukał on innych procesów w tej samej grupie i automatycznie kończy działanie po śmierci nadrzędnego procesu Bash.
źródło
Odpowiedzi:
Możliwe jest zarejestrowanie się, aby otrzymywać powiadomienia o przekroczeniu przez pamięć grupy pamięci wartości progowej. Zasadniczo ustawienie progu w odpowiednim punkcie poniżej faktycznego limitu umożliwi wysłanie sygnału lub podjęcie innych działań.
Widzieć:
https://www.kernel.org/doc/Documentation/cgroup-v1/memory.txt
źródło
OOM Killer wysyła SIGKILL, ponieważ w przeciwnym razie niepraktyczne byłoby pozostawienie problematycznemu programowi wyboru kontynuacji.
Oznacza to, że proces nie ma absolutnie żadnej wiedzy, kiedy ma zostać zabity.
Zarządzanie takimi problemami zwykle oznacza dokonywanie poprawek w programach lub ich konfiguracji. Czasami, w zależności od konfiguracji systemu, zwykłe zwiększenie przestrzeni wymiany może dać systemowi operacyjnemu większą elastyczność zarządzania pamięcią, aby uniknąć tak drastycznych środków.
źródło