OOM Killer nie działa poprawnie, prowadzi do zawieszonego systemu operacyjnego


23

Przez lata zabójca OOM mojego systemu operacyjnego nie działa poprawnie i prowadzi do zawieszenia systemu.
Kiedy użycie pamięci jest bardzo duże, cały system ma tendencję do „zamrażania” (w rzeczywistości: staje się bardzo wolny) przez godziny lub nawet dni , zamiast zabijania procesów w celu zwolnienia pamięci.
Maksymalne, które zarejestrowałem, to 7 dni przed rezygnacją z operacji resetowania.
Kiedy OOM ma zostać osiągnięty, iowait jest bardzo, bardzo wysoki (~ 70%), zanim staje się niemożliwy do zmierzenia.
Narzędzie: iotopwykazało, że każdy program odczytuje z mojego dysku twardego bardzo dużą przepustowość (na dziesiątki MB / s).
Co czytają te programy?
- Hierarchia katalogów?
- Sam kod wykonywalny?
Nie do końca teraz.

[edytuj] W tym czasie, kiedy pisałem ten komunikat (w 2017 r.), korzystałem z zaktualizowanego ArchLinux (4.9.27-1-lts), ale problem ten występował już wiele lat wcześniej.
Wystąpił ten sam problem z różnymi dystrybucjami Linuksa i różnymi konfiguracjami sprzętowymi.
Obecnie (2019) używam zaktualizowanego Debiana 9.6 (4.9.0) Mam 16 GB pamięci RAM, dysk SSD, na którym jest zainstalowany mój system operacyjny, a nie żadną partycję wymiany .

Z powodu ilości pamięci RAM, którą mam, nie chcę włączać partycji wymiany, ponieważ opóźniłoby to pojawienie się problemu.
Ponadto zbyt częsta zamiana dysków SSD może potencjalnie skrócić żywotność dysku.
Nawiasem mówiąc, próbowałem już z partycją wymiany i bez niej, okazało się, że opóźnia to pojawienie się problemu, ale nie jest rozwiązaniem.

Dla mnie problem jest spowodowany tym, że Linux upuszcza niezbędne dane z pamięci podręcznych , co prowadzi do zamrożenia systemu, ponieważ musi on odczytywać wszystko za każdym razem z dysku twardego.

Zastanawiam się nawet, czy Linux nie upuściłby wykonywalnych stron kodowych uruchomionych programów, co tłumaczyłoby, dlaczego programy, które zwykle nie czytają dużo danych, zachowują się w ten sposób.

Próbowałem kilku rzeczy, aby rozwiązać ten problem.
Jeden zestaw miał /proc/sys/vm/min_free_kbytesna 1000000(1 GB).
Ponieważ ten 1 GB powinien pozostać wolny, pomyślałem, że ta pamięć zostanie zarezerwowana przez Linuksa do buforowania ważnych danych.
Ale to nie zadziałało.

Ponadto uważam, że warto dodać, że nawet jeśli mogłoby to brzmieć świetnie w teorii, ograniczając rozmiar pamięci wirtualnej do rozmiaru pamięci fizycznej, określając, /proc/sys/vm/overcommit_memoryże 2nie jest to technicznie możliwe w mojej sytuacji, ponieważ tego rodzaju aplikacje którego używam, wymagają więcej pamięci wirtualnej niż z pewnych powodów efektywnie wykorzystują.
Z akt sprawy wynika /proc/meminfo, Commited_ASwartość jest często wyższa niż podwójna fizycznej pamięci RAM w moim systemie (16 GB, Commited_AS często> 32 GB).

Wystąpił ten problem z /proc/sys/vm/overcommit_memoryjego wartością domyślną: 0i przez pewien czas go zdefiniowałem: 1ponieważ wolałem, aby programy były zabijane przez zabójcę OOM niż zachowywały się źle, ponieważ nie sprawdzają zwracanych wartości, mallockiedy przydziały są odrzucane.

Kiedy mówiłem o tym problemie na IRC , spotkałem innych użytkowników Linuksa, którzy doświadczyli tego samego problemu, więc myślę, że wielu użytkowników jest tym zaniepokojonych.
Dla mnie jest to niedopuszczalne, ponieważ nawet Windows lepiej radzi sobie z wysokim zużyciem pamięci.

Jeśli potrzebujesz więcej informacji, napisz sugestię, proszę mi powiedzieć.

Dokumentacja:
https://en.wikipedia.org/wiki/Thrashing_%28computer_science%29
https://en.wikipedia.org/wiki/Memory_overcommitment
https://www.kernel.org/doc/Documentation/sysctl/vm. txt
https://www.kernel.org/doc/Documentation/vm/overcommit-accounting
https://lwn.net/Articles/317814/

Mówią o tym:
Dlaczego zabójca braku pamięci w systemie Linux (OOM) nie działa automatycznie, ale działa na kluczu sysrq?
Dlaczego zabójca OOM czasami nie udaje się zabić wieprzy zasobów?
Wstępne ładowanie OOM Killera
Czy można uruchomić OOM- Killera przy wymuszonej zamianie?
Jak uniknąć dużych opóźnień w pobliżu sytuacji OOM?
https://lwn.net/Articles/104179/
https://bbs.archlinux.org/viewtopic.php?id=233843


