Estoy intentando limitar el uso de memoria de un proceso.
$ulimit -m 2
$/usr/bin/time -l ./myProcess arg1 arg2
El proceso se ejecuta sin ser finalizado hasta time
la salida.
7.00 real 4.83 user 2.16 sys
4154855424 maximum resident set size
0 average shared memory size
0 average unshared data size
0 average unshared stack size
1014384 page reclaims
0 page faults
0 swaps
0 block input operations
2 block output operations
0 messages sent
0 messages received
0 signals received
0 voluntary context switches
15 involuntary context switches
mostrando que el límite se ha superado a pesar de la ulimit -m 5
línea de comando. También probé las opciones -v
y -l
ninguna parece limitar realmente el uso de la memoria. También intenté time
asegurarme de que no dejara de ver el uso de memoria de un subproceso. Aquí están todos los límites después de usar all -m
, -v
y-l
$ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) 3
max memory size (kbytes, -m) 2
open files (-n) 256
pipe size (512 bytes, -p) 1
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 709
virtual memory (kbytes, -v) 2
Si limito el tiempo de la CPU ( ulimit -t 3
), funciona bien y finaliza el proceso después de 3 segundos.
Pregunta
¿Hay algo que no entiendo bien ulimit -m 5
? ¿Hay algún error en mi versión de ulimit?
¿Existe alguna alternativa para ulimit
limitar el tiempo y el uso de memoria de un proceso (no necesariamente la sesión de bash)?
Versiones
Estoy en MAC OSX 10.11.6
y bash version 3.2.57
.
Publicación relacionada
La publicación "ulimit no limita el uso de memoria"Está muy relacionado, pero no creo que la respuesta aceptada ofrezca ninguna solución sobre cómo resolver el problema.
Respuesta1
Con los kernels de Linux modernos, esto ulimit
se vuelve cada vez menos significativo con cada lanzamiento. Realmente no puede usarlo -v
porque es posible que su versión de glibc prefiera cargar archivos, mmap()
por lo que debe configurarlo -v
lo suficientemente grande como para incluir todos los archivos que el proceso va a abrir. Como resultado, la -v
bandera no se puede utilizar para limitar el uso de RAM física.
Además, la -m
bandera no hace nada, por lo que tampoco se puede utilizar para limitar el uso de la memoria física.
Hoy en día, uno tiene que usar cgroups
la interfaz del kernel para limitar el uso de RAM física, pero desafortunadamente la API es un poco difícil de usar. Quizás algún día tengamos algún proceso similar nice
y ionice
que pueda limitar la memoria para un proceso dado como parámetro.
En teoría, con lo suficientemente reciente systemd
deberías poder hacer algo como
systemd-run --scope --user -p MemoryMax=250M -- /path/to/program/to/use
y debería funcionar mágicamente. No hay ninguna razón técnica para que esto no funcione (porque la cgroup
característica subyacente de Linux admite las cosas requeridas), pero algunas systemd
versiones simplemente fallarán silenciosamente y en realidad no limitarán el uso de la memoria. También puede agregar algo como -p MemoryHigh=200M
opciones systemd-run
si desea impulsar el programa para reducir el consumo de memoria sin matarlo. Sin embargo, tenga en cuenta que excederlo MemoryHigh
ralentizará bastante el proceso porque el kernel hará un trabajo adicional para recuperar toda la memoria (incluidos los cachés) de ese proceso para reducir el uso de memoria. En muchos casos, no querrás eso si quieres imponer el límite máximo.