Jak automatycznie zabijać procesy, które przeciekają pamięć?


8

Mam problemy z procesami, które przeciekają pamięć. Powodują, że mój dysk twardy jest zapełniony plikami wymiany /private/var/vm.

Chciałbym, aby przeciekające procesy były zabijane na widok systemu operacyjnego . Nie interesuje mnie okno dialogowe, które pojawia się po 20 minutach, sugeruje aplikacje do zabicia, a nawet nie pokazuje tego, który przecieka.

Próbowałem ustawić limity rssi, ale nie wydawało się to mieć żadnego efektu.data/etc/launchd.conf

To jest moje /etc/launchd.conf:

limit data 8589934592 8589934592
limit rss 8589934592 8589934592

Oto launchctl limitwynik:

% launchctl limit
    cpu         unlimited      unlimited
    filesize    unlimited      unlimited
    data        8589934592     8589934592
    stack       8388608        67104768
    core        0              unlimited
    rss         8589934592     8589934592
    memlock     unlimited      unlimited
    maxproc     709            1064
    maxfiles    256            unlimited

To jest moje .zshrc:

ulimit -t 600
ulimit -d 512000
ulimit -v 1024000

I dane ulimit -awyjściowe (w ZSH):

% ulimit -a
    -t: cpu time (seconds)         600
    -f: file size (blocks)         unlimited
    -d: data seg size (kbytes)     512000
    -s: stack size (kbytes)        8192
    -c: core file size (blocks)    0
    -v: address space (kb)         1000
    -l: locked-in-memory size (kb) unlimited
    -u: processes                  709
    -n: file descriptors           256

Oto, co topmówi mi o tym procesie:

PID  COMMAND      %CPU  TIME     #TH  #WQ  #POR #MRE RPRVT  RSHRD  RSIZE  VPRVT  VSIZE  PGRP PPID
886  process      30.8  01:16.40 1/1  0    17   332  2259M+ 184K   2072M- 19G+   38G    882  885

Wygląda na to, że żadna z udokumentowanych metod ograniczania pamięci nie działa. Czy istnieje dodatkowy mechanizm, który mogłem przeoczyć?


230 GiB ?! Naprawdę mam nadzieję, że przegapiłeś przecinek dziesiętny.
— duci9y

@ duci9y Nope :-(
— sam hocevar

3
W takim razie mam nadzieję, że ktoś naprawi twój problem. Będziecie w moich modlitwach.
— duci9y

W końcu usunąłem wzmiankę o tym, czym był przeciek, ponieważ ludzie na IRC zaczęli pouczać mnie, dlaczego powinienem używać clang ++ zamiast llvm-g ++, a to tylko sprawia, że ​​chcę uderzyć ich spiczastymi przedmiotami.
— sam hocevar

Spiczaste przedmioty w ogniu.
— duci9y

Odpowiedzi:


3

Stworzyłbym prosty skrypt, który filtrowałby proces dowolnego rozmiaru rezydentnej pamięci (lub być może całkowity rozmiar vm, a więc łącznie ze stronami stronicowanymi) większy niż określony przeze mnie próg (w zależności od ilości procesu, całkowitej dostępnej pamięci i być może także dostępność procesora). Można użyć odrobiny skryptu bash z jednym z toplub, psaby wykopać listę procesów i wielkości pamięci.

Z tej przefiltrowanej listy użyłbym leakspolecenia (patrz przeciek man 1 ) dla PID procesu. Jeśli łączna ilość wycieku pamięci zgłoszona przez polecenie jest wyższa niż kolejny próg, zabiłbym ją i odrodziłbym.

UWAGA : Należy uważać, aby nie zabić procesów OS / System bez wiedzy o tym, co robisz. Aby uniknąć tej sytuacji, być może powinieneś odfiltrować listę, stosując podejście „białej listy”.


1

ulimit na większości platform nie działa zgodnie z oczekiwaniami.

Jeśli nie jest to aplikacja komputerowa, uruchom sprawcę z właściwym nadzorcą procesu, takim jak https://github.com/arya/bluepill

Jeśli jest to aplikacja komputerowa, skontaktuj się z twórcami aplikacji. Informacja zwrotna jest konieczna i ważna.

UX w OI GUI dla Maca jest straszny. Powinien być największy posortowany malejąco z proporcjonalnym wykresem słupkowym dla każdego użycia pamięci RAM każdego procesu. Ponadto powinien automatycznie SIGCONT wszystkie wstrzymane procesy po ich rozwiązaniu.


1
Miałem problem z kilkoma aplikacjami, ale słoma, która złamała grzbiet wielbłąda, należała do Apple llvm-g++. Problem został zgłoszony w Radar. Jestem ciekawy: na jakiej innej platformie nie działa ulimit? Używam kilku smaków Uniksa od prawie 20 lat i nie pamiętam, żeby je widziałem.
— sam hocevar

-2

Jeśli potrzebujesz tego podczas ponownego uruchamiania, powinieneś używać tylko launchctl limit polecenia.

Aby ograniczyć pamięć aplikacji, należy również ograniczyć segment stosu.


Jak widać na wydruku, zarówno rozmiar stosu, jak i rozmiar danych są ograniczone. I zadał pytanie, ponieważ launchctl limitnie nie działa.
— sam hocevar

ulimitużywasz naprawdę nie działa tak, jak potrzebujesz. launchctl limitrobi.
— Eir Nym

i kolejna chwila, by oświetlić granice: gdy program osiągnie granice, otrzyma ostrzeżenie. ale przy miękkim limicie akcja zostanie wykonana pomyślnie, z trudnym - nie powiedzie się. Więc jeśli program zażąda pamięci poza twardym limitem, pamięć nie zostanie przydzielona.
— Eir Nym,

launchctl limitnie nie działa, albo nie będzie zadać pytanie.
— sam hocevar

jak mierzysz rozmiar aplikacji?
— Eir Nym
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.