W moim dzienniku wiadomości znajduje się następujący raport:
kernel: Out of memory: Kill process 9163 (mysqld) score 511 or sacrifice child
kernel: Killed process 9163, UID 27, (mysqld) total-vm:2457368kB, anon-rss:816780kB, file-rss:4kB
Nie ma znaczenia, czy ten problem jest httpd
, mysqld
albo postfix
, ale jestem ciekaw, w jaki sposób można kontynuować debugowania problemu.
Jak mogę uzyskać więcej informacji o tym, dlaczego PID 9163 został zabity i nie jestem pewien, czy Linux gdzieś przechowuje historię dla zakończonych PID.
Jeśli tak się stanie w pliku dziennika wiadomości, w jaki sposób krok po kroku rozwiążesz ten problem?
# free -m
total used free shared buffers cached
Mem: 1655 934 721 0 10 52
-/+ buffers/cache: 871 784
Swap: 109 6 103`
linux
logs
memory
out-of-memory
ibedelovski
źródło
źródło
dmesg
?Odpowiedzi:
Jądro zarejestruje kilka rzeczy, zanim to się stanie, ale większość z nich prawdopodobnie nie będzie dostępna, w
/var/log/messages
zależności od(r)syslogd
konfiguracji. Próbować:Ten pierwszy powinien pojawić się kilka razy, a drugi tylko w jednym lub dwóch miejscach. To jest plik, który chcesz obejrzeć.
Znajdź oryginalny wiersz „Brak pamięci” w jednym z plików, który również zawiera
total_vm
. Trzydzieści sekund do minuty (może być więcej, może być mniej) przed tą linią znajdziesz coś takiego:Powinieneś także znaleźć tabelę gdzieś pomiędzy tą linią a linią „Brak pamięci” z takimi nagłówkami:
To może niewiele powiedzieć, niż już wiesz, ale pola są następujące:
Możesz w większości zignorować
nr_ptes
iswapents
chociaż uważam, że są to czynniki decydujące o tym, kto zostanie zabity. Niekoniecznie jest to proces wykorzystujący najwięcej pamięci, ale najprawdopodobniej tak jest. Aby uzyskać więcej informacji na temat procesu wyboru, zobacz tutaj . Zasadniczo proces, który kończy się najwyższym wynikiem oom, zostaje zabity - taki jest „wynik” podany w wierszu „Brak pamięci”; niestety inne wyniki nie są zgłaszane, ale ta tabela zawiera pewne wskazówki dotyczące czynników.Ponownie, prawdopodobnie nie zrobi to więcej niż tylko wyjaśnienie oczywistości: system zabrakło pamięci i
mysqld
został wybrany, aby umrzeć, ponieważ zabicie go uwolniłoby najwięcej zasobów . Nie oznaczamysqld
to, że robi coś złego. Możesz spojrzeć na tabelę, aby sprawdzić, czy coś innego nie poszło w tym czasie poza linię, ale może nie być wyraźnego winowajcy: w systemie może zabraknąć pamięci tylko dlatego, że źle oceniłeś lub źle skonfigurowałeś uruchomione procesy.źródło
dmesg
jest tam, gdzie jest to gwarantowane. Będzie to możliwe tylko/var/log
wtedy, gdy demon syslog będzie czytał/dev/kmsg
(co zwykle robi).dmesg
obecny, nawet jeśli system był uruchomiony.Kluczem do tego jest sama wiadomość - Brak pamięci . Kiedy jądro Linuksa jest pozbawione pamięci wirtualnej (fizycznej pamięci RAM i wymiany), zacznie zabijać procesy i dokładnie to się tutaj wydarzyło. Wygląda na to, że
mysqld
zużywał ponad 2 GB pamięci wirtualnej.Ile pamięci RAM i wymiany ma system? Rozważę dodanie dodatkowej pamięci RAM lub, jeśli to niemożliwe, dodanie dodatkowej wymiany. Jako szybką poprawkę, która przynajmniej zapobiegnie zakończeniu procesów, możesz dodać plik wymiany.
Aktualizacja: Patrząc na ilość pamięci RAM, możesz od razu zobaczyć problem. Masz ~ 1,6 GB pamięci RAM i 100 MB wymiany, ale MySQL zużywa znacznie więcej pamięci RAM niż to. To wyjaśnia, dlaczego procesy są kończone.
źródło
total used free shared buffers cached Mem: 1655 934 721 0 10 52 -/+ buffers/cache: 871 784 Swap: 109 6 103
jest to wyjście pamięci w tym samym czasie, gdy proces został zabity