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ć?

sam hocevar
źródło
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”.

Huygens
źródło
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.

dhchdhd
źródło
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.

Eir Nym
źródło
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