¿Por qué `ulimit` no limita el uso de memoria como esperaba?

¿Por qué `ulimit` no limita el uso de memoria como esperaba?

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 timela 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 5línea de comando. También probé las opciones -vy -lninguna parece limitar realmente el uso de la memoria. También intenté timeasegurarme 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, -vy-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 ulimitlimitar el tiempo y el uso de memoria de un proceso (no necesariamente la sesión de bash)?

Versiones

Estoy en MAC OSX 10.11.6y 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 ulimitse vuelve cada vez menos significativo con cada lanzamiento. Realmente no puede usarlo -vporque es posible que su versión de glibc prefiera cargar archivos, mmap()por lo que debe configurarlo -vlo suficientemente grande como para incluir todos los archivos que el proceso va a abrir. Como resultado, la -vbandera no se puede utilizar para limitar el uso de RAM física.

Además, la -mbandera 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 cgroupsla 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 nicey ioniceque pueda limitar la memoria para un proceso dado como parámetro.

En teoría, con lo suficientemente reciente systemddeberí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 cgroupcaracterística subyacente de Linux admite las cosas requeridas), pero algunas systemdversiones simplemente fallarán silenciosamente y en realidad no limitarán el uso de la memoria. También puede agregar algo como -p MemoryHigh=200Mopciones systemd-runsi desea impulsar el programa para reducir el consumo de memoria sin matarlo. Sin embargo, tenga en cuenta que excederlo MemoryHighralentizará 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.

información relacionada