1
Myślę, że tego należy się spodziewać, jeśli grasz w thrash, ale tak naprawdę nie zbliżasz się do 100% „zużytej”, tj. Jest zbyt duże zużycie pamięci, które jest wspierane przez plik, liczone jako „buff / cache”. (Fuj, zakłada się, że alokacje tmpfs są trywialne, ponieważ są wyświetlane jako „buff / cache”, ale nie można ich przypisać do fizycznego systemu plików). min_free_kbytesnie ma znaczenia, nie jest rezerwą dla stron w pamięci podręcznej. AFAICT żaden z systemów vm nie pozwala na rezerwowanie pamięci specjalnie dla stron buforowanych, tj. Ograniczenie przydziałów MAP_ANONYMOUS :(.
sourcejedi

2
Od lat szukam rozwiązania tego konkretnego problemu bez powodzenia. Wydaje mi się, że po raz pierwszy zauważyłem problem po wymianie dysku twardego na dysk SSD, co również pociągnęło za sobą całkowite wyłączenie zamiany, ale nie mogę zagwarantować, że nigdy nie nastąpiło to przed tymi zmianami, więc może być niezwiązany. Jestem na Archlinux btw.
brunocodutra

2
Właśnie napisałem o tym na forach Arch Linux .
Ignat Insarov

1
@ dsstorefile1 Dziękuję, spróbuję tego. Ale w jaki sposób może to wywołać zabójcę OOM na pewno, gdy jądro w tej sytuacji nie może zrobić tego poprawnie?
M89

1
Pomogło, gdy Chromeowi udało się przeciekać przez całą moją pamięć RAM ... (Chociaż ostatecznie dodałem również rzeczywistą partycję wymiany dysku i ostatecznie zaktualizowałem do przyzwoitej ilości pamięci RAM)
Gert van den Berg

Odpowiedzi:


5

Znalazłem dwa wyjaśnienia (tego samego), dlaczego kswapd0 robi ciągły odczyt dysku, dzieje się na długo zanim OOM-killer zabije obrażający proces:

  1. zobacz odpowiedź i komentarz do tej odpowiedzi askubuntu SE
  2. zobacz odpowiedź i komentarze Davida Schwartza do tej odpowiedzi na unix SE

Przytoczę tutaj komentarz z 1., który naprawdę otworzył mi oczy, dlaczego ciągle czytałem dysk, gdy wszystko było zawieszone :

Rozważmy na przykład przypadek, w którym nie ma wymiany, a systemowi prawie brakuje pamięci RAM. Jądro pobierze pamięć np. Z przeglądarki Firefox (może to zrobić, ponieważ Firefox uruchamia kod wykonywalny, który został załadowany z dysku - w razie potrzeby kod można załadować ponownie z dysku). Jeśli Firefox musi ponownie uzyskać dostęp do tej pamięci RAM N sekund później, procesor generuje „twardy błąd”, który zmusza Linuksa do zwolnienia pamięci RAM (np. Zabrania pamięci RAM z innego procesu), załadowania brakujących danych z dysku, a następnie umożliwienia Firefoxowi kontynuowania działania jako zwykły. Jest to dość podobne do normalnej zamiany i robi to kswapd0. - Mikko Rantalainen 15 lutego o 13:08

Jeśli ktoś ma sposób, jak wyłączyć to zachowanie (być może zrekompilować jądro za pomocą jakich opcji? ), Daj mi znać jak najszybciej! Bardzo dziękuję, dziękuję!

UPDATE: Jedynym sposobem znalazłem dotąd jest poprzez łatanie jądra, a to działa na mnie ze swapu niepełnosprawnych (tj. CONFIG_SWAP is not set, Ale nie działa dla innych, ze zamiana włączona it) wydaje ; zobacz łatkę w tym pytaniu.


Proszę usunąć tekst, który nie jest prawidłowy. Nie oznaczaj edycji tekstem „EDYCJA”. Są oczywiste z historii zmian .
Kusalananda

1
@Kusalananda Ten użytkownik powinien być zachęcany, ponieważ prawdopodobnie to on wniósł największy wkład.
M89

@Kusalananda Myślałem, że ważne jest, aby je zachować, aby inni mogli zobaczyć, co (jeszcze) próbowano i nie działało. Być może UPDATEzamiast EDITbyłoby lepiej?

@MarcusLinsner Nie, przepraszam, źle zrozumiałeś. Pokazuje to, czego próbowaliśmy to, co robisz, kiedy poprosić pytanie. Odpowiedź powinna być prawidłowa na pytanie, jak to jest obecnie postawione. To znaczy, jedna edycja prosi nawet czytelnika o zignorowanie poprzednich edycji . Jeśli chcesz zobaczyć historię edycji, możesz ją zobaczyć tutaj .
Kusalananda

0

memory.minParametr w cgroups-v2kontrolerze pamięci powinno pomóc.

Mianowicie pozwól mi zacytować:

Ochrona twardej pamięci. Jeśli użycie pamięci grupy cgroup mieści się w jej efektywnej minimalnej granicy, pamięć grupy cgroup nie zostanie odzyskana pod żadnym warunkiem. Jeśli nie ma dostępnej niechronionej pamięci do odzyskania, wywoływany jest OOM Killer.

Źródło: https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html


Czy mógłbyś opracować proszę? Twoja odpowiedź jest nieco krótka w udzieleniu odpowiedzi na pytanie OP.
Paradoks
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.