ulimit não limitando o uso de memória

7

Ao escrever programa, há momentos em que um programa fugitivo absorve metade da minha RAM (geralmente devido a loops praticamente infinitos enquanto cria grandes estruturas de dados), e trazendo o sistema para ficar realmente lento que eu não posso nem matar programa. Então eu quero usar ulimit para automaticamente matar meu programa automaticamente quando meu programa está usando uma quantidade anormal de memória:

$ 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

mas por que meu programa ainda está usando mais RAM do que o limite dado (sim, estou iniciando o programa no mesmo shell bash)?

Eu entendi mal algo sobre o ulimit?

    
por Lie Ryan 02.11.2010 / 13:24

2 respostas

4

Seu exemplo deve funcionar como você pensa (o programa é morto depois de consumir muita RAM). Acabei de fazer um pequeno teste no meu servidor de shell:

Primeiramente, eu limitei meus limites a serem REALMENTE baixos:

ulimit -m 10
ulimit -v 10

Isso leva a que tudo seja morto. ls , date e outros pequenos comandos serão gravados antes mesmo de começarem.

Qual distribuição Linux você usa? Seu programa usa apenas um único processo ou gera muitos processos filhos? Neste último caso, ulimit pode nem sempre ser eficaz.

    
por 02.11.2010 / 13:37
1

Isso só funciona em uma única sessão bash, a menos que você a insira em seu .bash_profile e não se inscreva nos processos já em execução.

O que eu acho estranho é que:

 max memory size         (kbytes, -m) unlimited

não está presente em /etc/security/limits.conf, mesmo que limite apenas o consumo de memória por processo, em geral, não para uma conta de usuário. Em vez de adicionar o Cgroup, eles devem apenas modificar os comandos unix existentes para acomodar esses novos recursos.

    
por 22.08.2014 / 13:02

Tags