![Por que `ulimit` não está limitando o uso de memória como esperado?](https://rvso.com/image/1554905/Por%20que%20%60ulimit%60%20n%C3%A3o%20est%C3%A1%20limitando%20o%20uso%20de%20mem%C3%B3ria%20como%20esperado%3F.png)
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é time
a 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 5
linha de comando. Eu também tentei as opções -v
, mas -l
nenhuma delas parece realmente limitar o uso de memória. Também tentei time
ter 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 -m
e-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 ulimit
limitar 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.6
e 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 ulimit
fica cada vez menos significativo a cada lançamento. Você realmente não pode usar -v
porque sua versão do glibc pode preferir carregar arquivos, mmap()
então você deve definir um -v
tamanho grande o suficiente para incluir todos os arquivos que o processo irá abrir. Como resultado, o -v
sinalizador não pode ser usado para limitar o uso de RAM física.
Além disso, o -m
sinalizador 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 cgroups
a 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 nice
e ionice
que possa limitar a memória para um processo dado como parâmetro.
Em teoria, com o suficiente recente, systemd
você 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 cgroup
recurso subjacente do Linux suporta as coisas necessárias), mas algumas systemd
versõ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-run
opções se quiser forçar o programa a reduzir o consumo de memória sem eliminá-lo. Esteja avisado, porém, que exceder MemoryHigh
irá 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.