Por que `ulimit` não está limitando o uso de memória como esperado?

Por que `ulimit` não está limitando o uso de memória como esperado?

Estou tentando limitar o uso de memória de um processo

$ulimit -m 2
$/usr/bin/time -l ./myProcess arg1 arg2

O processo é executado sem ser eliminado até timea saída

        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 o limite foi ultrapassado apesar da ulimit -m 5linha de comando. Eu também tentei as opções -v, mas -lnenhuma delas parece realmente limitar o uso de memória. Também tentei timeter certeza de que não deixaria de ver o uso de memória de um subprocesso. Aqui estão todos os limites depois de usar all -me-v-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

Se eu limitar o tempo da CPU ( ulimit -t 3), ele funcionará bem e encerrará o processo após 3 segundos.

Pergunta

Há algo que eu não entendi ulimit -m 5? Existe um bug na minha versão ulimit?

Existe uma alternativa para ulimitlimitar o tempo e o uso de memória de um processo (não necessariamente a sessão bash)?

Versões

Estou ligado MAC OSX 10.11.6e bash version 3.2.57.

Postagem relacionada

A postagem "ulimit não limita o uso de memória"está muito relacionado, mas não acho que a resposta aceita ofereça alguma solução sobre como resolver o problema

Responder1

Com os kernels Linux modernos, isso ulimitfica cada vez menos significativo a cada lançamento. Você realmente não pode usar -vporque sua versão do glibc pode preferir carregar arquivos, mmap()então você deve definir um -vtamanho grande o suficiente para incluir todos os arquivos que o processo irá abrir. Como resultado, o -vsinalizador não pode ser usado para limitar o uso de RAM física.

Além disso, o -msinalizador não faz nada, portanto também não pode ser usado para limitar o uso da memória física.

Hoje em dia é preciso usar cgroupsa interface com o kernel para limitar o uso da RAM física, mas a API é um pouco difícil de usar, infelizmente. Talvez um dia tenhamos algum processo semelhante nicee ioniceque possa limitar a memória para um processo dado como parâmetro.

Em teoria, com o suficiente recente, systemdvocê poderá fazer algo como

systemd-run --scope --user -p MemoryMax=250M -- /path/to/program/to/use

e deve funcionar magicamente. Não há nenhuma razão técnica para isso não funcionar (porque o cgrouprecurso subjacente do Linux suporta as coisas necessárias), mas algumas systemdversões falharão silenciosamente e não limitarão o uso de memória. Você também pode adicionar algo parecido -p MemoryHigh=200Màs systemd-runopções se quiser forçar o programa a reduzir o consumo de memória sem eliminá-lo. Esteja avisado, porém, que exceder MemoryHighirá desacelerar um pouco o processo porque o kernel estará fazendo um trabalho extra para recuperar toda a memória (incluindo caches) desse processo para reduzir o uso de memória. Em muitos casos, você não deseja isso se quiser impor o limite máximo.

informação relacionada