Redis
 sql >> Database >  >> NoSQL >> Redis

Perché redis non può impostare il massimo file aperto

Bene, è un po' tardi per questo post, ma dato che ho passato molto tempo (tutta la notte) a configurare un nuovo server redis 3.0.6 su Ubuntu 16.04. Penso che dovrei semplicemente scrivere come lo faccio in modo che gli altri non debbano perdere tempo...

Per un server redis appena installato, probabilmente vedrai i seguenti problemi nel file di registro redis che è /var/log/redis/redis-server.log

Numero massimo di file aperti

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

Ho visto molti post che ti dicono di modificare

/etc/security/limits.conf
redis soft nofile 10000
redis hard nofile 10000

o

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

Potrebbe funzionare in Ubuntu 14.04, ma di certo non funziona in Ubuntu 16.04. Immagino che abbia qualcosa a che fare con il passaggio da upstart a systemd, ma non sono un esperto del kernel Linux!

Per risolvere questo problema devi farlo da systemd modo

/etc/systemd/system/redis.service
[Service]
...
User=redis
Group=redis
# should be fine as long as you add it under [Service] block
LimitNOFILE=65536
...

Quindi devi ricaricare il demone e riavviare il servizio

sudo systemctl daemon-reload
sudo systemctl restart redis.service

Per verificare se funziona, prova a limitare i limiti di proc

cat /run/redis/redis-server.pid
cat /proc/PID/limits

e vedrai

Max open files            65536                65536                files     
Max locked memory         65536                65536                bytes   

A questo punto, il file massimo aperto è risolto.

Connessione massima presa

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.

Sovraccarico della memoria

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.

Poiché questi due sono correlati, lo risolveremo immediatamente.

sudo vi /etc/sysctl.conf

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

Ora affinché queste configurazioni funzionino, devi ricaricare la configurazione

sudo sysctl -p

Pagine enormi trasparenti

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.

Per risolvere definitivamente questo problema, segui il suggerimento del log e modifica 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

Ciò richiede il riavvio , esegui il backup dei tuoi dati o fai tutto ciò di cui hai bisogno prima di farlo davvero!!

sudo reboot

Ora controlla di nuovo il tuo log redis, dovresti avere un server redis senza errori o avvisi.