comportamento estranho com ulimit no Mac OS X 10.6

8

Tenho um comportamento muito estranho ao trabalhar com o ulimit. Eu apenas abro um novo shell

Hector:~ robertj$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited 
open files                      (-n) 256 
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 532
virtual memory          (kbytes, -v) unlimited

Ok, isso parece ser o padrão, mesmo que eu defina o limite de arquivos dentro do /etc/launchd.conf para ser ilimitado. Mas essa é outra questão para outro dia.

Agora eu aumento o número de arquivos para 1024 e vamos dar uma olhada nas novas configurações novamente.

 Hector:~ robertj$ ulimit -n 1024
 Hector:~ robertj$ ulimit -a | grep open
 open files                      (-n) 1024

Ok, isso funciona. legal! Agora vamos alterar as configurações novamente

Hector:~ robertj$ ulimit -n 512
Hector:~ robertj$ ulimit -a | grep open
open files                      (-n) 512

Novamente, isso funciona muito bem. Vamos mudar novamente para algum valor mais alto

Hector:~ robertj$ ulimit -n 1024
-bash: ulimit: open files: cannot modify limit: Operation not permitted
Hector:~ robertj$ 

Que porra é essa agora?

Se eu tentar sudo isso, não recebo um erro, mas o valor também não é alterado.

Hector:~ robertj$ sudo ulimit -n 1024
Password:
Hector:~ robertj$ ulimit -a | grep open
open files                      (-n) 512
Hector:~ robertj$ 

O que está acontecendo aqui?

Estou completamente perplexo!

Qualquer ajuda é muito apreciada...

Robertj

robertj
fonte

Respostas:

18

Há duas coisas que confundem você. A primeira é que existem limites rígidos e flexíveis para cada recurso. ulimit -n 512define os dois , mas ulimit -amostra apenas o limite flexível. Uma vez que o limite for definido, ele só pode ser diminuído.

$ ulimit -n
256
$ ulimit -Hn  # There's no initial hard limit
unlimited
$ ulimit -n 512  # This sets both the hard and soft limits
$ ulimit -n
512
$ ulimit -Hn
512
$ ulimit -n 1024  # Once set, the hard limit cannot be increased
-bash: ulimit: open files: cannot modify limit: Operation not permitted

A segunda coisa que te confunde é que sudo ulimitnão faz o que você pensa que faz. Ele gera um subprocesso (raiz), define os limites de arquivo aberto para esse subprocesso e sai do subprocesso. Os limites são uma configuração por processo, portanto, fazer uma alteração neles não faz nada de útil.

Gordon Davisson
fonte
Olá Gordon, obrigado pela ótima explicação. Infelizmente, ainda não posso aprovar sua resposta - mas isso ajudou muito!
portanto, se um limite for definido, como aumentamos o limite?
Greg
@greg: Eu acho que você não pode - é isso que torna um limite difícil. Em alguns sistemas operacionais, raiz pode aumentar o limite rígido sobre outros processos, mas eu não acho mesmo que isso é possível no OS X.
Gordon Davisson
Obrigado. Eu acidentalmente o ajustei muito baixo, o que praticamente tornou meu sistema inutilizável. Uma reinicialização pareceu corrigi-lo.
greg