Z tego co rozumiem, kiedy system jest blisko i nie ma wolnej pamięci, jądro powinno zacząć zabijać procesy, aby odzyskać trochę pamięci. Ale w moim systemie tak się wcale nie dzieje.
Załóżmy, że prosty skrypt, który po prostu przydziela znacznie więcej pamięci niż dostępna w systemie (na przykład tablica zawierająca miliony ciągów znaków). Jeśli uruchomię taki skrypt (jako zwykły użytkownik), po prostu pobierze całą pamięć, aż system całkowicie się zawiesi (działa tylko SysRQ REISUB).
Dziwne jest to, że gdy komputer zawiesza się, dioda dysku twardego włącza się i pozostaje tak do momentu ponownego uruchomienia komputera, czy mam zamontowaną partycję wymiany, czy nie!
Więc moje pytania to:
- Czy to zachowanie jest normalne? Dziwne, że aplikacja wykonana jako zwykły użytkownik może po prostu zawiesić system w ten sposób ...
- Czy jest jakiś sposób, aby zmusić Ubuntu do automatycznego zabijania tych aplikacji, gdy mają za dużo (lub najwięcej) pamięci?
Dodatkowe informacje
- Ubuntu 12.04.3
- Jądro 3.5.0-44
RAM: ~ 3,7 GB z 4 GB (współdzielone z kartą graficzną). *
$ tail -n+1 /proc/sys/vm/overcommit_* ==> /proc/sys/vm/overcommit_memory <== 0 ==> /proc/sys/vm/overcommit_ratio <== 50 $ cat /proc/swaps Filename Type Size Used Priority /dev/dm-1 partition 4194300 344696 -1
tail -n+1 /proc/sys/vm/overcommit_*
i dodaj wynik. Zobacz także tutaj: Jak skonfigurować oom-Allocation failed
). Ale bez zamiany po prostu zawiesza komputer. Ma to działać w ten sposób (zabijać tylko przy użyciu wymiany)?Odpowiedzi:
Z oficjalnej
/proc/sys/vm/*
dokumentacji :Aby podsumować, podczas ustawiania
oom_kill_allocating_task
się1
, zamiast skanowanie systemu szuka procesów zabijać, który jest kosztowny i powolny zadanie, jądro będzie po prostu zabić proces powodujący, że system wyjść z pamięci.Z moich własnych doświadczeń wynika, że po uruchomieniu OOM jądro nie ma już wystarczającej „siły” do wykonania takiego skanowania, dzięki czemu system jest całkowicie bezużyteczny.
Bardziej oczywiste byłoby po prostu zabicie zadania, które spowodowało problem, więc nie rozumiem, dlaczego jest ustawione
0
domyślnie.Aby przetestować, możesz po prostu napisać w odpowiednim pseudo-pliku
/proc/sys/vm/
, który zostanie cofnięty przy następnym uruchomieniu:Dla stałej poprawki, napisać następujące do
/etc/sysctl.conf
lub do nowego pod pliku/etc/sysctl.d/
, z.conf
rozszerzeniem (/etc/sysctl.d/local.conf
na przykład):źródło
0
domyślnie”. - ponieważ proces, który zażądał pamięci, niekoniecznie musi być tym, który „spowodował problem”. Jeśli proces A zajmie 99% pamięci systemu, ale proces B, który wykorzystuje 0,9%, zdarza się być tym, który uruchamia zabójcę OOM przez nieszczęście, B nie „powoduje problemu” i nie ma sensu kill B. Posiadanie tego, ponieważ polityka grozi całkowitym bezproblemowym zabiciem procesów o niskiej pamięci przez przypadek z powodu niekontrolowanego użycia pamięci przez inny proces.vm.admin_reserve_kbytes
zostanie zwiększony do, powiedzmy, 128 MB . Ustawienievm.oom_kill_allocating_task = 1
wydaje się łagodzić problem, tak naprawdę go nie rozwiązuje (a Ubuntu już domyślnie zajmuje się bombami widełkowymi).sudo sysctl -w vm.oom_kill_allocating_task=1
Aktualizacja: Błąd został naprawiony.
Odpowiedź Teresy wystarczy, aby obejść problem i jest dobra.
Dodatkowo, zgłosiłem raport o błędzie, ponieważ jest to zdecydowanie zepsute zachowanie.
źródło
Możesz spróbować wcześnie , zabójca OOM, który działa w przestrzeni użytkownika i próbuje zabić największy proces w sytuacji OOM.
źródło
Przede wszystkim polecam aktualizację do 13.10 (czysta instalacja, zapisz dane).
Jeśli nie chcesz aktualizować, zmień vm.swappiness na 10 i jeśli napotkasz problemy z ram, zainstaluj ZRAM.
źródło
vm.swappiness
powoduje więcej szkody niż pożytku, a nawet więcej w systemach cierpiących na problemy z niską pamięcią.