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

8

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

Me gustaría que los procesos de filtración sean eliminados a la vista por el sistema operativo . No estoy interesado en un cuadro de diálogo que aparece después de 20 minutos, sugiere aplicaciones para eliminar y ni siquiera muestra la que tiene fugas.

He intentado establecer los límites de rss y data en /etc/launchd.conf pero no parece tener efecto.

Este es mi /etc/launchd.conf :

limit data 8589934592 8589934592
limit rss 8589934592 8589934592

Aquí está la salida launchctl limit :

% 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 salida ulimit -a (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, aquí está lo que top me 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

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

    
pregunta sam hocevar 28.02.2013 - 23:50

3 respuestas

3

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

De esta lista filtrada, usaría el comando leaks (consulte man 1 leaks ) por proceso PID. Si la cantidad total de memoria filtrada informada por el comando es mayor que otro umbral, entonces lo mataría y reaparecería.

NOTA : debe tener cuidado de no finalizar ningún proceso de 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".

    
respondido por el Huygens 08.03.2013 - 08:41
1

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

Si esta no es una aplicación de escritorio, ejecute al infractor con un supervisor de proceso adecuado, como enlace

Si se trata de una aplicación de escritorio, póngase en contacto 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 ser el mayor orden descendente con una gráfica de barras proporcional para el uso de cada ram de los procesos. Además, debe SIGCONT automáticamente todos los procesos en pausa cuando se resuelven.

    
respondido por el Barry 05.03.2013 - 15:48
-2

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

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

    
respondido por el Eir Nym 07.03.2013 - 08:29

Lea otras preguntas en las etiquetas