Mam eeePC 900a: ma 8 GB pamięci flash jako dysk i tylko 1 GB pamięci RAM. Zainstalowana na nim dystrybucja Linuksa to ArchLinux.
Kiedy systemowi zabraknie pamięci, staje się on wyjątkowo niereagujący: zajmuje kilka sekund / minut, aby wykonać takie czynności, jak przejście do TTY1 lub nawet przesunięcie wskaźnika myszy. Czasami wygląda na to, że system się zawiesza: trzy nasze dawno temu zostawiłem go w spokoju i jak dotąd nic się nie zmieniło.
Wolałbym unikać tworzenia partycji / pliku wymiany na tym eeePC, ponieważ dysk jest już tak mały, a także dlatego, że wiele zapisów na przestrzeni wymiany znacznie skróciłoby żywotność karty flash. Co więcej, myślę, że plik / partycja wymiany po prostu przeniósłby problem, zamiast zdecydowanie go naprawić.
Czy jądro nie powinno zabijać losowych aplikacji, gdy zabraknie pamięci? Dlaczego to się nie udaje (lub zajmuje wieki)?
Kilka miesięcy / lat temu próbowałem już przyjrzeć się temu, ale nie mogłem znaleźć niczego, co faktycznie działałoby ...
while(true){ if( $FREE_MEMORY<10MB ){ kill -9 $RANDOM_PID; } }
. To zdecydowanie rozwiązałoby mój problem. Ale czekaj, czy jądro nie powinno tego robić (i to w znacznie lepszy sposób niż mój skrypt)? Dlaczego nie spełnia swojej roli?Odpowiedzi:
Możliwe jest wywoływanie OOM-Killera (poza pamięcią) bezpośrednio przez kombinację klawiszy:
SysRq-F
Klawisz SysRq jest zwykle łączony z klawiszem PrtSc na klawiaturze.
OOM-killer zabija niektóre procesy (-es) i system ponownie reaguje.
Dzięki Raman za porady na temat tej funkcji w komentarzach powyżej.
PS: To mi bardzo pomogło. Zgadzam się z opinią, że jest to najbardziej przydatna porada na temat tego problemu, jeśli jest spowodowany przez Chrome lub inne chciwe oprogramowanie pamięci. Ale musisz pamiętać, że zabójca OOM może zabić jakiś naprawdę ważny proces, używaj go ostrożnie.
źródło
PrtScn|SysRq
. Ale naciśnięcieSysRq - F
powoduje tylko zrzut ekranuNaturalnym stanem rzeczy jest to, że dane aplikacji znajdują się w pamięci RAM, a pliki są na dysku.
Idealnym stanem, pod względem wydajności, jest to, że często używane dane znajdują się w pamięci RAM, a dane, które w tej chwili nie są potrzebne, znajdują się na dysku.
W normalnym systemie jądro robi dwie rzeczy, aby osiągnąć ten ideał:
W typowym systemie znaczna część pamięci RAM jest przeznaczona na pamięć podręczną i bufory (50% to typowa liczba). Ponieważ pamięć RAM jest zasobem skończonym, może to wymagać przesunięcia niektórych danych aplikacji do wymiany (zamiana jest konieczna tylko wtedy, gdy istnieje lepszy sposób korzystania z pamięci RAM).
W systemie bez zamiany jest taki moment, że dane aplikacji używają prawie całej pamięci RAM, więc nie ma już prawie miejsca na pamięć podręczną. Wtedy system będzie prawdopodobnie wolny. Jądro nie zacznie zabijać aplikacji, dopóki nie będzie musiało. Tak długo, jak aplikacje wypełniają tylko 99% dostępnej pamięci, system działa, ale bardzo powoli, ponieważ dane plików muszą być ładowane i ponownie ładowane z dysku przez cały czas. Przy tych samych aplikacjach system byłby szybszy z wymianą w tym momencie.
Aby uzyskać więcej informacji na ten temat, zobacz dyskusję lkml i ten post na blogu .
Nie znam bezpośredniego sposobu poinformowania jądra o zarezerwowaniu minimalnej ilości pamięci RAM na pamięć podręczną dysku. Możesz ustawić małą część pamięci RAM jako przestrzeń wymiany , być może nawet skompresowaną . Istnieją doniesienia o sukcesie na tym froncie , ale nie udzielam żadnych gwarancji w konkretnym przypadku.
źródło
ld
, śmieciu), nadal zawiesza się przez prawie minutę, budząc się na tyle, że mogę na chwilę poruszyć niesamowicie opóźnioną myszą lub dwa co kilka sekund. Obsługa OOM w Linuksie to bzdura. Jeśli mam szczęście, zabójca OOM zabija właściwy proces, nie psując całkowicie środowiska pulpitu. Jestem wielkim fanem Linuksa. Jest znacznie gorzej z włączonym stronicowaniem. Stronicowanie Linuksa to żart.Jest to znany błąd od 2007 r. - zobacz Zatrzymywanie systemu w przypadku dużego zużycia pamięci .
W tej sytuacji system Windows wyświetla okno dialogowe ostrzegające użytkownika o zamknięciu jednej lub więcej aplikacji.
źródło
Ostatnio znalazłem rozwiązanie mojego problemu.
Ponieważ Linux OOM Killer nie jest w stanie poprawnie wykonywać swojej pracy, zacząłem używać OOM Killer w przestrzeni użytkownika: wcześnie . Jest napisany w C, dość konfigurowalny i działa jak urok dla mnie.
Słyszałem również o niektórych alternatywach, takich jak OOMD Facebooka , opracowanych do działania na ich serwerach, ale nie próbowałem tego
źródło