sql >> Databasteknik >  >> NoSQL >> Redis

Varför redis inte kan ställa in maximalt öppen fil

Tja, det är lite sent för det här inlägget, men eftersom jag precis spenderat mycket tid (hela natten) för att konfigurera en ny redis-server 3.0.6 på ubuntu 16.04. Jag tror att jag bara ska skriva ner hur jag gör så att andra inte behöver slösa bort sin tid...

För en nyinstallerad redis-server kommer du förmodligen att se följande problem i redis-loggfilen som är /var/log/redis/redis-server.log

Maximalt antal öppna filer

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

Jag har sett många inlägg som säger åt dig att ändra

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

eller

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

Det kanske fungerar i ubuntu 14.04, men det fungerar absolut inte i ubuntu 16.04. Jag antar att det har något att göra med att byta från uppkomling till systemd, men jag är ingen expert på linuxkärna!

För att fixa detta måste du göra det systemd sätt

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

Då måste du ladda om demonen och starta om tjänsten

sudo systemctl daemon-reload
sudo systemctl restart redis.service

För att kontrollera om det fungerar, försök att cat proc limits

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

och du kommer att se

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

I detta skede är den maximala öppna filen löst.

Socket Maximal Connection

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.

Memory Overcommit

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.

Eftersom dessa två är relaterade kommer vi att lösa det på en gång.

sudo vi /etc/sysctl.conf

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

Nu för att dessa konfigurationer ska fungera måste du ladda om konfigurationen

sudo sysctl -p

Transparenta enorma sidor

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.

För att permanent lösa detta, följ loggens förslag och modifiera 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

Detta kräver att du startar om , säkerhetskopiera dina data eller gör något du behöver innan du faktiskt gör det!!

sudo reboot

Kontrollera nu din redis-logg igen, du bör ha en redis-server utan några fel eller varningar.



  1. Tips för att hantera MongoDB på distans

  2. Mongodb, samlad fråga med $lookup

  3. MongoDB - Skapa ett förhållande

  4. MongoDB SSL med självsignerade certifikat i C#