Wie beende ich automatisch Prozesse, die Speicher verlieren?

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 rssund dataLimits einzustellen, /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 Speicherbegrenzung tatsächlich funktioniert. Gibt es einen zusätzlichen Mechanismus, den ich möglicherweise übersehen habe?

230 GB?! Ich hoffe sehr, dass Sie ein Komma übersehen haben.
@duci9y Nein :-(
In diesem Fall hoffe ich wirklich, dass jemand Ihr Problem behebt. Du wirst in meinen Gebeten sein.
Ich habe schließlich die Erwähnung entfernt, was der undichte Prozess war, weil Leute im IRC anfingen, mich darüber zu belehren, warum ich clang++ anstelle von llvm-g++ verwenden sollte, und das bringt mich nur dazu, sie mit spitzen Gegenständen zu treffen.
Spitze Gegenstände in Brand.
Wie überprüfen Sie den von der Anwendung belegten Speicher?

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

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

Ich hatte das Problem mit mehreren Anwendungen, aber der Strohhalm, der das Fass zum Überlaufen brachte, war Apples 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 limitBefehl verwenden.

Wenn Sie den Arbeitsspeicher der Anwendung begrenzen müssen, sollten Sie auch das Stapelsegment begrenzen.

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 limites nicht funktioniert.
ulimitSie verwenden wirklich nicht so, wie Sie es brauchen. launchctl limittut.
und ein weiterer Moment, um in Grenzen zu leuchten: Wenn das Programm Grenzen erreicht, erhält es eine Warnung. aber mit weichem Limit wird die Aktion erfolgreich ausgeführt, mit hartem — wird sie fehlschlagen. Wenn also das Programm Speicher über das Hard Limit hinaus anfordert, wird kein Speicher zugewiesen.
launchctl limitfunktioniert nicht , sonst würde ich die Frage nicht stellen.
Wie misst man die Anwendungsgröße?
launchctl limitwie 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 ulimitund launchctl limit.
Ja, es gibt viele Antworten von Leuten, die an OS X glauben ulimitund launchctl limitdamit arbeiten, weil sie in irgendeiner Dokumentation darüber gelesen haben oder jemand es ihnen gesagt hat. Aber sie funktionieren nicht. Die C-Funktionen setrlimitund getrusagesind auch unter OS X nutzlos, ungeachtet dessen, was die Dokumentation sagt.
Haben Sie dafür den OS X-Kernel gehackt? Hast du Proof-Links?