Redis
 sql >> Baza danych >  >> NoSQL >> Redis

Dlaczego redis nie może ustawić maksymalnego otwartego pliku?

Cóż, trochę za późno na ten post, ale ponieważ właśnie spędziłem dużo czasu (całą noc) na skonfigurowaniu nowego serwera redis 3.0.6 na ubuntu 16.04. Myślę, że powinienem po prostu napisać, jak to robię, aby inni nie musieli tracić czasu...

W przypadku nowo zainstalowanego serwera redis prawdopodobnie zobaczysz następujące problemy w pliku dziennika redis, którym jest /var/log/redis/redis-server.log

Maksymalna liczba otwartych plików

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

Widziałem wiele postów, które proponowały modyfikację

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

lub

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

To może działać w Ubuntu 14.04, ale na pewno nie działa w Ubuntu 16.04. Myślę, że ma to coś wspólnego ze zmianą z upstart na systemd, ale nie jestem ekspertem od jądra linuxa!

Aby to naprawić, musisz to zrobić systemd sposób

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

Następnie musisz ponownie załadować demona i ponownie uruchomić usługę

sudo systemctl daemon-reload
sudo systemctl restart redis.service

Aby sprawdzić, czy to działa, spróbuj ustawić limity cat proc

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

a zobaczysz

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

Na tym etapie maksymalna liczba otwartych plików jest rozwiązana.

Maksymalne połączenie gniazda

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.

Przeciążenie pamięci

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.

Ponieważ te dwa są powiązane, rozwiążemy to od razu.

sudo vi /etc/sysctl.conf

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

Teraz, aby te konfiguracje działały, musisz ponownie załadować konfigurację

sudo sysctl -p

Przejrzyste, duże strony

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.

Aby trwale rozwiązać ten problem, postępuj zgodnie z sugestią dziennika i zmodyfikuj 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

Wymaga to zrestartowania , wykonaj kopię zapasową swoich danych lub zrób wszystko, czego potrzebujesz, zanim to zrobisz!

sudo reboot

Teraz sprawdź ponownie log redis, powinieneś mieć serwer redis bez żadnych błędów ani ostrzeżeń.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Przechowuj informacje o użytkowniku za pomocą redis lub mongodb

  2. Redis, wygaśnięcie sesji i wyszukiwanie wsteczne

  3. Jak zaimplementować transakcję rozproszoną w MySQL, Redis i Mongo

  4. Czekaj na wywołanie zwrotne funkcji asynchronicznej w ostatnim zdarzeniu stream.on('data')

  5. Jak wyłączyć trwałość za pomocą redis?