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.

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á.


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/*

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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.