8 votos

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

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

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

He probado a configurar el rss y data límites en /etc/launchd.conf pero no parecía tener efecto.

Esta es mi /etc/launchd.conf :

limit data 8589934592 8589934592
limit rss 8589934592 8589934592

Aquí está el launchctl limit de salida:

% 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

Esta es mi .zshrc :

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

Y el ulimit -a salida (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 top me habla del 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

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

3voto

Huygens Puntos 906

Yo crearía un simple script que filtraría el proceso de cualquier proceso con un tamaño de memoria residente (o tal vez el tamaño total de la vm, por lo que incluye cualquier página paginada) más grande que un umbral que yo defino (dependiendo de la cantidad de proceso, la memoria total disponible y tal vez también la disponibilidad de la CPU). Uno puede usar un poco de bash script con top o ps para extraer la lista de procesos y el tamaño de la memoria.

A partir de esta lista filtrada, utilizaría el leaks (ver el hombre 1 tiene una fuga ) por proceso PID. Si la cantidad total de memoria filtrada reportada por el comando es superior a otro umbral, entonces lo mataría y lo reiniciaría.

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

1voto

Eric Wilson Puntos 108

Ulimit en la mayoría de las plataformas no funciona como se espera.

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

Si se trata de una aplicación de escritorio, ponte en contacto con los desarrolladores de la aplicación. Los comentarios son necesarios e importantes.

La UX en la GUI del asesino OOM para Mac es horrible. Debería ser más grande ordenado de forma descendente con un gráfico de barras proporcional para el uso de la memoria RAM de cada proceso. Además, debería hacer un SIGCONT automático de todos los procesos en pausa cuando se resuelve.

-2voto

Comptrol Puntos 4415

Si necesita esto a través de los reinicios debe utilizar sólo launchctl limit comando.

Si necesitas limitar la memoria de la aplicación también debes limitar el segmento de la pila.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X