Ответ 1
EMFILE
ошибка означает, что ОС отказывает вашей программе открывать больше файлов/сокетов.
Посмотрите: Как изменить количество ограничений для открытых файлов в Linux?
Недавно я получил большой трафик на мой сайт, который запускает 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.
EMFILE
ошибка означает, что ОС отказывает вашей программе открывать больше файлов/сокетов.
Посмотрите: Как изменить количество ограничений для открытых файлов в Linux?
В моем случае у нас уже была конфигурация 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
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
Используя это, мы можем узнать, где находится утечка, и затем мы можем ее исправить.