Zapobiegaj zawieszaniu się Ubuntu, nawet jeśli pamięć systemowa jest niska

24

Czasami pracuję z dużymi zrzutami danych, które chcę zachować w pamięci do przetwarzania. Czasami przeliczyłem ilość pamięci, którą wytworzy mój program, lub debugger zwielokrotnia użycie pamięci przez czynnik, który przekracza moją dostępną pamięć.

Ilekroć zaczynam proces wymagający dużej ilości pamięci, tego właśnie oczekuję od rozsądnego systemu operacyjnego: spróbuj zjeść całą wolną pamięć, a następnie poproś o inne nieistotne procesy, aby zrezygnować z pamięci, której nie potrzebują, a następnie napisz do zamiany.

Oto, co robi dla mnie Ubuntu: zjedz całą wolną pamięć, następnie poproś system operacyjny o zamianę wszystkich niezbędnych usług (sesja gnome, terminal, klawiatura), a następnie zamrożenie i poczekaj, aż wyciągnę wtyczkę.

Dwa pytania:

  1. Jak system operacyjny może założyć, że wszystko może być tak ważne, że można przestać słuchać informacji wprowadzanych przez użytkownika?
  2. Jak mogę powiedzieć Ubuntu, aby nigdy nie zamieniał podstawowych usług i zawsze reagował na dane wejściowe użytkownika, nawet jeśli jakiś głupi proces próbuje zużyć więcej zasobów niż zapewnia system.
Klamann
źródło
Ile masz zainstalowanej pamięci RAM? Jaki rozmiar ma Twoja zamiana (w terminalu, wpisz, swaponaby się dowiedzieć)? Pozdrawiam, Al
heynnema,
3
16 GB pamięci RAM i 16 GB wymiany. Ale nie o to tutaj chodzi, tego problemu nie można rozwiązać, dodając więcej pamięci.
Klamann
1
Spróbuj jednej z dwóch rzeczy. 1) zmień swappinessustawienie na 10, tj .: vm.swappiness = 10w /etc/sysctl.conf. Wyszukaj tutaj swapiness, aby uzyskać więcej informacji na ten temat. 2) Jeśli zamiana nie pomoże ... Nawet jeśli nie chcesz ... zwiększyć rozmiaru pliku wymiany do 1,5x16G i sprawdź, czy to pomoże. Informuj mnie na bieżąco. Pozdrawiam, Al
heynnema,
1
@Klamann Zgadzam się, że dodanie większej ilości wymiany nie rozwiąże problemu. Gdy masz zepsuty program, który zużywa całą pamięć RAM + SWAP, dodanie dodatkowego SWAP opóźnia nieuniknione.
WinEunuuchs2Unix
1
@ WinEunuuchs2Unix, jak powiedziałem, vm.swappiness=10musi zostać DODANO do sysctl.conf. Doświadczona osoba może nawet użyć komendy sysctl w locie, aby ustawić vm.swappiness = 10, bez edytowania pliku sysctl.conf. Pozdrawiam, Al ps: czekam na odpowiedź OP.
heynnema

Odpowiedzi:

5

Nadal nie mam rozwiązania problemu, ale mogę zaoferować dwa obejścia, które mogą zainteresować innych:

1) wcześnie

Jest to usługa, która obserwuje zużycie pamięci i zabija proces, który zużywa najwięcej pamięci po osiągnięciu określonego progu (zobacz także to i to pytanie dotyczące zabójcy OOM w jądrze Linuksa)

Przetestowałem to w procesie demonstracyjnym, który w nieskończoność żąda pamięci w małych porcjach. Oto moje pierwsze wrażenie: kiedy rozpoczynam nieuczciwy proces, szybko zjada całą moją pamięć RAM. Następnie rozpoczyna się zamiana, system przestaje odpowiadać. Kilka sekund później system powraca do trybu online. Dziennik wczesnej fazy pokazuje, że zabił proces jedzenia pamięci po tym, jak użycie pamięci i wymiany osiągnęło 90%.

Wciąż zaczyna się irytujące opóźnienie, a po zakończeniu procesu niektóre części innych procesów zwykle pozostają w swapie, dopóki nie zostaną o to poproszone, ale to początek.

2) po prostu wyłącz swap

