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 rss
y 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 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 de limitación de memoria documentados funciona realmente. ¿Hay algún mecanismo adicional que me haya pasado por alto?
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 top
o ps
para extraer la lista de procesos y el tamaño de la memoria.
De esta lista filtrada, usaría el leaks
comando (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.
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 limit
el comando.
Si necesita limitar la memoria de la aplicación, también debe limitar el segmento de pila.
launchctl limit
no funciona .ulimit
que usas realmente no funciona como lo necesitas. launchctl limit
lo hace.launchctl limit
no funciona, o no estaría haciendo la pregunta.launchctl limit
al 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 ulimit
y launchctl limit
.ulimit
y launchctl limit
trabajan en OS X porque lo han leído en alguna documentación o alguien les dijo. Pero no funcionan. Las funciones C setrlimit
también getrusage
son inútiles en OS X, a pesar de lo que dice la documentación.
duci9y
sam hocevar
duci9y
sam hocevar
duci9y
Eir Nym