Czy można nałożyć jakiś miękki limit na zużycie pamięci przez procesy?

10

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 ulimitprzed 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 SIGSTOPped, 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?

po lewej stronie
źródło
2
Możesz ograniczyć ilość pamięci RAM używanej przez proces lub grupę procesów, używając cgroups. stackoverflow.com/questions/3043709/…
Mark Plotnick
2
Jest to dosłownie taki właśnie cel ulimit.
DopeGhoti,
1
Można by użyć Ulimit -m, ale nie działał on w Linuksie od wersji 2.4.30, a wcześniej działał tylko w pewnych sytuacjach. unix.stackexchange.com/questions/129587/…
Mark Plotnick
niceload --noswap yourprg
Ole Tange

Odpowiedzi:

6

niceload - noswap twojaprg jest stworzona do dokładnie takiej sytuacji: Patrzy na zamianę aktywności:

  • W przypadku wymiany: Pozwól procesowi działać
  • W przypadku zamiany: Pozwól na uruchomienie procesu
  • W przypadku wymiany i zakończenia: Zawieś proces do momentu zatrzymania wymiany i wznów proces po zakończeniu wymiany

Nie zawiesza procesu przed rozpoczęciem zamiany, ale pozwala działać przez 1 sekundę przed działaniem.

niceload --mem 1G yourprgdział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.

Ole Tange
źródło
0

Tak. Można to zrobić dość łatwo za pomocą praktycznie każdej nowoczesnej powłoki.

sh -c 'ulimit -S -m "$1"
       shift; exec your_command "$@"
' -- some_size args

Możesz użyć -lopcji zablokowanych limitów pamięci. Twój proces zostanie zasygnalizowany, jeśli limit zostanie przekroczony.

mikeserv
źródło
-1

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.

D.Zou
źródło
Hm Interesująca sugestia, chociaż obawiam się, że nic nie robi w przypadku większości problemów, które napotykam. Moim głównym problemem są pojedyncze procesy (aplikacje naukowe), które mogą szybko przydzielić wiele gigabajtów pamięci.
lewo około
Czyszczenie pamięci podręcznej zwykle powoduje problemy z wydajnością. Bardzo rzadko rozwiązują problemy z wydajnością. Ale nie spowodują, że pamięć stanie się dostępna, gdy jej nie będzie.
Gilles „SO- przestań być zły”