web-dev-qa-db-fra.com

Pourquoi redis ne peut pas définir le nombre maximal de fichiers ouverts

 1167: M 26 avril 13 h 00: 34,666 # Vous avez demandé un maximum de 10000 clients nécessitant au moins 10032 descripteurs de fichiers maximum .
 1167: M 26 avril 13 h 00: 34,667 # Redis ne peut pas définir le nombre maximal de fichiers ouverts. 10032 en raison d'une erreur de système d'exploitation: Opération non autorisée .
 1167: M 26 avril 13: 00: 34.667 # Le nombre maximum de fichiers ouverts actuels est de 4096. maxclients a été réduit à 4064 pour compenser un faible ulimit. Si vous avez besoin de max clients plus importants, augmentez 'ulimit -n' .
 1167: M 26 avril 13: 00: 34.685 # Création du serveur TCP socket en écoute 192.34.62.56: 6379: nom ou service inconnu 
1135: M 26 avril 20: 34: 24,308 # Vous avez demandé le nombre maximal de clients par 10000 minimum exigeant au maximum 10032 descripteurs de fichier .
 en cas d'erreur du système d'exploitation: Opération non autorisée .
 1135: M 26 avril 20: 34: 24.309 # Le nombre maximum de fichiers ouverts actuels est de 4096. maxclients a été réduit à 4064 pour compenser le faible ulimit. Si vous avez besoin de max clients plus importants, augmentez 'ulimit -n' .
 1135: M 26 avr. 20: 34: 24.330 # Création du serveur TCP socket en écoute 192.34.62.56: 6379: nom ou service inconnu 
8
Dam SamNang

Redis ne changera jamais le nombre maximum de fichiers ouverts.

Il s’agit d’une configuration de système d’exploitation qui peut également être configurée par utilisateur. L'erreur est descriptive et vous dit: "augmentez 'ulimit -n'"

Vous pouvez vous référer à ce billet de blog pour savoir comment augmenter le maximum de descripteurs de fichiers ouverts: http://www.cyberciti.biz/faq/linux-increase-the-max-number-of-open-files/

4
lsamayoa

Eh bien, il est un peu tard pour ce billet, mais puisque je viens de passer beaucoup de temps (toute la nuit) à configurer un nouveau serveur Redis 3.0.6 sur Ubuntu 16.04. Je pense que je devrais juste écrire comment je le fais pour que les autres ne perdent pas leur temps ...

Pour un serveur Redis nouvellement installé, vous allez probablement rencontrer les problèmes suivants dans le fichier journal Redis, à savoir /var/log/redis/redis-server.log

Nombre maximum de fichiers ouverts

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

J'ai vu beaucoup de messages vous demandant de modifier 

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

ou

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

Cela pourrait fonctionner dans Ubuntu 14.04, mais certainement pas dans Ubuntu 16.04. Je suppose que cela a quelque chose à voir avec le passage de upstart à systemd, mais je ne suis pas un expert du noyau Linux!

Pour résoudre ce problème, vous devez le faire de la manière suivante: systemd way

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

Ensuite, vous devez recharger le démon et redémarrer le service

Sudo systemctl daemon-reload
Sudo systemctl restart redis.service

Pour vérifier si cela fonctionne, essayez de chat limites de proc

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

et vous allez voir

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

A ce stade, le fichier ouvert maximum est résolu.

Socket Maximum 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.

Mémoire 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.

Puisque ces deux sont liés, nous allons le résoudre à la fois.

Sudo vi /etc/sysctl.conf

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

Maintenant, pour que ces configurations fonctionnent, vous devez recharger la configuration

Sudo sysctl -p

Transparent Huge Pages

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.

Pour résoudre ce problème de façon permanente, suivez la suggestion du journal et modifiez 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

Cela nécessite que vous redémarriez , sauvegardiez vos données ou faites tout ce dont vous avez besoin avant de le faire!

Sudo reboot

Maintenant, vérifiez à nouveau votre journal Redis, vous devriez avoir un serveur Redis sans aucune erreur ou avertissement.

22
cwhsu

Vous avez juste besoin de cette commande dans la console:

Sudo ulimit -n 65535
0
sina rahmanian