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

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

Me gustaría que los procesos con fugas fueran eliminados a primera vista por el sistema operativo . No me interesa un cuadro de diálogo que aparece después de 20 minutos, sugiere aplicaciones para eliminar y ni siquiera muestra la que se está filtrando.

Intenté establecer los límites rssy pero no pareció 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 de limitación de memoria documentados funciona realmente. ¿Hay algún mecanismo adicional que me haya pasado por alto?

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

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 el tamaño total de la máquina virtual, por lo que incluye las páginas paginadas) 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 extraer la lista de procesos y el tamaño de la memoria.

De esta lista filtrada, usaría el leakscomando (ver man 1 fugas ) por PID de proceso. Si la cantidad total de memoria filtrada informada por el comando es superior a otro umbral, la mataría y la reaparecería.

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

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

Si esta no es una aplicación de escritorio, ejecute el infractor con un supervisor de procesos 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 GUI asesina de OOM para Mac es horrible. Debe estar ordenado de mayor a menor con un gráfico de barras proporcional para el uso de RAM de cada proceso. Además, automáticamente debería SIGCONT todos los procesos en pausa cuando se resuelva.

He tenido el problema con varias aplicaciones, pero la gota que colmó el vaso fue la de Apple llvm-g++. El problema fue reportado en Radar. Tengo curiosidad: ¿qué otra plataforma no funciona ulimit? He estado usando varias versiones de Unix durante casi 20 años y no recuerdo haber visto ninguna.

Si necesita esto en los reinicios, debe usar solo launchctl limitel comando.

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

Como puede ver en la salida, tanto el tamaño de la pila como el tamaño de los datos están limitados. Hice la pregunta porque launchctl limitno funciona .
ulimitque usas realmente no funciona como lo necesitas. launchctl limitlo hace.
y otro momento para iluminarse en los límites: cuando el programa llega a los límites recibe un aviso. pero con un límite suave, la acción se ejecutará con éxito, con un límite fuerte, fallará. Entonces, si el programa solicita memoria más allá del límite estricto, no se asignará memoria.
launchctl limitno funciona, o no estaría haciendo la pregunta.
¿Cómo se mide el tamaño de la aplicación?
launchctl limital igual que ulimit proviene de los sistemas BSD, funciona en BSD, en Linux y en Mac OS X. La única diferencia es la cantidad de memoria de la aplicación calculada en diferentes programas. Si consulta preguntas similares sobre StackOverflow, SuperUser y estas comunidades, la única respuesta que verá es ulimity launchctl limit.
Sí, hay muchas respuestas de personas que creen ulimity launchctl limittrabajan en OS X porque lo han leído en alguna documentación o alguien les dijo. Pero no funcionan. Las funciones C setrlimittambién getrusageson inútiles en OS X, a pesar de lo que dice la documentación.
¿Ha pirateado el kernel de OS X para ello? ¿Tienes enlaces de prueba?