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 rss
i, 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 limit
wynik:
% 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 -a
wyjś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 top
mó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ć?
Odpowiedzi:
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
top
lub,ps
aby wykopać listę procesów i wielkości pamięci.Z tej przefiltrowanej listy użyłbym
leaks
polecenia (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”.
źródło
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.
źródło
llvm-g++
. Problem został zgłoszony w Radar. Jestem ciekawy: na jakiej innej platformie nie działaulimit
? Używam kilku smaków Uniksa od prawie 20 lat i nie pamiętam, żeby je widziałem.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.
źródło
launchctl limit
nie nie działa.ulimit
używasz naprawdę nie działa tak, jak potrzebujesz.launchctl limit
robi.launchctl limit
nie nie działa, albo nie będzie zadać pytanie.