Limites de descritor de arquivo Ulimit não sendo aplicados a processos específicos

13

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

cat /proc/<redis-pid>/limits

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

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 de ulimit não está sendo aplicado ao processo de execução de redis?

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

    
por UpTheCreek 04.11.2014 / 14:55

3 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 file.
  2. /etc/sysctl.conf file.
  3. ulimit command

/etc/security/limits.conf faz parte de pam_limits e, portanto, os limites definidos nesse arquivo são lidos pelo módulo pam_limits durante as sessões de login . A sessão de login pode ser por ssh ou terminal . E pam_limits não afetará os processos do daemon como mencionado aqui .

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

O comando

ulimit é usado para definir os limites do shell. E assim, quando um limite é definido com ulimit em um shell, o processo que é gerado a partir do shell também obtém esse valor devido à regra de que o child process herda as propriedades parent processes .

E, para o seu caso, como redis é iniciado como parte de init , nenhuma das opções acima ajudará você diretamente. A maneira correta de fazer isso é que você precisa usar o comando ulimit para definir o novo valor no próprio script de inicialização. 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 o recurso ulimit %código% .

Verifique também na configuração de start-stop-daemon se houver alguma maneira de fornecer limites a ela.

    
por 05.11.2014 / 06:52
2

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

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

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

man pam_limits
grep -i limit /etc/pam.d/*
    
por 04.11.2014 / 15:07
2

Você ativou pam_limits para sshd, mas este comando está sendo executado a partir de uma sessão SSH? Talvez seja necessário adicionar a mesma linha a /etc/pam.d/login e / ou /etc/pam.d/su e / ou /etc/pam.d/sudo .

    
por 04.11.2014 / 15:17