Ошибка "подключить EMFILE" в Node.js

Совсем недавно я получил много трафика на мой сайт, на котором работает Node.js. С ростом трафика он начал сильно падать, чего раньше не было. Я получаю следующую ошибку в моем журнале:

{ [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)

Кто-нибудь, у кого есть идея, почему он падает? А идеи как это решить?

Я использую Express.js и Socket.io. Он работает на Ubuntu.

3 ответа

Решение

EMFILE ошибка означает, что ОС запрещает вашей программе открывать больше файлов / сокетов.

Посмотрите: Как мне изменить ограничение на количество открытых файлов в Linux?

EMFILE средства error maximum files Это означает, что ОС отказывает вашей программе в открытии файловых дескрипторов.

Обратите внимание, что к открытым файлам в системе относятся файлы на диске, именованные каналы, сетевые сокеты и устройства, открытые всеми процессами.

Ваша операционная система определяет ограничение количества открытых файлов на процесс.

Чтобы проверить ограничение на количество открытых файлов в вашей системе, используйте ulimit -a команда. Обычно в Unix-подобных системах по умолчанию используется значение 1024.

Если ограничение было 1024, значит, вы / процесс можете открыть максимум 1024 файла. если вы превысите этот предел означает open, pipe а также dup системные вызовы завершатся неудачно и приведут к ошибке EMFILE.

Когда вы получаете EMFILE это в основном указывает на утечку в вашем коде. Увеличение ulimit до более высокого значения не является хорошим решением в случае утечки в вашей программе.

Вы должны попытаться выяснить причину утечки. Для отладки в Unix-подобных операционных системах можно использовать следующее:

  1. lsof имея в виду list open files Команда выдает список открытых файлов. Предположим, что ваша программа nodeJS имеет утечку, чтобы узнать общее количество файловых дескрипторов, открытых вашей программой:

    лсоф | grep узел | туалет

  2. Чтобы узнать дескрипторы файлов для сокетов, используйте:

    lsof -n -i -P | grep узел

Используя это, мы можем узнать, где находится утечка, и затем мы можем исправить ее.

В моем случае, у нас уже был набор ulimit и конфигурация kern.maxfiles, которые он мог использовать на Mac.

То, что исправило это, ограничивало число максимальных сокетов во всем мире. В более поздних версиях узла предел равен бесконечности.

Попробуйте добавить эти строки кода:

var https = require('https');
var http = require('http');

https.globalAgent.maxSockets = 5;
http.globalAgent.maxSockets = 5;

В случае использования библиотеки запросов вы можете настроить эти параметры.

Смотрите: https://github.com/request/request

Вот больше о maxSockets: https://nodejs.org/api/http.html

Другие вопросы по тегам