Dzisiaj (przypadkowo) uruchomiłem jakiś program na moim Linux-ie, który szybko zużył dużo pamięci. Mój system zamarł, przestał reagować i dlatego nie byłem w stanie zabić sprawcy.
Jak mogę temu zapobiec w przyszłości? Czy nie może przynajmniej utrzymać responsywnego rdzenia lub czegoś uruchomionego?
Odpowiedzi:
Założę się, że system tak naprawdę nie „zawiesił się” (w tym sensie, że jądro się zawiesiło), ale raczej bardzo nie reagował. Możliwe, że po prostu zmienił się bardzo mocno, powodując, że wydajność interaktywna i przepustowość systemu spadły jak kamień.
Państwo mogłoby wyłączyć swapa, ale to tylko zmienia problem z niską wydajność w procesach OOM zabite (i wszystkie zabawy, które przyczyn), wraz ze spadkiem wydajności z powodu mniej dostępnej pamięci podręcznej dysku.
Alternatywnie, możesz użyć limitów zasobów na proces (zwykle określanych jako
rlimit
i / lubulimit
), aby wyeliminować możliwość, że pojedynczy proces zajmie absurdalnie dużo pamięci i spowoduje zamianę, ale to po prostu popycha cię do rozrywkowego terytorium procesami, które giną w niewygodne chwile, ponieważ chcieli trochę więcej pamięci, niż system był w stanie im dać.Jeśli wiedziałeś, że zamierzasz zrobić coś, co może spowodować ogromne zużycie pamięci, prawdopodobnie możesz napisać program opakowujący, który wykonał,
mlockall()
a następnie uruchomił powłokę; utrzymałoby to w pamięci i byłoby najbliższą rzeczą, aby „zachować responsywny rdzeń”, który prawdopodobnie dostaniesz (ponieważ nie chodzi o to, że procesor jest nadmiernie wykorzystywany, to jest problem).Osobiście popieram metodę kontroli zasobów „nie rób głupot”. Jeśli masz uprawnienia roota, możesz wyrządzić wszelkiego rodzaju szkody w systemie, a więc robienie wszystkiego , czego nie znasz, jest ryzykownym przedsięwzięciem.
źródło
ulimit
lub nawet w dzisiejszych czasach, jeśli jesteś modnym młodzieńcem, robi to całkiem dobrze. Jeśli wprowadzasz zmiany w zapytaniach w środowisku produkcyjnym bez sprawdzania ich efektów w środowisku niekrytycznym, jest to główny problem.Jak wspomniano powyżej w komentarzu Tronic, możliwe jest wywołanie OOM-killera (poza pamięcią) bezpośrednio przez kombinację klawiszy SysRq- F.
SysRqKlawisz jest zwykle łączony w PrtScklawisz na klawiaturze.
OOM-killer zabija niektóre procesy (-es) i system ponownie reaguje. Bezpośredni dostęp do OOM-Killera może nie być domyślnie włączony, proszę sprawdź to pytanie, aby dowiedzieć się, jak sprawdzić jego status i / lub włączyć.
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
Jest to błąd znany 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
Jeśli masz ochotę ponownie skompilować jądro, możesz wypróbować łatkę z
EDIT
sekcji tego pytania: /programming//q/52067753/10239615Nie usuwa
Active(file)
stron podczas wysokiego ciśnienia pamięci, a zatem pozwala OOM-killerowi uruchamiać się niemal natychmiast, ponieważ jądro nie musi już spędzać minut ciągłego ponownego odczytu z dysku wszystkich wykonywalnych stron kodowych każdego procesu powodującego zawieszenie systemu operacyjnego.źródło
Jest to coś szczególnie trudnego do uniknięcia. To dlatego, że jądro zaczyna się zamieniać. Jednym z rozwiązań jest wyłączenie zamiany. Kiedy w systemie zabraknie pamięci, zamiast rozpocząć zamianę, jądro zabije niektóre procesy; zwykle wybiera właściwy proces do zabicia, ale i tak lepiej zabić proces losowy, niż mieć system nieodpowiadający.
Może to być szczególnie dobre rozwiązanie dla serwerów, ponieważ serwery często mają wystarczającą ilość pamięci RAM, a kiedy zaczynają używać przestrzeni wymiany, oznacza to, że coś jest nie tak. Jednak komputery stacjonarne zwykle potrzebują przestrzeni wymiany, więc myślę, że nie ma dobrego rozwiązania dla komputerów stacjonarnych. Często wyłączam przestrzeń wymiany na serwerach, szczególnie gdy istnieje podejrzenie wycieku pamięci.
źródło