Moja aplikacja działa jako proces w tle w systemie Linux. Obecnie jest uruchamiany z wiersza poleceń w oknie terminala.
Niedawno użytkownik uruchamiał aplikację przez pewien czas i ta tajemnicza śmierć. Tekst:
Zabity
był na terminalu. Stało się to dwa razy. Zapytałem, czy ktoś w innym terminalu użył polecenia kill, aby zabić proces? Nie.
W jakich warunkach Linux zdecydowałby się zabić mój proces? Uważam, że powłoka wyświetlała komunikat „zabity”, ponieważ proces ten umarł po otrzymaniu sygnału zabicia (9). Jeśli Linux wysłał sygnał zabicia, czy w logu systemowym powinien znajdować się komunikat wyjaśniający, dlaczego został zabity?
/var/log/messages
(3) Powłoka, w której uruchomiono proces, czyli proces, który drukujeKilled
powiadomienie, gdy status wyjścia zwaitpid(2)
wskazuje, że proces potomny zmarł z sygnału 9./var/log/syslog
Odpowiedzi:
Jeśli użytkownik lub sysadmin nie zabił programu, jądro może go mieć. Jądro zabiłoby proces tylko w wyjątkowych okolicznościach, takich jak ekstremalne głodzenie zasobów (pomyśl mem + wyczerpanie zamiany).
źródło
dmesg
do wyświetlania dziennika jądra: tutaj znajduję procesy Pythona zabite przez jądro z powodu ekstremalnego zużycia pamięci wirtualnej.Próbować:
Gdzie
-B100
oznacza liczbę linii przed zabiciem.Pomiń -T w systemie Mac OS.
źródło
info egrep
: „egrep jest taki sam jak grep -E. ... Bezpośrednie wywołanie jako egrep lub fgrep jest przestarzałe”'killed process'
można użyćgrep
zamiastegrep
bez innych zmian. Dla bardziej skomplikowanej strukturze, byś zmienił zastąpić npegrep -i -B100 'foo|ba[rz]'
zgrep -E -i -B100 'foo|ba[rz]'
. Te pytania i odpowiedzi zawierają więcej szczegółów.dmesg -T
w celu uzyskania czytelnych znaczników czasuTo wygląda na dobry artykuł na ten temat: Oswajanie zabójcy OOM .
Istotą jest to, że Linux przesadapamięć. Kiedy proces poprosi o więcej miejsca, Linux da mu to miejsce, nawet jeśli jest zajęte przez inny proces, przy założeniu, że nikt tak naprawdę nie wykorzystuje całej pamięci, o którą prosi. Proces uzyska wyłączne wykorzystanie pamięci, którą przydzielił, kiedy faktycznie z niego korzysta, a nie kiedy o to poprosi. Dzięki temu alokacja jest szybka i może pozwolić ci „oszukać” i przydzielić więcej pamięci, niż naprawdę masz. Jednak gdy procesy zaczną korzystać z tej pamięci, Linux może zdać sobie sprawę, że zbyt hojnie przydzielał pamięć, której nie ma, i będzie musiał zabić proces, aby zwolnić trochę. Proces, który ma zostać zabity, opiera się na wynikach uwzględniających czas działania (procesy długotrwałe są bezpieczniejsze), użycie pamięci (procesy zachłanne są mniej bezpieczne) i kilka innych czynników, w tym wartość, którą możesz dostosować, aby zmniejszyć prawdopodobieństwo śmierci procesu. Wszystko to opisano w artykule bardziej szczegółowo.
Edycja: A oto kolejny artykuł, który całkiem dobrze wyjaśnia, jak wybierany jest proces (opatrzony adnotacjami w niektórych przykładach kodu jądra). Wspaniałą rzeczą jest to, że zawiera komentarz dotyczący uzasadnienia różnych
badness()
zasad.źródło
Pozwól mi najpierw wyjaśnić, kiedy i dlaczego wywoływany jest OOMKiller?
Załóżmy, że masz 512 pamięci RAM + 1 GB pamięci wymiany. Teoretycznie procesor ma dostęp do łącznie 1,5 GB pamięci wirtualnej.
Od pewnego czasu wszystko działa dobrze w granicach 1,5 GB całkowitej pamięci. Ale nagle (lub stopniowo) twój system zaczął zużywać coraz więcej pamięci i osiągnął poziom około 95% całkowitej zajętej pamięci.
Powiedzmy teraz, że jakikolwiek proces zażądał dużego fragmentu pamięci z jądra. Jądro sprawdza dostępną pamięć i stwierdza, że nie ma możliwości, aby przydzielić procesowi więcej pamięci. Spróbuje więc zwolnić część pamięci wywołując / wywołując OOMKiller ( http://linux-mm.org/OOM ).
OOMKiller ma swój własny algorytm do oceny rangi dla każdego procesu. Zazwyczaj proces, który zużywa więcej pamięci, staje się ofiarą do zabicia.
Gdzie mogę znaleźć dzienniki OOMKiller?
Zazwyczaj w katalogu / var / log. Albo /var/log/kern.log lub / var / log / dmesg
Mam nadzieję, że to ci pomoże.
Niektóre typowe rozwiązania:
źródło
To jest Linux out of memory manager (OOM) . Twój proces został wybrany z powodu „ złości ” - połączenia aktualności, wielkości rezydenta (używana pamięć, a nie tylko przydzielona) i innych czynników.
Zobaczysz komunikat taki jak:
źródło
Jak stwierdzili dwc i Adam Jaskiewicz, winowajcą jest prawdopodobnie zabójca OOM. Następne pytanie brzmi jednak: jak temu zapobiec?
Istnieje kilka sposobów:
Dzięki temu artykułowi stwierdziłem, że (2) jest szczególnie łatwa do wdrożenia .
źródło
Moduł PAM do zasobów granicznych spowodowane dokładnie opisane wyniki Państwo: Mój proces zmarł w tajemniczych okolicznościach z tekstem Killed w oknie konsoli. Brak danych wyjściowych dziennika, ani w syslog, ani w kern.log . Top Program pomógł mi odkryć, że dokładnie po minucie od użycia procesora mój proces ginie.
źródło
Narzędzie takie jak systemtap (lub tracer) może monitorować logikę transmisji sygnału jądra i raportować. np. https://sourceware.org/systemtap/examples/process/sigmon.stp
if
Blok filtrujący w tym skrypcie można dostosować do gustu lub wyeliminować, aby śledzić ruch sygnału w całym systemie. Przyczyny mogą być dalej izolowane poprzez zbieranie śladów wstecznych (dodaj aprint_backtrace()
i / lubprint_ubacktrace()
do sondy, odpowiednio dla jądra i przestrzeni użytkownika).źródło
W środowisku lsf (interaktywnym lub innym), jeśli aplikacja przekracza wykorzystanie pamięci przekraczające pewien wstępnie ustalony próg przez administratorów w kolejce lub żądanie zasobów przesłane do kolejki, procesy zostaną zabite, aby inni użytkownicy nie padli ofiarą potencjalnego uciec. Nie zawsze wysyła wtedy wiadomość e-mail, w zależności od konfiguracji.
Jednym z rozwiązań w tym przypadku jest znalezienie kolejki z większymi zasobami lub zdefiniowanie większych wymagań dotyczących zasobów podczas przesyłania.
Możesz także chcieć przejrzeć
man ulimit
Chociaż nie pamiętam
ulimit
co skutkujeKilled
jego Dawno Potrzebowałem tego.źródło
Mieliśmy powtarzające się problemy pod Linuksem w witrynie klienta (myślę, że Red Hat), gdzie OOMKiller (zabójca braku pamięci) zabija zarówno naszą główną aplikację (tj. Powód istnienia serwera), jak i procesy w bazie danych.
W każdym przypadku OOMKiller po prostu zdecydował, że procesy wykorzystują zbyt wiele zasobów ... maszyna nawet nie zawiedzie z powodu braku zasobów. Ani aplikacja, ani jej baza danych nie ma problemów z wyciekami pamięci (lub innymi wyciekami zasobów).
Nie jestem ekspertem od Linuksa, ale raczej zebrałem jego algorytm do decydowania, kiedy coś zabić, a co zabić jest skomplikowane. Powiedziano mi również (nie mogę powiedzieć o dokładności tego), że OOMKiller jest upieczony w jądrze i nie można go po prostu uruchomić.
źródło
echo "2" > /proc/sys/vm/overcommit_memory
sudo echo "2" > /proc/sys/vm/overcommit_memory
/ proc / sys / vm / overcommit_memory: Odmowa dostępuecho 2 | sudo tee /proc/sys/vm/overcommit_memory
W moim przypadku działo się tak z pracownikiem kolejki Laravel. Dzienniki systemowe nie wspominały o żadnym zabijaniu, więc spojrzałem dalej i okazało się, że pracownik w zasadzie sam się zabijał z powodu zadania, które przekroczyło limit pamięci (domyślnie ustawiony na 128M).
Uruchomienie kolejek roboczych
--timeout=600
i--memory=1024
naprawiłem problem.źródło
Użytkownik ma możliwość zabijania własnych programów za pomocą kill lub Control + C, ale mam wrażenie, że tak się nie stało, a użytkownik narzekał.
root ma oczywiście możliwość zabijania programów, ale jeśli ktoś ma root na twoim komputerze i zabija rzeczy, masz większe problemy.
Jeśli nie jesteś sysadminem, sysadmin mógł ustawić limity wykorzystania procesora, pamięci RAM lub dysku i automatycznie zabija procesy, które je przekraczają.
Poza tymi domysłami, nie jestem pewien bez dodatkowych informacji o programie.
źródło
Ostatnio napotkałem ten problem. W końcu odkryłem, że moje procesy zostały zabite zaraz po automatycznym wywołaniu aktualizacji opensuse zypper. Aby wyłączyć aktualizację zypper, rozwiązałem mój problem.
źródło
Rozwiązano ten problem, zwiększając rozmiar wymiany :
/ubuntu/1075505/how-do-i-increase-swapfile-in-ubuntu-18-04
źródło