web-dev-qa-db-fra.com

Limites de descripteur de fichier ulimit non appliqués pour un processus particulier

J'ai récemment vérifié l'un de nos processus de Redis à ce que Ulimits où l'application utilise:

cat /proc/<redis-pid>/limits

Et a été surprise pour apprendre que cela était à la faible valeur par défaut:

Limit                     Soft Limit           Hard Limit           
Max open files            4016                 4016 

J'étais surpris, car nous avons les suivants configurés:

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

.

# /etc/security/limits.conf
* soft nofile 100000
* hard nofile 100000

.

# /etc/ssh/sshd_config
UsePAM yes

.

# /etc/pam.d/sshd
session required pam_limits.so

Quelqu'un peut-il me dire pourquoi l'augmentation de Ulimit n'est pas appliquée au processus d'exécution de Redis?

Le processus REDIS fonctionne comme l'utilisateur 'Redis', le serveur a été redémarré car les limites ont été augmentées. Nous sommes sur la pression de Debian.

14
UpTheCreek

Dans Linux Les limites de ressources peuvent être définies dans divers endroits basés sur le type d'exigence.

  1. /etc/security/limits.conf déposer.
  2. /etc/sysctl.conf déposer.
  3. ulimit commande

/etc/security/limits.conf fait partie de pam_limites et les limites définies dans ce fichier sont lues par module PAM_LIMITS lors de sessions de connexion. La session de connexion peut être par ssh ou via terminal. Et pam_limits n'affectera pas les processus de démon comme mentionné ici .

/etc/sysctl.conf est une configuration globale globale du système, nous ne pouvons pas définir ici de configuration spécifique à l'utilisateur ici. Il définit la quantité maximale de ressources pouvant être utilisée par tous les utilisateurs/processus mis à la réunion.

ulimit _ La commande est utilisée pour définir les limites de la coque. Et donc quand une limite est définie avec ulimit sur une coquille, le processus qui est généré à partir de la coquille obtient cette valeur aussi à cause de la règle que le child process hérite le parent processes Propriétés.

Et ainsi pour votre cas, comme le redis est démarré dans le cadre de init rien de ce qui précède vous aidera directement. La manière appropriée de cela est que, vous devez utiliser la commande ulimit pour définir la nouvelle valeur dans le script init lui-même. Comme ci-dessous dans le script,

ulimit -n 100000
if start-stop-daemon --start --quiet --umask 007 --pidfile $PIDFILE --chuid redis:redis --exec $DAEMON -- $DAEMON_ARGS.

Il y a déjà un bug classé dans la liste de souhaits pour ajouter ulimit fonctionnalité à start-stop-daemon.

Vérifiez également la configuration redis s'il existe un moyen de fournir des limites.

19
Kannan Mohan

Le paramètre SYSCTL FS.FILE-MAX est une large limite de système globale, je ne pense pas que ce soit une bonne idée de définir ulimit la même valeur.

Si vous définissez Ulimit 100000 et dans SYSCTL.CONF 100000 aussi, un utilisateur peut bloquer le système.

Toute façon, parle de votre problème, vous neez pas sûr que votre système utilise pam_limits

man pam_limits
grep -i limit /etc/pam.d/*
2
c4f4t0r

Vous avez activé pam_limits pour sshd, mais cette commande est-elle exécutée d'une session SSH? Vous devrez peut-être ajouter la même ligne à /etc/pam.d/login et/ou /etc/pam.d/su et/ou /etc/pam.d/Sudo.

2
Omnipresence