Ich habe Probleme mit Prozessen, die Speicherlecks verursachen. Sie bewirken, dass meine Festplatte mit Auslagerungsdateien in /private/var/vm
.
Ich möchte, dass undichte Prozesse vom Betriebssystem auf Anhieb getötet werden . Ich interessiere mich nicht für einen Dialog, der nach 20 Minuten erscheint, Anwendungen zum Beenden vorschlägt und nicht einmal diejenige anzeigt, die undicht ist.
Ich habe versucht, die rss
und data
Limits einzustellen, /etc/launchd.conf
aber es schien keine Wirkung zu haben.
Das ist mein /etc/launchd.conf
:
limit data 8589934592 8589934592
limit rss 8589934592 8589934592
Hier ist die launchctl limit
Ausgabe:
% 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
Das ist mein .zshrc
:
ulimit -t 600
ulimit -d 512000
ulimit -v 1024000
Und die ulimit -a
Ausgabe (in 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
Doch hier ist, was top
mir über den Prozess sagt:
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
Es scheint nur, dass keine der dokumentierten Methoden zur Speicherbegrenzung tatsächlich funktioniert. Gibt es einen zusätzlichen Mechanismus, den ich möglicherweise übersehen habe?
Ich würde ein einfaches Skript erstellen, das jeden Prozess mit einer residenten Speichergröße (oder vielleicht der gesamten VM-Größe, also einschließlich aller ausgelagerten Seiten) filtern würde, die größer als ein Schwellenwert ist, den ich definiere (abhängig von der Menge des Prozesses, dem verfügbaren Gesamtspeicher und vielleicht auch CPU-Verfügbarkeit). Man kann ein bisschen Bash-Skript mit entweder top
oder verwenden ps
, um die Liste der Prozess- und Speichergröße auszugraben.
Aus dieser gefilterten Liste würde ich den leaks
Befehl (siehe man 1 Leaks ) pro Prozess-PID verwenden. Wenn die Gesamtmenge des vom Befehl gemeldeten Speicherlecks höher als ein weiterer Schwellenwert ist, würde ich ihn beenden und neu starten.
HINWEIS : Sie sollten darauf achten, keine Betriebssystem-/Systemprozesse zu beenden, ohne zu wissen, was Sie tun. Um diese Situation zu vermeiden, sollten Sie die Liste vielleicht mit einem "White-List"-Ansatz herausfiltern.
ulimit funktioniert auf den meisten Plattformen nicht wie erwartet.
Wenn dies keine Desktop-App ist, führen Sie den Angreifer mit einem geeigneten Prozessüberwacher wie https://github.com/arya/bluepill aus
Wenn es sich um eine Desktop-App handelt, wenden Sie sich an die App-Entwickler. Feedback ist notwendig und wichtig.
Die UX auf der OOM-Killer-GUI für Mac ist schrecklich. Es sollte am größten absteigend sortiert sein mit einem proportionalen Balkendiagramm für die RAM-Nutzung jedes Prozesses. Darüber hinaus sollte es automatisch alle angehaltenen Prozesse SIGCONT, wenn sie aufgelöst werden.
llvm-g++
. Das Problem wurde in Radar gemeldet. Ich bin neugierig: Welche andere Plattform hat ein nicht funktionierendes ulimit
? Ich benutze seit fast 20 Jahren verschiedene Unix-Varianten und kann mich nicht erinnern, jemals eine gesehen zu haben.Wenn Sie dies über Neustarts hinweg benötigen, sollten Sie nur den launchctl limit
Befehl verwenden.
Wenn Sie den Arbeitsspeicher der Anwendung begrenzen müssen, sollten Sie auch das Stapelsegment begrenzen.
launchctl limit
es nicht funktioniert.ulimit
Sie verwenden wirklich nicht so, wie Sie es brauchen. launchctl limit
tut.launchctl limit
funktioniert nicht , sonst würde ich die Frage nicht stellen.launchctl limit
wie ulimit von BSD-Systemen kommt, funktioniert es in BSD, in Linux und in Mac OS X. Der einzige Unterschied besteht darin, wie viel Speicher der Anwendung in verschiedenen Programmen berechnet wird. Wenn Sie ähnliche Fragen zu StackOverflow, SuperUser und diesen Communitys auschecken, sehen Sie als Antwort nur ulimit
und launchctl limit
.ulimit
und launchctl limit
damit arbeiten, weil sie in irgendeiner Dokumentation darüber gelesen haben oder jemand es ihnen gesagt hat. Aber sie funktionieren nicht. Die C-Funktionen setrlimit
und getrusage
sind auch unter OS X nutzlos, ungeachtet dessen, was die Dokumentation sagt.
duci9y
sam hocevar
duci9y
sam hocevar
duci9y
Eir Nym