12
votes

Erreur Socket.Accept 24: à de nombreux fichiers ouverts

J'ai un problème avec les fichiers ouverts sous mon Ubuntu 9.10 lors de l'exécution de serveur à Python2.6 Et le principal problème est que je ne sais pas pourquoi ..

j'ai défini

ulimit -n = 999999

net.core.somaxconn = 999999

fs.file-max = 999999

et lsof me donne environ 12 000 fichiers ouverts lorsque Server est en cours d'exécution.

Et aussi j'utilise Epoll.

Mais après un certain temps, il commence à donner une exception:

fichier "/usr/lib/python2.6/socket.py", ligne 195, dans Accepter ERREUR: [ERRNO 24] Trop de fichiers ouverts

Et je ne sais pas comment il peut atteindre la limite de fichier quand il n'est pas atteint.

Merci d'aide)


5 commentaires

Qu'est-ce que "ulimit -n" revient? Le système vous permet-il réellement de le définir à 999999?


Vous frappez probablement la limite de descripteur de fichier par processus et vous ne notez pas comment vous l'avez modifiée. Voir /usr/include/linux/limits.h nr_open Que faites-vous avec les fichiers ouverts 12K ??


À propos de cette "/usr/include/linux/limits.h nr_open" Je ne savais pas, il a été réglé sur 1024, changé jusqu'à 65536. À propos de "Ulimit -N" C'est le retour 999999 testera maintenant le serveur avec cette nouvelle option NR_OPEN . Et va répondre) merci)


J'ai testé le serveur avec cette nouvelle option et cela fonctionne parfaitement)) Merci beaucoup de l'aide))))))))))))))))))


hm .. a trouvé un comportement étrange de système. J'ai défini toutes les limites à 999999 et Démarrer le serveur. J'ajoute une certaine fonction qui écrit sur le numéro de journal de fichiers ouverts dans le système avec "sysctl fs.file-nr" et "lsof | wc -l", lorsque Server est très chargé, il est très chargé, il donne une erreur 24: trop de fichiers ouverts. Mais le nombre de fichiers ouverts n'est pas plus grand puis 15k. Peut-être qu'il y a une autre limite? ou certains d'entre eux n'ont pas correctement réglé (si oui, comment cela peut être vérifié?)


3 Réponses :


28
votes

paramètres qui configurent des connexions opencales maximales.

à /etc/sysctl.confled/proxctl.confaDdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd:

*                soft    nofile          65535
*                hard    nofile          65535


2 commentaires

Quelle est la fonction de cette limite? Garder un utilisateur malveillant de ...?


Cela limite le nombre de descripteurs ouverts par utilisateur. Donc, si par exemple votre dB mangez tous les descripteurs, votre serveur Web fonctionnera toujours.



13
votes

Vous pouvez également le faire à partir de votre code Python comme ci-dessous

import resource
resource.setrlimit(resource.RLIMIT_NOFILE, (65536, 65536))


2 commentaires

La mise à jour aide à expliquer la fonction, mais ma question est de savoir si cela fait un changement permanent ou si je redémarre l'interprète Python, il réinitialisera les limites.


@Michael Le changement est une périmètre de processus. Vous devez définir des limites chaque fois que vous exécutez votre script.



-1
votes

Si vous utilisez Supervisord pour exécuter votre processus, tout mentionné ci-dessus peut ne pas suffire. Cela se produit parce que Supervisord a sa propre configuration pour la limite de fichiers ouverts de ses processus.

on /etc/supervisord.confled/supervisford.confled/superfrefrefre>


0 commentaires