Uważam, że nie jest to tak rzadki problem: jeden proces przydziela ogromne ilości pamięci (czy to z powodu błędu wycieku pamięci, ponieważ próbujesz przetworzyć niewiarygodnie duży plik wejściowy, lub cokolwiek innego). Pamięć RAM zapełnia się iw pewnym momencie Linux musi przełączyć się na wymianę. Czasami jest to tylko ostatnia deska ratunku: jeśli mam kosztowne obliczenia, nie chcę stracić danych, jeśli pod koniec zabraknie pamięci RAM.
Jednak częściej (z mojego doświadczenia) zużycie pamięci jest nieograniczone przez nieuczciwy, być może błędny proces. Tzn. Nie tylko skończyło się na tym, że niektóre mniej pilnie potrzebne dane zostały przeniesione do wymiany, ale system operacyjny jest zmuszony do panicznej wymiany ładunków danych. I to niestety nie tylko poważnie przerywa proces obrażania, ale może spowolnić cały system (nie jest już tak źle na komputerach z dyskiem SSD, ale OTOH martwi mnie, czy zapisywanie gigabajtów i gigabajtów danych na śmieci może długoterminowe uszkodzenie komórek flash).
Dopóki nie zauważę problemu i nie zakończę ręcznie procesu (raz zajęło mi to kilka minut, aż nawet zalogowałem się do wirtualnego terminala!), Połowa mojej uruchomionej sesji jest w trybie wymiany i muszę czekać dość długo, aż system zacznie działać płynnie jeszcze raz.
Istnieje jedno drakoniczne rozwiązanie problemu: wymuszenie twardego limitu pamięci. Ale robienie tego w całym systemie czasami zabija procesy, których raczej potrzebuję, a jeśli będę musiał ręcznie ulimit
przed rozpoczęciem procesu obrażania ... cóż, często zapominam, aż będzie za późno.
Możliwe rodzaje rozwiązań, z którymi byłbym szczęśliwy:
- Jeśli jakikolwiek proces przekroczy określone użycie pamięci, jest sztucznie ograniczany, aby reszta systemu pozostała responsywna.
- Jeśli jakikolwiek proces przekracza określone użycie pamięci, jest to
SIGSTOP
ped, więc mam czas, aby dowiedzieć się, co dalej. - Jeśli proces zbliża się do limitu pamięci RAM, pojawia się ostrzeżenie, zanim rozpocznie się wielka wymiana.
Czy istnieje sposób na uzyskanie takiego zachowania lub podobnego?
ulimit
.Odpowiedzi:
niceload - noswap twojaprg jest stworzona do dokładnie takiej sytuacji: Patrzy na zamianę aktywności:
Nie zawiesza procesu przed rozpoczęciem zamiany, ale pozwala działać przez 1 sekundę przed działaniem.
niceload --mem 1G yourprg
działa podobnie: jeśli mniej niż 1 GB jest bezpłatne, youprg jest zawieszony. Gdy więcej niż 1 GB jest za darmo, twojaprg zostanie wznowiona.źródło
Tak. Można to zrobić dość łatwo za pomocą praktycznie każdej nowoczesnej powłoki.
Możesz użyć
-l
opcji zablokowanych limitów pamięci. Twój proces zostanie zasygnalizowany, jeśli limit zostanie przekroczony.źródło
Cronjob, aby wyczyścić pamięć podręczną: Jak wyczyścić pamięć podręczną w systemie Linux
Mam właściwie podobne problemy. Mam grupę użytkowników, którzy uruchamiają własne skrypty niestandardowe i co jakiś czas ich skrypty zużywają całą dostępną pamięć i powodują awarię serwera redhat. Powodem masowego zużycia pamięci RAM było to, że ich skrypty mogą działać przez kilka dni, czekając na zdarzenie, a tym samym ograniczając zasoby, gdy w rzeczywistości nie korzysta z żadnego. Więc po prostu wymusiłem wyczyszczenie pamięci podręcznej za pomocą cronjob i od tamtej pory nie miałem problemu.
Prosty i leniwy.
źródło