Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Por que o redis não pode definir o arquivo aberto máximo


Bem, é um pouco tarde para este post, mas como passei muito tempo (a noite inteira) para configurar um novo servidor redis 3.0.6 no Ubuntu 16.04. Acho que devo escrever como faço para que os outros não percam tempo...

Para um servidor redis recém-instalado, você provavelmente verá os seguintes problemas no arquivo de log redis, que é /var/log/redis/redis-server.log

Máximo de arquivos abertos
3917:M 16 Sep 21:59:47.834 # You requested maxclients of 10000 requiring at least 10032 max file descriptors.
3917:M 16 Sep 21:59:47.834 # Redis can't set maximum open files to 10032 because of OS error: Operation not permitted.
3917:M 16 Sep 21:59:47.834 # Current maximum open files is 4096. maxclients has been reduced to 4064 to compensate for low ulimit. If you need higher maxclients increase 'ulimit -n'.

Eu vi muitos posts dizendo para você modificar
/etc/security/limits.conf
redis soft nofile 10000
redis hard nofile 10000

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

Isso pode funcionar no Ubuntu 14.04, mas certamente não funciona no Ubuntu 16.04. Eu acho que tem algo a ver com a mudança de upstart para systemd, mas não sou especialista em kernel linux!

Para corrigir isso, você precisa fazer o systemd maneira
/etc/systemd/system/redis.service
[Service]
...
User=redis
Group=redis
# should be fine as long as you add it under [Service] block
LimitNOFILE=65536
...

Então você deve recarregar o daemon e reiniciar o serviço
sudo systemctl daemon-reload
sudo systemctl restart redis.service

Para verificar se funciona, tente os limites do cat proc
cat /run/redis/redis-server.pid
cat /proc/PID/limits

e você verá
Max open files            65536                65536                files     
Max locked memory         65536                65536                bytes   

Nesta fase, o arquivo aberto máximo é resolvido.

Conexão máxima do soquete
2222:M 16 Sep 20:38:44.637 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.

Superalocação de memória
2222:M 16 Sep 20:38:44.637 # Server started, Redis version 3.0.6
2222:M 16 Sep 20:38:44.637 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.

Como esses dois estão relacionados, vamos resolvê-lo de uma vez.
sudo vi /etc/sysctl.conf

# Add at the bottom of file
vm.overcommit_memory = 1
net.core.somaxconn=1024

Agora, para que essas configurações funcionem, você precisa recarregar a configuração
sudo sysctl -p

Páginas enormes transparentes
1565:M 16 Sep 22:48:00.993 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.

Para resolver isso permanentemente, siga a sugestão do log e modifique rc.local
sudo vi /etc/rc.local

if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
    echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi

Isso exige que você reinicialize , faça backup de seus dados ou faça qualquer coisa que você precise antes de realmente fazer isso!!
sudo reboot

Agora verifique seu log redis novamente, você deve ter um servidor redis sem erros ou avisos.