Limites do descritor de arquivo Ulimit que não estão sendo aplicados para um processo específico

14

Recentemente, verifiquei um de nossos processos redis para quais ulimits foram aplicados usando:

cat /proc/<redis-pid>/limits

E ficou surpreso ao saber que estava com o baixo valor padrão:

Limit                     Soft Limit           Hard Limit           
Max open files            4016                 4016 

Fiquei surpreso, porque temos o seguinte configurado:

# /etc/sysctl.conf 
fs.file-max = 100000

.

# /etc/security/limits.conf
* soft nofile 100000
* hard nofile 100000

.

# /etc/ssh/sshd_config
UsePAM yes

.

# /etc/pam.d/sshd
session required pam_limits.so

Alguém pode me dizer por que o aumento do ulimit não está sendo aplicado ao processo redis em execução?

O processo redis está sendo executado como o usuário 'redis', o servidor foi reinicializado desde que os limites foram aumentados. Estamos no Debian Squeeze.

Até o riacho
fonte

Respostas:

19

No Linux, os limites de recursos podem ser definidos em vários locais, com base no tipo de requisito.

  1. /etc/security/limits.conf Arquivo.
  2. /etc/sysctl.conf Arquivo.
  3. ulimit comando

/etc/security/limits.conffaz parte de pam_limits e, portanto, os limites definidos neste arquivo são lidos pelo módulo pam_limits durante as sessões de login. A sessão de login pode ser feita por sshou através de terminal. E pam_limits não afetará os processos do daemon, conforme mencionado aqui .

/etc/sysctl.confé uma configuração global em todo o sistema, não podemos definir aqui configurações específicas do usuário. Ele define a quantidade máxima de recursos que pode ser usada por todos os usuários / processos colocados juntos.

ulimitO comando é usado para definir os limites do shell. E assim, quando um limite é definido ulimitem um shell, o processo gerado pelo shell também obtém esse valor por causa da regra que child processherda as parent processespropriedades.

E assim, para o seu caso, como o redisiniciado como parte de initnenhuma das opções acima, ajudará você diretamente. A maneira correta de fazer isso é que você deve usar o ulimitcomando para definir o novo valor no próprio script init. Como abaixo no script,

ulimit -n 100000
if start-stop-daemon --start --quiet --umask 007 --pidfile $PIDFILE --chuid redis:redis --exec $DAEMON -- $DAEMON_ARGS.

Já existe um bug arquivado na lista de desejos para adicionar ulimitrecurso start-stop-daemon .

Verifique também na redisconfiguração se há alguma maneira de fornecer limites lá.

Kannan Mohan
fonte
Grande resumo Kannan! Agora fui em frente e adicionei o ulimit ao script de inicialização. É uma pena que não haja maneira de apenas definir o limite para o usuário que trabalhará com processos desononizados (como temos vários scripts de inicialização), mas isso funciona. Obrigado!
UpTheCreek 5/11
Ótima resposta. O processo filho que herdou as propriedades do processo pai foi o que me surpreendeu, todos os limites pareciam corretos para o usuário executando o processo filho, mas era o limite do proprietário do processo pai que estava sendo usado.
sincronização
2

O parâmetro sysctl fs.file-max é um amplo limite global do sistema, não acho que seja uma boa ideia definir ulimit com o mesmo valor.

Se você definir no ulimit 100000 e no sysctl.conf 100000 também, um usuário poderá bloquear o sistema

De qualquer forma, falando sobre seu problema, você precisa ter certeza de que seu sistema usa pam_limits

man pam_limits
grep -i limit /etc/pam.d/*
c4f4t0r
fonte
Obrigado - considerarei aumentar o valor fs.file-max. Em relação ao pam - acredito que estamos usando isso (adicionei algumas configurações extras à pergunta). No entanto, não tenho muita certeza de entender o PAM, pois nossas configurações parecem estar relacionadas ao SSH, que não é usado por esse usuário. Existe algum outro arquivo que eu precise configurar? Eu sempre poderia colocar uma configuração ulimit nos scripts init para redis, mas preferiria não precisar fazer isso.
precisa
2

Você ativou pam_limits para sshd, mas esse comando está sendo executado em uma sessão SSH? Pode ser necessário adicionar a mesma linha para /etc/pam.d/logine / ou /etc/pam.d/sue / ou /etc/pam.d/sudo.

Onipresença
fonte
Obrigado. Eu suspeitava que não estava certo. O processo está sendo iniciado esta linha em um script init.d: if start-stop-daemon --start --quiet --umask 007 --pidfile $PIDFILE --chuid redis:redis --exec $DAEMON -- $DAEMON_ARGS. Que pam seria apropriado neste caso?
UpTheCreek
em seu script você pode usar ulimit -n 100000
c4f4t0r
O script init.d usa um su [user] -ccomando para iniciar o script como outro usuário ou o seu programa é executado como root? Se estiver usando su, você o colocará /etc/pam.d/su. Se você está executando como root, provavelmente está melhor com a sugestão de c4f4t0r de adicionar o ulimitcomando no seu script init. roottem permissão para definir os limites que deseja, para que você não precise se preocupar com o pam para esse caso.
Onipresença
1
Obrigado. Ele usa --chuid redis:redisem start-stop-daemon. Adicionei o ulimit ao script de inicialização agora.
UpTheCreek 5/11