ulimit no limita el uso de memoria

ulimit no limita el uso de memoria

Al escribir un programa, hay ocasiones en las que un programa fuera de control consume la mitad de mi RAM (generalmente debido a bucles prácticamente infinitos al crear grandes estructuras de datos) y hace que el sistema se vuelva tan lento que ni siquiera puedo eliminar el programa infractor. Entonces quiero usar ulimit para eliminar automáticamente mi programa cuando mi programa esté usando una cantidad anormal de memoria:

$ ulimit -a
core file size          (blocks, -c) 1000
data seg size           (kbytes, -d) 10000
scheduling priority             (-e) 0
file size               (blocks, -f) 1000
pending signals                 (-i) 6985
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) 10000
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 6985
virtual memory          (kbytes, -v) 100000
file locks                      (-x) unlimited
$ ./run_program

pero ¿por qué mi programa sigue usando más RAM que el límite dado (sí, estoy iniciando el programa en el mismo shell bash)?

¿He entendido mal algo sobre ulimit?

Respuesta1

Su ejemplo debería funcionar como cree (el programa se cancela después de consumir demasiada RAM). Acabo de hacer una pequeña prueba en mi servidor shell:

Primero restringí mis límites para que fueran REALMENTE bajos:

ulimit -m 10
ulimit -v 10

Eso lleva a que todo muera. ls, datey otros pequeños comandos se dispararán incluso antes de que comiencen.

¿Qué distribución de Linux utilizas? ¿Su programa utiliza solo un proceso o genera toneladas de procesos secundarios? En el último caso, es posible que ulimit no siempre sea eficaz.

Respuesta2

ulimit -mya no funciona. Úselo ulimit -ven su lugar.

La razón es que ulimitllama a setrlimit yhombre establecer límitedice:

RLIMIT_RSS Especifica el límite (en bytes) del conjunto residente del proceso (el número de páginas virtuales residentes en la RAM). Este límite tiene efecto sólo en Linux 2.4.x, x < 30, y allí afecta sólo a las llamadas a madvise(2) que especifican MADV_WILLNEED.

Respuesta3

Esto solo funciona en una única sesión de bash a menos que lo coloque en su .bash_profile y no se aplicará a los procesos que ya se están ejecutando.

Lo que me parece extraño es que:

 max memory size         (kbytes, -m) unlimited

no está presente en /etc/security/limits.conf aunque solo limita el consumo de memoria por proceso, no en general, para 1 cuenta de usuario. En lugar de agregar Cgroup, deberían haber modificado los comandos de Unix existentes para adaptarse a esas nuevas características.

información relacionada