¿Cómo elimino automáticamente los procesos que pierden memoria?

8

Tengo problemas con los procesos que pierden memoria. Causan que mi disco duro se llene con archivos de intercambio /private/var/vm.

Me gustaría que el sistema operativo matara a la vista los procesos con fugas . No me interesa un cuadro de diálogo que aparece después de 20 minutos, sugiere aplicaciones para matar y ni siquiera muestra el que tiene una fuga.

He intentado establecer los límites rssy pero no parece tener efecto.data/etc/launchd.conf

Este es mi /etc/launchd.conf:

limit data 8589934592 8589934592
limit rss 8589934592 8589934592

Aquí está la launchctl limitsalida:

% 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

Este es mi .zshrc:

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

Y la ulimit -asalida (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

Sin embargo, esto es lo que topme dice sobre el proceso:

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

Simplemente parece que ninguno de los métodos documentados de limitación de memoria realmente funciona. ¿Hay algún mecanismo adicional que pueda haber pasado por alto?

sam hocevar
fuente
230 GiB ?! Realmente espero que hayas perdido un punto decimal.
duci9y
@ duci9y No :-(
sam hocevar
3
En ese caso, realmente espero que alguien solucione su problema. Estarás en mis oraciones.
duci9y
Eventualmente eliminé la mención de cuál era el proceso de filtración porque la gente en IRC comenzó a darme una conferencia sobre por qué debería usar clang ++ en lugar de llvm-g ++ y eso solo me da ganas de golpearlos con objetos puntiagudos.
sam hocevar
Objetos puntiagudos en llamas.
duci9y

Respuestas:

3

Crearía una secuencia de comandos simple que filtraría el proceso de cualquier proceso con un tamaño de memoria residente (o tal vez un tamaño total de vm, incluyendo cualquier página paginada) mayor que un umbral que defino (dependiendo de la cantidad de proceso, memoria total disponible y quizás también disponibilidad de CPU). Se puede usar un poco de script bash con topo pspara desenterrar la lista de procesos y tamaño de memoria.

De esta lista filtrada, usaría el leakscomando (ver el hombre 1 fugas ) por PID de proceso. Si la cantidad total de memoria filtrada informada por el comando es más alta que otro umbral, lo mataría y reaparecería.

NOTA : debe tener cuidado de no matar ningún proceso del sistema operativo / sistema operativo sin saber lo que hace. Para evitar esta situación, quizás debería filtrar la lista utilizando un enfoque de "lista blanca".

Huygens
fuente
1

ulimit en la mayoría de las plataformas no funciona como se esperaba.

Si no se trata de una aplicación de escritorio, ejecute al infractor con un supervisor de proceso adecuado, como https://github.com/arya/bluepill

Si se trata de una aplicación de escritorio, comuníquese con los desarrolladores de la aplicación. La retroalimentación es necesaria e importante.

La UX en la interfaz gráfica de usuario asesina de OOM para Mac es horrible. Debe ser el más grande en orden descendente con un gráfico de barras proporcional para el uso de memoria RAM de cada proceso. Además, debería SIGCONT automáticamente todos los procesos en pausa cuando se resuelven.

dhchdhd
fuente
1
He tenido el problema con varias aplicaciones, pero la gota que colmó el vaso fue la de Apple llvm-g++. El problema se informó en Radar. Tengo curiosidad: ¿qué otra plataforma tiene un no funciona ulimit? He estado usando varios sabores de Unix durante casi 20 años y no recuerdo haber visto uno.
sam hocevar
-2

Si necesita esto a través de reinicios, debe usar solo el launchctl limitcomando.

Si necesita limitar la memoria de la aplicación, también debe limitar el segmento de pila.

Eir Nym
fuente
Como puede ver en la salida, tanto el tamaño de la pila como el tamaño de los datos son limitados. Hice la pregunta porque launchctl limitno no trabajar.
sam hocevar
ulimitrealmente no funciona como lo necesita. launchctl limithace.
Eir Nym
y otro momento para iluminar los límites: cuando el programa alcanza los límites, recibe una advertencia. pero con la acción de límite suave se ejecutará con éxito, con fuerza, fallará. Entonces, si el programa solicita memoria más allá del límite rígido, no se asignará memoria.
Eir Nym
launchctl limitno no funciona, o no estaría haciendo la pregunta.
sam hocevar
¿Cómo se mide el tamaño de la aplicación?
Eir Nym