Ошибка "подключить 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-подобных операционных системах можно использовать следующее:
lsof
имея в видуlist open files
Команда выдает список открытых файлов. Предположим, что ваша программа nodeJS имеет утечку, чтобы узнать общее количество файловых дескрипторов, открытых вашей программой:лсоф | grep узел | туалет
Чтобы узнать дескрипторы файлов для сокетов, используйте:
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