Comment puis-je tuer automatiquement les processus qui fuient la mémoire?

8

J'ai des problèmes avec les processus qui fuient la mémoire. Ils font que mon disque dur est rempli de fichiers d'échange /private/var/vm.

J'aimerais que les processus qui fuient soient tués à vue par le système d'exploitation . Je ne suis pas intéressé par une boîte de dialogue qui apparaît après 20 minutes, suggère des applications à tuer et n'affiche même pas celle qui fuit.

J'ai essayé de fixer les limites rsset mais cela ne semble pas avoir d'effet.data/etc/launchd.conf

C'est mon /etc/launchd.conf:

limit data 8589934592 8589934592
limit rss 8589934592 8589934592

Voici la launchctl limitsortie:

% 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

C'est mon .zshrc:

ulimit -t 600
ulimit -d 512000
ulimit -v 1024000

Et la ulimit -asortie (en 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

Pourtant, voici ce qui topme dit sur le processus:

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

Il semble simplement qu'aucune des méthodes de limitation de mémoire documentées ne fonctionne réellement. Y a-t-il un mécanisme supplémentaire que j'ai peut-être manqué?

sam hocevar
la source
230 Gio?! J'espère vraiment que vous avez manqué une décimale.
duci9y
@ duci9y Nope :-(
sam hocevar
3
Dans ce cas, j'espère vraiment que quelqu'un résoudra votre problème. Vous serez dans mes prières.
duci9y
J'ai finalement supprimé la mention du processus de fuite parce que les gens sur IRC ont commencé à me expliquer pourquoi je devrais utiliser clang ++ au lieu de llvm-g ++ et cela me donne seulement envie de les frapper avec des objets pointus.
sam hocevar
Objets pointus en feu.
duci9y

Réponses:

3

Je créerais un script simple qui filtrerait le processus de tout processus avec une taille de mémoire résidente (ou peut-être une taille totale de VM, incluant donc toutes les pages paginées) supérieure à un seuil que je définis (en fonction de la quantité de processus, de la mémoire totale disponible et peut-être aussi la disponibilité du processeur). On peut utiliser un peu de script bash avec topou pspour creuser la liste des processus et la taille de la mémoire.

À partir de cette liste filtrée, j'utiliserais la leakscommande (voir fuites man 1 ) par PID de processus. Si la quantité totale de mémoire perdue signalée par la commande est supérieure à un autre seuil, je la tuerais et la réapparaîtrais.

REMARQUE : vous devez prendre soin de ne tuer aucun processus OS / système sans savoir ce que vous faites. Pour éviter cette situation, vous devriez peut-être filtrer la liste en utilisant une approche de "liste blanche".

Huygens
la source
1

ulimit sur la plupart des plateformes ne fonctionne pas comme prévu.

S'il ne s'agit pas d'une application de bureau, exécutez le délinquant avec un superviseur de processus approprié tel que https://github.com/arya/bluepill

S'il s'agit d'une application de bureau, contactez les développeurs de l'application. La rétroaction est nécessaire et importante.

L'UX sur l'interface graphique du tueur OOM pour Mac est horrible. Il doit être trié par ordre décroissant, avec un graphique à barres proportionnel pour l'utilisation de la mémoire RAM de chaque processus. De plus, il devrait automatiquement SIGCONT tous les processus en pause une fois résolus.

dhchdhd
la source
1
J'ai eu le problème avec plusieurs applications, mais la paille qui a brisé le dos du chameau était celle d'Apple llvm-g++. Le problème a été signalé dans Radar. Je suis curieux: quelle autre plateforme a un non-fonctionnement ulimit? J'utilise plusieurs versions d'Unix depuis près de 20 ans et je ne me souviens pas en avoir vu une.
sam hocevar
-2

Si vous en avez besoin lors des redémarrages, vous ne devez utiliser que la launchctl limitcommande.

Si vous devez limiter la mémoire de l'application, vous devez également limiter le segment de pile.

Eir Nym
la source
Comme vous pouvez le voir dans la sortie, la taille de la pile et la taille des données sont limitées. J'ai posé la question car launchctl limitça ne marche pas .
sam hocevar
ulimitque vous utilisez ne fonctionne vraiment pas selon vos besoins. launchctl limitEst-ce que.
Eir Nym
et un autre moment à éclairer dans les limites: lorsque le programme atteint les limites, il reçoit un avertissement. mais avec une action soft limit sera exécutée avec succès, avec hard - ce sera un échec. Donc, si le programme demande de la mémoire au-delà de la limite stricte, aucune mémoire ne sera allouée.
Eir Nym
launchctl limitne fonctionne pas , ou je ne poserais pas la question.
sam hocevar
comment mesurez-vous la taille d'une application?
Eir Nym