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

Hvorfor redis ikke kan indstille maksimalt åben fil

Nå, det er lidt sent til dette indlæg, men da jeg lige har brugt meget tid (hele natten) på at konfigurere en ny redis-server 3.0.6 på ubuntu 16.04. Jeg tror, ​​jeg lige skal skrive ned, hvordan jeg gør det, så andre ikke skal spilde deres tid...

For en nyligt installeret redis-server vil du sandsynligvis se følgende problemer i redis-logfilen, som er /var/log/redis/redis-server.log

Maksimalt antal åbne 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'.

Jeg har set en masse indlæg, der fortæller dig at du skal ændre

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

eller

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

Det virker måske i ubuntu 14.04, men det virker bestemt ikke i ubuntu 16.04. Jeg gætter på, at det har noget at gøre med at skifte fra upstart til systemd, men jeg er ingen ekspert i linux-kerne!

For at rette dette skal du gøre det systemd måde

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

Så skal du genindlæse dæmonen og genstarte tjenesten

sudo systemctl daemon-reload
sudo systemctl restart redis.service

For at kontrollere, om det virker, skal du prøve at angive proc-grænser

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

og du vil se

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

På dette stadium er den maksimalt åbne fil løst.

Socket Maksimal forbindelse

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.

Da disse to er beslægtede, løser vi det med det samme.

sudo vi /etc/sysctl.conf

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

For at disse konfigurationer skal virke, skal du genindlæse konfigurationen

sudo sysctl -p

Transparente enorme sider

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.

For permanent at løse dette, følg loggens forslag og modificer 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

Dette kræver, at du genstarter , sikkerhedskopiere dine data eller gøre noget, du har brug for, før du rent faktisk gør det!!

sudo reboot

Tjek nu din redis-log igen, du skulle have en redis-server uden fejl eller advarsler.



  1. Få sidst indsatte dokument-id i MongoDB med Java-driver

  2. Klasse 'MongoDB\Driver\Manager' blev ikke fundet

  3. Hvordan kan jeg gennemse/se de værdier, der er gemt i Redis

  4. Kan selleri celerybeat bruge en Database Scheduler uden Django?