Подтвердить что ты не робот

"connect 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.

4b9b3361

Ответ 2

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

Исправлено ограничение количества максимальных сокетов в глобальном масштабе. В более поздних версиях node предел - бесконечность.

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

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

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

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

Смотрите: https://github.com/request/request#request---simplified-http-client

Подробнее о maxSockets: https://nodejs.org/api/http.html#http_agent_maxsockets

Ответ 3

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

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

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

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

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

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

Вы должны попытаться выяснить причину утечки. Следующее можно использовать для отладки в операционной системе unix:

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

    lsof | grep node | wc -l

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

    lsof -n -i -P | grep node

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