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 rss
et 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 limit
sortie:
% 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 -a
sortie (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 top
me 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é?
Réponses:
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
top
oups
pour creuser la liste des processus et la taille de la mémoire.À partir de cette liste filtrée, j'utiliserais la
leaks
commande (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".
la source
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.
la source
llvm-g++
. Le problème a été signalé dans Radar. Je suis curieux: quelle autre plateforme a un non-fonctionnementulimit
? J'utilise plusieurs versions d'Unix depuis près de 20 ans et je ne me souviens pas en avoir vu une.Si vous en avez besoin lors des redémarrages, vous ne devez utiliser que la
launchctl limit
commande.Si vous devez limiter la mémoire de l'application, vous devez également limiter le segment de pile.
la source
launchctl limit
ça ne marche pas .ulimit
que vous utilisez ne fonctionne vraiment pas selon vos besoins.launchctl limit
Est-ce que.launchctl limit
ne fonctionne pas , ou je ne poserais pas la question.