Por que o redis informa o limite de 1024 arquivos, mesmo após a atualização para limits.conf?

9

Vejo esse erro na parte superior do meu arquivo redis.log:

O número máximo de arquivos abertos atuais é 1024. maxclients foi reduzido para 4064 para compensar o ulimit baixo.

Tenho seguido estes passos para a letra (e reiniciado):

Além disso, vejo isso quando corro ulimit:

ubuntu@ip-XX-XXX-XXX-XXX:~$ ulimit -n
65535

Esse erro é ilusório? Caso contrário, que outras etapas eu preciso executar? Estou executando o redis 2.8.13 (ponta da árvore) no Ubuntu LTS 14.04.1 (novamente, ponta da árvore).

Aqui estão as informações do usuário:

ubuntu@ip-XX-XXX-XXX-XXX:~$ ps aux | grep redis
root      1027  0.0  0.0  66328  2112 ?        Ss   20:30   0:00 sudo -u ubuntu /usr/local/bin/redis-server /etc/redis/redis.conf
ubuntu    1107 19.2 48.8 7629152 7531552 ?     Sl   20:30   2:21 /usr/local/bin/redis-server *:6379               

O servidor está, portanto, rodando como ubuntu.

Aqui está o meu arquivo limits.conf sem comentários:

ubuntu@ip-XX-XXX-XXX-XXX:~$ cat /etc/security/limits.conf | sed '/^#/d;/^$/d'
ubuntu soft nofile 65535
ubuntu hard nofile 65535
root soft nofile 65535
root hard nofile 65535

E aqui está a saída do sysctl fs.file-max:

ubuntu@ip-XX-XXX-XXX-XXX:~$ sysctl -a| grep fs.file-max
sysctl: permission denied on key 'fs.protected_hardlinks'
sysctl: permission denied on key 'fs.protected_symlinks'
fs.file-max = 1528687
sysctl: permission denied on key 'kernel.cad_pid'
sysctl: permission denied on key 'kernel.usermodehelper.bset'
sysctl: permission denied on key 'kernel.usermodehelper.inheritable'
sysctl: permission denied on key 'net.ipv4.tcp_fastopen_key'

como sudo

ubuntu@ip-10-102-154-226:~$ sudo sysctl -a| grep fs.file-max
fs.file-max = 1528687

Além disso, vejo esse erro na parte superior do arquivo redis.log, não tenho certeza se está relacionado. Faz sentido que o usuário do ubuntu não tenha permissão para alterar o máximo de arquivos abertos, mas, considerando os altos limites que tentei definir, ele não deve:

[1050] 23 Aug 21:00:43.572 # You requested maxclients of 10000 requiring at least 10032 max file descriptors.
[1050] 23 Aug 21:00:43.572 # Redis can't set maximum open files to 10032 because of OS error: Operation not permitted.
esilver
fonte

Respostas:

4

Você deve editar seus arquivos dentro do /etc/pam.d/diretório.

No seu caso, quando você executa sudo -u ubuntu /usr/local/bin/redis-server, você deve adicionar a seguinte linha a /etc/pam.d/sudoou /etc/pam.d/common-session-noninteractiveno caso de /etc/pam.d/sudoincluir esta:

session required pam_limits.so

Isso deve ajudar a definir a configuração fornecida no interior /etc/security/limits.conf.

Navern
fonte
Foi isso! Muito obrigado. Parece uma mudança do Ubuntu 2012.04 LTS para o Ubuntu 2014.04 LTS.
esilver
Que bom que te ajudou. Na verdade, o meu xubuntu 14.04 não tem essa linha dentro do /etc/pam.d/sudo. Não é possível verificar o 12.04 no momento.
Navern 23/08/14
Ao usar o systemd no Debian, consulte serverfault.com/questions/770037/…
tholu
3

Outra sugestão para os usuários que encontram esta postagem cujo problema não está relacionado ao pam_limits.so. No meu caso, o Redis estava sendo lançado via supervisord. Nesse caso, o método pelo qual a supervisord alternava os contextos do usuário fazia com que a nova sessão fosse executada com os limites padrão do sistema, não aqueles que eu havia configurado para o usuário.

A solução nesse caso foi encontrada aqui . Resumindo, é necessário definir o limite via ulimit -n como parte do comando de inicialização no supervisord.

Exemplo:

[program:redis-a]
command=bash -c "ulimit -n 32768; exec /usr/local/bin/redis-server /etc/redis/a.conf"
modea
fonte
1

Além de aumentar o limite de arquivos abertos. Você precisa aumentar o maxclients no seu redis.conf. É apenas 10000 por padrão.

# Once the limit is reached Redis will close all the new connections sending
# an error 'max number of clients reached'.
maxclients 1024000
Kareem
fonte
0

Nota para outros usuários do Ubuntu com um problema semelhante:

Se você estiver iniciando o Redis na inicialização, por exemplo, via Upstart, poderá definir esse limite com a estrofe "limit".

Então, para nofile:

limit nofile 4096 4096

DarkNeuron
fonte