Diferença entre ulimit -n e / proc / $ PID / limits

9

No Linux, há um limite de arquivo aberto. Eu posso usar ulimit -npara ver o limite de arquivo aberto, que é 1024 padrão. Também posso ver o processo de limite aberto / flexível de arquivo aberto por processo, consultando / proc / $ PID / limits. Vejo soft = 1024 e hard = 4096.

Eu estou querendo saber qual é a diferença entre essas duas saídas?

Além disso, aplicar setRlimit()e getRlimit()aplicar a todo o sistema ou por processo?

sdeLevelNegativeTwo
fonte

Respostas:

11

ulimit -ndefine o limite flexível por padrão; você pode adicionar a -Hopção de visualizar / definir o limite rígido.

Na maioria das vezes, os limites flexíveis e rígidos se comportam assim:

  1. Os processos da raiz (na verdade, qualquer processo com CAP_SYS_RESOURCE) podem aumentar ou diminuir qualquer limite em qualquer processo.
  2. os processos de qualquer usuário podem reduzir qualquer limite em outros processos pertencentes a esse usuário.
  3. os processos de qualquer usuário podem aumentar o limite flexível até o limite rígido dos processos pertencentes a esse usuário.
  4. Se um processo tentar exceder seu limite flexível, a tentativa falhará.

Portanto, os limites rígidos funcionam como um limite para os limites flexíveis (exceto a raiz, que normalmente pode fazer qualquer coisa).

Há uma exceção: um limite suave da CPU envia um SIGXCPUsinal. Um processo pode optar por ignorar isso ou gastar tempo fazendo a limpeza, etc. Depois que o limite da CPU for ultrapassado, o kernel envia SIGKILL- o que não é alcançável, manipulável ou ignorável. Portanto, nesse caso, o limite flexível funciona como um aviso "você está sem tempo de CPU - termine e saia imediatamente, ou então!" e o limite máximo é o "ou então".

A maioria é por processo, mas algumas (como RLIMIT_NPROC) são por usuário. A página de manual getrlimit (2) especifica para cada limite.

derobert
fonte
Outra questão relacionada, por que às vezes minha concha tem ulimit -n = 1024 e outro processo ateado fogo deste shell tem limite suave = 4096 (ler o / proc / PID / limites)
sdeLevelNegativeTwo
@sdeLevelNegativeTwo Você iniciou o processo antes ou depois da ulimit -n? Não afeta os processos já acionados, apenas o shell e os futuros. Fora isso, o processo pode estar aumentando seu limite flexível para o limite rígido. Então você pode usar ulimit -H -npara pará-lo.
derobert