erreur "connect EMFILE" dans Node.js
j'ai très récemment reçu beaucoup de trafic de mon site qui fonctionne Nœud.js. Avec l'augmentation du trafic il a commencé à se crasher beaucoup, ce qui ne s'est pas produit avant. J'obtiens l'erreur suivante dans mon journal:
{ [Error: connect EMFILE] code: 'EMFILE', errno: 'EMFILE', syscall: 'connect' }
Error: connect EMFILE
at errnoException (net.js:670:11)
at connect (net.js:548:19)
at net.js:607:9
at Array.0 (dns.js:88:18)
at EventEmitter._tickCallback (node.js:192:40)
Quelqu'un qui sait pourquoi il s'est écrasé? Et des idées de comment le résoudre?
J'utilise Express.js et Socket.io. Il fonctionne sur Ubuntu.
3 réponses
EMFILE
erreur signifie que le système d'exploitation refuse à votre programme d'ouvrir plus de fichiers/sockets.
regardez: Comment changer le nombre de limite de fichiers ouverts sous Linux?
EMFILE
signifie error maximum files
ce qui indique que L'OS refuse à votre programme d'ouvrir plus de descripteurs de fichiers.
Notez que les fichiers ouverts dans le système de fichiers named pipes, sockets réseau et les périphériques ouverts par tous les processus.
votre système d'exploitation spécifie la limite de fichier ouvert par processus.
pour vérifier la limite des fichiers ouverts de votre système, utilisez la commande ulimit -a
. Généralement sur un système de type unix il est par défaut de 1024.
si la limitation était 1024, signifie que vous/le processus peut ouvrir un maximum de 1024 fichiers. si vous dépassez cette limite signifie open
, pipe
et dup
les appels système échoueront et produiront une erreur EMFILE.
quand vous obtenez EMFILE
cela indique principalement la fuite dans votre code. Augmenter l'ulimit à une valeur plus élevée n'est pas une bonne solution en cas de fuite dans votre programme.
Vous devriez essayer de trouver la cause de la fuite.
-
lsof
la commandelist open files
donne la liste des fichiers ouverts. Supposons que votre programme nodeJS a une fuite donc pour connaître le nombre total de descripteurs de fichiers ouverts par votre programme:lsof / grep node / wc-l
-
pour découvrir le fichier descripteurs pour les sockets, utiliser:
lsof-n-i-P | grep node
en utilisant ceci nous pouvons trouver où se trouve la fuite et ensuite nous pouvons la corriger.
dans mon cas, nous avions déjà le set ulimit et kern.maxfiles configuration highest il peut aller sur un Mac.
ce qui l'a fixé était de limiter le nombre de sockets max à l'échelle mondiale. Dans les versions ultérieures du noeud la limite est L'infini.
essayez d'ajouter ces lignes de code:
var https = require('https');
var http = require('http');
https.globalAgent.maxSockets = 5;
http.globalAgent.maxSockets = 5;
dans le cas de l'utilisation de la bibliothèque de requêtes, Vous pouvez configurer ces paramètres.
voir: https://github.com/request/request#request---simplified-http-client
en savoir plus sur maxSockets: https://nodejs.org/api/http.html#http_agent_maxsockets