13 votes

Comprendre les descripteurs de fichiers max pour linux et nginx, et la meilleure valeur pour worker_rlimit_nofile

J'ai reçu l'erreur "trop de descripteurs de fichiers" apparemment courante sur nginx. Après de nombreuses recherches, la solution est clairement d'augmenter le nombre de descripteurs de fichiers disponibles pour nginx. Mais il n'y a pas suffisamment d'informations là-bas pour que je me sente à l'aise de le faire de manière significative et sûre. Voici les principaux points que la plupart des discussions sur les forums/par e-mail abordent :

  • le système d'exploitation a sa propre limite totale de descripteurs de fichiers (sur mon système, cat /proc/sys/fs/file-max affiche "100678")
  • chaque utilisateur peut également avoir sa propre limite (mais sur mon système, en exécutant ulimit en tant qu'utilisateur quelconque affiche "illimité" voir la mise à jour en bas avec plus de détails)
  • quelques personnes ont dit quelque chose dans le sens de ce que cette personne a dit : 'La directive worker_rlimit_nofile ne spécifie pas "combien", c'est la limite du système d'exploitation qui le fait. La directive worker_rlimit_nofile permet juste une façon rapide et sale d'augmenter cette limite si ce n'est pas assez.' Donc je suppose que l'implication est qu'il est "mieux" de définir la limite pour l'utilisateur OS nginx au lieu de le faire dans la configuration ?

Je peux simplement ajouter une valeur worker_rlimit_nofile plus grande que le nombre de connexions par travailleur et appeler ça une journée, mais j'ai l'impression de ne pas vraiment comprendre ce qui se passe ici.

  • pourquoi la limite par travailleur serait-elle inférieure à la limite OS ?
  • Comment savoir quelle est ma limite actuelle ?

mise à jour : pour root et un utilisateur normal, ulimit affiche "illimité", MAIS ulimit -Hn et ulimit -Sn affichent tous les deux 1024

11voto

Todd Benning Points 87

worker_rlimit_nofile définira la limite des descripteurs de fichiers pour les processus travailleurs par opposition à l'utilisateur exécutant nginx. Si d'autres programmes s'exécutant sous cet utilisateur ne peuvent pas gérer correctement le manque de descripteurs de fichiers, vous devriez définir cette limite légèrement moins que celle de l'utilisateur.

Tout d'abord, Que consomme vos descripteurs de fichiers?

  1. Chaque connexion active à un client
  2. Utilisez-vous proxy_pass? Cela ouvrira un socket vers l'hôte:port gérant ces requêtes
  3. Utilisez-vous proxy_pass vers un port local? C'est un autre socket ouvert. (Pour le propriétaire de ce processus)
  4. fichiers statiques servis par nginx

Pourquoi la limite par travailleur serait-elle inférieure à la limite du système d'exploitation?

Cela est contrôlé par le système d'exploitation car le travailleur n'est pas le seul processus s'exécutant sur la machine. Pour le modifier pour l'utilisateur exécutant nginx, voir ci-dessous. Ce serait très mauvais si vos travailleurs utilisaient tous les descripteurs de fichiers disponibles pour tous les processus, ne définissez pas vos limites de sorte que cela soit possible.

#/etc/sysctl.conf
#Cela définit la valeur que vous voyez en exécutant cat  /proc/sys/fs/file-max
fs.file-max = 65536"

#/etc/security/limits.conf
#Cela définit les valeurs par défaut pour tous les utilisateurs
* soft nofile 4096
* hard nofile 4096

#Cela remplace la valeur par défaut pour l'utilisateur `nomutilisateurici`
usernamehere soft nofile 10240
usernamehere hard nofile 10240

Après ces changements de limites de sécurité, je crois que j'ai quand même dû augmenter la limite souple pour l'utilisateur en utilisant ulimit.

Comment puis-je savoir quelle est ma limite actuelle?

ulimit -a Affichera toutes les limites associées à l'utilisateur sous lequel vous l'exécutez.

3voto

Schotime Points 6067

Dois vérifier la source pour être honnête, mais c'est assez bas.

J'ai utilisé worker_rlimit_nofile 15000; et je n'ai eu aucun problème, vous pouvez l'augmenter en toute sécurité, bien que le risque de manquer de descripteurs de fichiers soit minuscule.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X