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 rss
y 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 limit
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
Este es mi .zshrc
:
ulimit -t 600
ulimit -d 512000
ulimit -v 1024000
Y la 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 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?
Respuestas:
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
top
ops
para desenterrar la lista de procesos y tamaño de memoria.De esta lista filtrada, usaría el
leaks
comando (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".
fuente
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.
fuente
llvm-g++
. El problema se informó en Radar. Tengo curiosidad: ¿qué otra plataforma tiene un no funcionaulimit
? He estado usando varios sabores de Unix durante casi 20 años y no recuerdo haber visto uno.Si necesita esto a través de reinicios, debe usar solo el
launchctl limit
comando.Si necesita limitar la memoria de la aplicación, también debe limitar el segmento de pila.
fuente
launchctl limit
no no trabajar.ulimit
realmente no funciona como lo necesita.launchctl limit
hace.launchctl limit
no no funciona, o no estaría haciendo la pregunta.