Wie töte ich automatisch Prozesse, bei denen Speicher verloren geht?

8

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 rssund data-Limits festzulegen, /etc/launchd.confaber es schien keine Wirkung zu haben.

Das ist mein /etc/launchd.conf:

limit data 8589934592 8589934592
limit rss 8589934592 8589934592

Hier ist die launchctl limitAusgabe:

% 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 -aAusgabe (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 topmir ü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?

Sam Hocevar
quelle
230 GiB?! Ich hoffe wirklich, dass Sie einen Dezimalpunkt verpasst haben.
Duci9y
@ duci9y Nein :-(
Sam Hocevar
3
In diesem Fall hoffe ich wirklich, dass jemand Ihr Problem behebt. Du wirst in meinen Gebeten sein.
Duci9y
Ich habe schließlich die Erwähnung des undichten Prozesses entfernt, weil die Leute im IRC angefangen haben, mir zu erklären, warum ich clang ++ anstelle von llvm-g ++ verwenden sollte, und das bringt mich nur dazu, sie mit spitzen Objekten zu treffen.
Sam Hocevar
Spitze Objekte in Brand.
Duci9y

Antworten:

3

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 topoder verwenden ps, um die Liste der Prozess- und Speichergröße herauszufinden.

Aus dieser gefilterten Liste würde ich den leaksBefehl (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.

Huygens
quelle
1

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.

dhchdhd
quelle
1
Ich hatte das Problem mit mehreren Anwendungen, aber der Strohhalm, der dem Kamel den Rücken brach, war der von Apple llvm-g++. Das Problem wurde in Radar gemeldet. Ich bin gespannt: Welche andere Plattform funktioniert nicht ulimit? Ich benutze seit fast 20 Jahren verschiedene Unix-Varianten und kann mich nicht erinnern, eine gesehen zu haben.
Sam Hocevar
-2

Wenn Sie dies über Neustarts hinweg benötigen, sollten Sie nur den launchctl limitBefehl verwenden.

Wenn Sie den Speicher der Anwendung einschränken müssen, sollten Sie auch das Stapelsegment begrenzen.

Eir Nym
quelle
Wie Sie in der Ausgabe sehen können, sind sowohl die Stapelgröße als auch die Datengröße begrenzt. Ich habe die Frage gestellt, weil launchctl limitsie nicht funktioniert.
Sam Hocevar
ulimitSie verwenden wirklich nicht, wie Sie brauchen. launchctl limittut.
Eir Nym
und ein weiterer Moment, der in Grenzen beleuchtet werden muss: Wenn das Programm Grenzen erreicht, erhält es eine Warnung. aber mit weichem Limit wird die Aktion erfolgreich ausgeführt, mit hart - sie wird fehlschlagen. Wenn das Programm Speicher über das feste Limit hinaus anfordert, wird kein Speicher zugewiesen.
Eir Nym
launchctl limitfunktioniert nicht , sonst würde ich die Frage nicht stellen.
Sam Hocevar
Wie messen Sie die Anwendungsgröße?
Eir Nym