Wiem, że jest to kontrowersyjny temat , ale w przypadku komputerów stacjonarnych, a zwłaszcza komputerów programistycznych, w których może się zdarzyć, że proces próbuje pochłonąć całą twoją pamięć, ma to sens: bez zamiany OOM Killer po prostu działa jak zamierzono. Kiedy zabraknie pamięci, znajdzie najlepszy proces do zabicia i pozbędzie się go. Bez opóźnień, bez opóźnień.

Możesz wyłączyć swap dla bieżącej sesji za pomocą sudo swapoff -alub zmienić na stałe .


Właściwym rozwiązaniem tego problemu byłoby oczywiście to, że system pozostaje responsywny, gdy pamięć główna jest wyczerpana i zaczyna wymieniać pamięć, jakby nie było jutra, ale wydaje się, że to się wkrótce nie wydarzy.

Klamann
źródło
1
Wyłączyłem swap i mój system przechodzi od niskiej pamięci (<100 MB) do zamrożenia. Jak mogę sprawdzić, czy zabójca OOM jest właściwie włączony?
Michael
0

Spróbuj jednej z dwóch rzeczy:

1) zmień ustawienie swapiness z domyślnego 60, na 10, tj .: dodaj vm.swappiness = 10 do /etc/sysctl.conf (w terminalu, typ sudo gedit /etc/sysctl.conf), a następnie uruchom ponownie system. Wyszukaj tutaj swapiness, aby uzyskać więcej informacji na ten temat.

2) Jeśli zamiana nie pomoże ... nawet jeśli nie chcesz ... zwiększyć rozmiaru pliku wymiany do 1,5x16G i sprawdź, czy to pomoże.

Informuj mnie na bieżąco. Pozdrawiam, Al

heynnema
źródło
Skonfigurowałem maszynę wirtualną do uruchamiania niektórych testów, ponieważ ponowne uruchamianie systemu operacyjnego co kilka sekund stało się naprawdę denerwujące. Ubuntu 16.04, 2 GB pamięci RAM, 3 GB wymiany, dysk 20 GB Następnie uruchomiłem skrypt, który zużywa dużo pamięci: przy domyślnej zamianie (60) system zawiesza się i po kilku minutach wyłączam go, ponieważ czas na odzyskanie jest niedopuszczalny. W przypadku swapiness 10 system zawiesza się na kilka sekund, a następnie przyjmuje dane wejściowe, ale nie można uruchomić żadnych procesów (np. W topcelu zabicia pamięci pamięci). Po minucie proces zostaje zabity. Nie idealnie, ale zbliżamy się.
Klamann
Informuj nas. Maszyna wirtualna nie będzie naśladować twojego prawdziwego działającego systemu operacyjnego, ale pozwoli ci grać z ustawieniami. Będę ciekawy, czy zamiana pomaga w rozwiązaniu problemu. Na zdrowie, Al
heynnema,
Ach, dobrze. Postęp! Przeczytaj trochę o swapiness. Możesz trochę zagrać z tą wartością. Pozdrawiam, Al
heynnema,
Ile wymiany użyto, gdy system zamarł? Pozdrawiam, Al
heynnema,
2
dlaczego w tym sens? więcej pamięci nie zapobiegnie blokowaniu się systemu, jeśli również zasysam tę pamięć.
Klamann,
0

Rozwiązałem podobny problem. Nie wiem, czy moje doświadczenie może ci się przydać ...

Niedawno opublikowałem przewodnik na temat instalacji systemu Linux na sprzężonych sprzężeniach zwrotnych urządzeniach LVM uruchamianych z USB (więc bez konieczności instalowania gruba na dysku wewnętrznym, pozostawiając go jako oryginalny). Oto przewodnik: https://github.com/DareDevil73/linux-on-loopback-usb .

Potem wpadłem w problem zamrożenia przy dużym obciążeniu pamięci i zaobserwowałem nieprawidłowe użycie przestrzeni wymiany (zużycie całej pamięci RAM i zużycie wymiany prawie do zera). Oczywiście partycja wymiany LVM została zamontowana i działa poprawnie, ale nie wiem, dlaczego jądro nie używało jej zgodnie z oczekiwaniami.

Próbowałem alternatywnego rozwiązania. Utworzyłem plik zwrotnej wymiany (nie LVM) i zamrażanie zniknęło. Teraz plik wymiany jest używany tak, jak byłby, a system operacyjny nigdy się nie zawiesza!

Więcej informacji znajdziesz na https://github.com/DareDevil73/linux-on-loopback-usb#known-issues .

Antonio Petricca
źródło
Rozwiń łącza do odpowiedzi.
Konrad Gajewski