Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Warum Redis die maximal geöffnete Datei nicht festlegen kann

Nun, es ist ein bisschen spät für diesen Beitrag, aber da ich gerade viel Zeit (die ganze Nacht) damit verbracht habe, einen neuen Redis-Server 3.0.6 auf Ubuntu 16.04 zu konfigurieren. Ich denke, ich sollte einfach aufschreiben, wie ich es mache, damit andere ihre Zeit nicht verschwenden müssen ...

Bei einem neu installierten Redis-Server werden Sie wahrscheinlich die folgenden Probleme in der Redis-Protokolldatei sehen, die /var/log/redis/redis-server.log ist

Maximal geöffnete Dateien

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

Ich habe viele Posts gesehen, in denen Sie aufgefordert wurden,

zu ändern
/etc/security/limits.conf
redis soft nofile 10000
redis hard nofile 10000

oder

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

Das könnte in Ubuntu 14.04 funktionieren, aber es funktioniert sicherlich nicht in Ubuntu 16.04. Ich schätze, es hat etwas mit dem Wechsel von Emporkömmling zu Systemd zu tun, aber ich bin kein Experte für Linux-Kernel!

Um dies zu beheben, müssen Sie dies über systemd tun Weg

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

Dann müssen Sie den Daemon neu laden und den Dienst neu starten

sudo systemctl daemon-reload
sudo systemctl restart redis.service

Um zu überprüfen, ob es funktioniert, versuchen Sie es mit Cat Proc Limits

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

und du wirst sehen

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

In diesem Stadium ist die maximal geöffnete Datei gelöst.

Maximale Socket-Verbindung

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.

Speicherüberlastung

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.

Da diese beiden verwandt sind, werden wir es sofort lösen.

sudo vi /etc/sysctl.conf

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

Damit diese Konfigurationen funktionieren, müssen Sie die Konfiguration neu laden

sudo sysctl -p

Transparente riesige Seiten

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.

Um dies dauerhaft zu lösen, folgen Sie dem Vorschlag des Protokolls und ändern Sie 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

Dies erfordert einen Neustart , sichern Sie Ihre Daten oder tun Sie alles, was Sie brauchen, bevor Sie es tatsächlich tun!

sudo reboot

Überprüfen Sie jetzt erneut Ihr Redis-Protokoll, Sie sollten einen Redis-Server ohne Fehler oder Warnungen haben.