Pourquoi redis signale-t-il la limite de 1024 fichiers même après la mise à jour de limits.conf?

9

Je vois cette erreur en haut de mon fichier redis.log:

Le nombre maximal de fichiers ouverts actuellement est de 1024. maxclients a été réduit à 4064 pour compenser le faible ulimit.

J'ai suivi ces étapes à la lettre (et redémarré):

De plus, je vois cela quand je cours ulimit:

ubuntu@ip-XX-XXX-XXX-XXX:~$ ulimit -n
65535

Cette erreur est-elle spécieuse? Sinon, quelles autres étapes dois-je effectuer? J'utilise redis 2.8.13 (pointe de l'arbre) sur Ubuntu LTS 14.04.1 (encore une fois, pointe de l'arbre).

Voici les informations utilisateur:

ubuntu@ip-XX-XXX-XXX-XXX:~$ ps aux | grep redis
root      1027  0.0  0.0  66328  2112 ?        Ss   20:30   0:00 sudo -u ubuntu /usr/local/bin/redis-server /etc/redis/redis.conf
ubuntu    1107 19.2 48.8 7629152 7531552 ?     Sl   20:30   2:21 /usr/local/bin/redis-server *:6379               

Le serveur fonctionne donc en tant qu'ubuntu.

Voici mon fichier limits.conf sans commentaires:

ubuntu@ip-XX-XXX-XXX-XXX:~$ cat /etc/security/limits.conf | sed '/^#/d;/^$/d'
ubuntu soft nofile 65535
ubuntu hard nofile 65535
root soft nofile 65535
root hard nofile 65535

Et voici la sortie de sysctl fs.file-max:

ubuntu@ip-XX-XXX-XXX-XXX:~$ sysctl -a| grep fs.file-max
sysctl: permission denied on key 'fs.protected_hardlinks'
sysctl: permission denied on key 'fs.protected_symlinks'
fs.file-max = 1528687
sysctl: permission denied on key 'kernel.cad_pid'
sysctl: permission denied on key 'kernel.usermodehelper.bset'
sysctl: permission denied on key 'kernel.usermodehelper.inheritable'
sysctl: permission denied on key 'net.ipv4.tcp_fastopen_key'

comme sudo

ubuntu@ip-10-102-154-226:~$ sudo sysctl -a| grep fs.file-max
fs.file-max = 1528687

En outre, je vois cette erreur en haut du fichier redis.log, je ne sais pas si elle est liée. Il est logique que l'utilisateur ubuntu ne soit pas autorisé à modifier le nombre maximal de fichiers ouverts, mais compte tenu des ulimits élevés que j'ai essayé de définir, il ne devrait pas avoir besoin de:

[1050] 23 Aug 21:00:43.572 # You requested maxclients of 10000 requiring at least 10032 max file descriptors.
[1050] 23 Aug 21:00:43.572 # Redis can't set maximum open files to 10032 because of OS error: Operation not permitted.
esilver
la source

Réponses:

4

Vous devez modifier vos fichiers dans le /etc/pam.d/répertoire.

Dans votre cas, lorsque vous exécutez sudo -u ubuntu /usr/local/bin/redis-server, vous devez ajouter la ligne suivante à /etc/pam.d/sudoou à /etc/pam.d/common-session-noninteractiveau cas où /etc/pam.d/sudocomprend celle-ci:

session required pam_limits.so

Cela devrait aider à définir la configuration fournie à l'intérieur /etc/security/limits.conf.

Navern
la source
C'était ça! Merci beaucoup. Cela ressemble à un changement d'Ubuntu 2012.04 LTS à Ubuntu 2014.04 LTS.
esilver
Heureux que cela vous ait aidé. En effet, mon xubuntu 14.04 n'a pas cette ligne dans /etc/pam.d/sudo. Impossible de vérifier le 12.04 pour le moment.
Navern
Lors de l'utilisation de systemd sur Debian, voir serverfault.com/questions/770037/…
tholu
3

Une autre suggestion pour les utilisateurs qui trouvent ce message dont le problème n'est pas lié à pam_limits.so. Dans mon cas, Redis était lancé via supervisord. Dans ce cas, la méthode par laquelle supervisord a changé de contexte utilisateur a entraîné l'exécution de la nouvelle session avec les limites par défaut du système, et non celles que j'avais configurées pour l'utilisateur.

La solution dans ce cas a été trouvée ici . En bref, vous devez définir la limite via ulimit -n dans le cadre de la commande de démarrage dans supervisord.

Exemple:

[program:redis-a]
command=bash -c "ulimit -n 32768; exec /usr/local/bin/redis-server /etc/redis/a.conf"
modea
la source
1

En plus d'augmenter la limite de fichiers ouverts. Vous devez augmenter maxclients dans votre redis.conf. Ce n'est que 10000 par défaut.

# Once the limit is reached Redis will close all the new connections sending
# an error 'max number of clients reached'.
maxclients 1024000
Kareem
la source
0

Remarque pour les autres utilisateurs d'Ubuntu ayant un problème similaire:

Si vous démarrez Redis au démarrage, par exemple via Upstart, vous pouvez définir cette limite avec la strophe "limit".

Donc pour nofile:

limit nofile 4096 4096

DarkNeuron
la source