web-dev-qa-db-fra.com

Erreur "connect EMFILE" dans Node.js

J'ai récemment reçu beaucoup de trafic vers mon site qui exécute Node.js. Avec l'augmentation du trafic, il a commencé à planter beaucoup, ce qui ne s'est jamais produit auparavant. 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)

Quiconque a une idée de pourquoi il plante? Et des idées comment le résoudre?

J'utilise Express.js et Socket.io. Il fonctionne sur Ubuntu.

55
codekick

EMFILE erreur signifie que le système d'exploitation refuse à votre programme d'ouvrir plus de fichiers/sockets.

Jetez un œil à: Comment puis-je changer le nombre de fichiers ouverts sous Linux?

55
stewe

EMFILE signifie error maximum files qui indique que le système d'exploitation refuse à votre programme d'ouvrir plus de descripteurs de fichiers.

Notez que les fichiers ouverts dans le système incluent les fichiers disque, les canaux nommés, les sockets réseau et les périphériques ouverts par tous les processus.

Votre système d'exploitation spécifie la limite de fichiers ouverts par processus.

Pour vérifier la limite de fichiers ouverts de votre système, utilisez la commande ulimit -a. Généralement, sur un système de type Unix, la valeur par défaut est 1024.

Si la limitation était de 1024, cela signifie que vous/processus pouvez ouvrir un maximum de 1024 fichiers. si vous dépassez cette limite, les appels système open, pipe et dup échoueront et produiront une erreur EMFILE.

Lorsque 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. Ce qui suit peut être utilisé pour déboguer sous Unix comme un système d'exploitation:

  1. lsof ce qui signifie que la commande list open files donne la liste des fichiers ouverts. Supposons que votre programme nodeJS ait une fuite afin de connaître le nombre total de descripteurs de fichiers ouverts par votre programme:

    lsof | noeud grep | wc -l

  2. Pour connaître les descripteurs de fichiers pour les sockets, utilisez:

    lsof -n -i -P | nœud grep

En utilisant cela, nous pouvons découvrir où se trouve la fuite et ensuite nous pouvons la corriger.

10
GauravLuthra

Dans mon cas, nous avions déjà la configuration ulimit set et kern.maxfiles la plus élevée possible sur un Mac.

Ce qui l'a corrigé limitait le nombre de sockets max dans le monde. Dans les versions ultérieures de node, la limite est Infinity.

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

5
Michael Benin