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.

45
demandé sur codekick 2012-04-27 21:53:17

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?

46
répondu stewe 2017-05-23 12:26:08

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.

  1. lsof la commande list 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

  2. 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.

5
répondu GauravLuthra 2017-05-14 13:55:27

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

4
répondu Michael Benin 2016-01-04 21:59:11