Ich habe Probleme mit Prozessen, bei denen Speicher verloren geht. Sie führen dazu, dass meine Festplatte mit Auslagerungsdateien gefüllt wird /private/var/vm
.
Ich möchte, dass undichte Prozesse vom Betriebssystem auf Sicht getötet werden . Ich bin nicht an einem Dialog interessiert, der nach 20 Minuten angezeigt wird, Anwendungen zum Beenden vorschlägt und nicht einmal die zeigt, die undicht ist.
Ich habe versucht, die rss
und data
-Limits festzulegen, /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 Speicherbeschränkung tatsächlich funktioniert. Gibt es einen zusätzlichen Mechanismus, den ich möglicherweise übersehen habe?
Antworten:
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) filtert, die größer als ein von mir definierter Schwellenwert ist (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 verwendenps
, um die Liste der Prozess- und Speichergröße herauszufinden.Aus dieser gefilterten Liste würde ich den
leaks
Befehl (siehe Mann 1 Lecks ) pro Prozess-PID verwenden. Wenn die Gesamtmenge des vom Befehl gemeldeten Speicherverlusts höher als ein weiterer Schwellenwert ist, würde ich ihn töten und erneut starten.HINWEIS : Sie sollten darauf achten, keine Betriebssystem- / Systemprozesse abzubrechen, ohne zu wissen, was Sie tun. Um diese Situation zu vermeiden, sollten Sie die Liste möglicherweise mithilfe eines "White List" -Ansatzes herausfiltern.
quelle
ulimit funktioniert auf den meisten Plattformen nicht wie erwartet.
Wenn dies keine Desktop-App ist, führen Sie den Täter mit einem geeigneten Prozess-Supervisor 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 sortiert absteigend mit einem proportionalen Balkendiagramm für die RAM-Nutzung jedes Prozesses sein. Darüber hinaus sollte es automatisch alle angehaltenen Prozesse SIGCONT, wenn es aufgelöst wird.
quelle
llvm-g++
. Das Problem wurde in Radar gemeldet. Ich bin gespannt: Welche andere Plattform funktioniert nichtulimit
? Ich benutze seit fast 20 Jahren verschiedene Unix-Varianten und kann mich nicht erinnern, eine gesehen zu haben.Wenn Sie dies über Neustarts hinweg benötigen, sollten Sie nur den
launchctl limit
Befehl verwenden.Wenn Sie den Speicher der Anwendung einschränken müssen, sollten Sie auch das Stapelsegment begrenzen.
quelle
launchctl limit
sie nicht funktioniert.ulimit
Sie verwenden wirklich nicht, wie Sie brauchen.launchctl limit
tut.launchctl limit
funktioniert nicht , sonst würde ich die Frage nicht stellen.