Staram się dostosować mój system programistyczny do maksymalnej niezawodności. Wyłączyłem swap, ponieważ w przypadku użycia GUI powoduje to, że maszyna przestaje reagować w taki sposób, że nie jest już dłużej użyteczna. Niemniej jednak, jeśli agresywne aplikacje pochłaniają pamięć, wydaje się, że niektóre mechanizmy wykorzystują to, aby maksymalnie wykorzystać koszt szybkości. Nie ma operacji wymiany dysku twardego, ale system również przestaje reagować. Chcę więc pozwolić, aby zabójca OOM uruchomił się, zanim system podejmie jakiekolwiek specjalne wysiłki w celu zwiększenia pamięci. Czy można skonfigurować zabójcę OOM do działania, jeśli na przykład jest mniej niż 100 MB wolnej pamięci fizycznej?
linux-kernel
memory-management
dronus
źródło
źródło
Odpowiedzi:
Walczyłem również z tym problemem. Chcę tylko, aby mój system pozostał responsywny, bez względu na wszystko, i wolę tracić procesy niż czekać kilka minut. Wydaje się, że nie ma sposobu na osiągnięcie tego przy użyciu narzędzia do zabijania jądra.
Jednak w przestrzeni użytkownika możemy robić, co chcemy. Napisałem więc demona Early OOM ( https://github.com/rfjakob/earlyoom ), który zabije największy proces (przez RSS), gdy dostępna pamięć RAM spadnie poniżej 10%.
Bez wczesnej przerwy można łatwo zablokować maszynę (8 GB pamięci RAM), uruchamiając http://www.unrealengine.com/html5/ kilka razy. Teraz winne karty przeglądarki giną, zanim sprawy wymkną się spod kontroli.
źródło
earlyoom
teraz, sprawdza się w pierwszym teście wyzwalania. Zastanawiam się tylko, dlaczego nie można tego zaimplementować za pomocą konfiguracji jądra lub narzędzi systemowych.Domyślną zasadą jądra jest zezwalanie aplikacjom na alokowanie pamięci wirtualnej tak długo, jak jest wolna pamięć fizyczna. Pamięć fizyczna nie jest faktycznie używana, dopóki aplikacje nie dotkną przydzielonej pamięci wirtualnej, więc aplikacja może przydzielić znacznie więcej pamięci niż system, a następnie rozpocząć dotykanie jej później, powodując brak pamięci w jądrze i wyzwolenie pamięci zabójcy pamięci (OOM). Zanim jednak proces zatrzymania został zabity, spowodował opróżnienie pamięci podręcznej dysku, co powoduje, że system reaguje przez chwilę, dopóki pamięć podręczna się nie zapełni.
Możesz zmienić domyślną zasadę, aby nie zezwalać na nadmierną pamięć, zapisując wartość 2 na
/proc/sys/vm/overcommit_memory
. Domyślna wartość/proc/sys/vm/overcommit_ratio
to 50, więc jądro nie pozwoli aplikacjom na przydzielenie więcej niż 50% ram + swap. Jeśli nie masz wymiany, jądro nie zezwoli aplikacjom na przydzielenie więcej niż 50% pamięci RAM, pozostawiając pozostałe 50% wolnej pamięci podręcznej. Może to być nieco przesadne, więc możesz zwiększyć tę wartość, powiedzmy, o 85%, aby aplikacje mogły przydzielić do 85% pamięci RAM, pozostawiając 15% na pamięć podręczną.źródło
I disabled swap, because for GUI usage it mostly renders the machine unresponsive in such a way not useable anymore.
. Wspomniał o GUI, a ty zakładasz, że wykonuje polecenie. Kupowanie większej ilości pamięci to pierwsze rozwiązanie, a samodzielne korzystanie z mniejszej ilości pamięci to drugie rozwiązanie, powodujące niestabilność systemu przez majstrowanie przy stabilnych ustawieniach domyślnych to ostatnie rozwiązanie. Na pytanie nie trzeba odpowiadać dosłownie, więc nie rozumiem, na czym polega problem, że musicie niepokoić nas oboje w komentarzach. Rant nie pomaga .../proc/meminfo
” sCommitted_AS
stanach. Przy niektórych uruchomionych aplikacjach wartość ta z łatwością przekracza pamięć fizyczną, dlatego trudno jest ustalić przez to wykonalny limit.Dla mnie ustawienie vm.admin_reserve_kbytes = 262144 robi dokładnie to samo. OOM Killer interweniuje, zanim system całkowicie przestanie odpowiadać.
źródło
Inne odpowiedzi mają dobre automatyczne rozwiązania, ale uważam, że pomocne może być również włączenie
SysRq
klucza, gdy sprawy wymykają się spod kontroli. Za pomocąSysRq
klucza możesz ręcznie wysyłać wiadomości do jądra i możesz robić takie rzeczy, jak bezpieczny restart (zSysRQ + REISUB
), nawet jeśli przestrzeń użytkownika została całkowicie zamrożona.Aby jądro
kernel.sysrq = 1
mogło nasłuchiwać żądań, ustaw lub włącz tylko funkcje, których prawdopodobnie będziesz używać z maską bitową ( tutaj udokumentowane ). Na przykładkernel.sysrq = 244
włączy wszystkie kombinacje potrzebne do bezpiecznego ponownego uruchomienia powyżej, a także ręczne wywołanie zabójcy OOM za pomocąSysRq + F
.źródło
Niezawodność nie jest osiągana przy niskim poziomie pamięci i zabójcy OOM.
Błędem jest organizowanie imprezy w szafie i umieszczanie „czyszczenia mojej szafy” na małej liście odtwarzania.
Spowoduje to niezamierzone skutki uboczne, ponieważ nie masz kontroli nad tym, co zostanie zabite.
Maksymalna niezawodność polega na testowaniu systemu i ulepszaniu systemu na podstawie tych testów.
Po prostu poprawianie losowych rzeczy nigdzie cię nie doprowadzi ...
Z powodu niskiego poziomu pamięci wyłączenie wymiany nie poprawi zachowania , robi odwrotnie .
Aby zwiększyć niezawodność w tej sytuacji, dodaj więcej pamięci, aby system był bardziej responsywny i nie było zabijania przypadkowych procesów bez intencji użytkownika. Nie powinieneś uciekać się do warunków niskiej pamięci i takiego mechanizmu, szczególnie nie w środowisku programistycznym ...
Niskie warunki pamięci rzeczywiście powodują brak reakcji, niezależnie od tego, czy masz zamianę, czy nie.
Specjalne wysiłki, które przyniosą więcej szkody niż pożytku, jak wyjaśniłem powyżej. Zamiast tego możesz zabijać procesy, których sam nie potrzebujesz, ale myślę, że nie możesz tego zrobić, więc OOM zabije procesy, których potrzebujesz.
Być może, ale zyskujesz wyższy zwrot z inwestycji, jeśli kupisz dodatkową pamięć, która w dzisiejszych czasach nie kosztuje dużo. Zastanów się, czy na dłuższą metę uderzysz się w stopę, jeśli będziesz kontynuować pracę w warunkach niskiej pamięci. OOM jest jak komornik, nie pomaga, pomaga OS ...
źródło
kill
ślepo wpisany tekst .