Главная / Справочник ошибок / Сервер
Процесс исчерпал лимит открытых файлов
Too many open files (EMFILE)
Too many open files, EMFILE в логах Directum RX, RabbitMQ или Elasticsearch: процесс упёрся в лимит файловых дескрипторов. Как проверить лимит и поднять его для службы и контейнера.
Что это значит
У каждого процесса в Linux есть предел открытых файлов. Сетевое соединение тоже считается файлом. Процесс дошёл до предела и не может открыть новый файл или принять соединение. Значение по умолчанию 1024 мало для брокера, поиска и нагруженного сервиса.
Причины две: лимит слишком мал для нормальной работы или процесс не закрывает соединения, и тогда любой лимит со временем кончится.
Как проверить
cat /proc/<pid>/limits | grep "open files"
ls /proc/<pid>/fd | wc -l
rabbitmq-diagnostics status | grep -i -A2 "file descriptors"
Снимите число открытых файлов дважды с интервалом. Ровное число у предела означает малый лимит. Постоянный рост означает утечку.
Что сделать
- Служба systemd: добавить
LimitNOFILE=65536в секцию[Service]черезsystemctl edit <служба>и перезапустить. Файл/etc/security/limits.confна службы systemd не действует. - Docker: ключ
--ulimit nofile=65536:65536или блокulimitsв файле compose. - RabbitMQ и Elasticsearch требуют не меньше 65536, это написано в их документации.
- При утечке лимит только отодвинет сбой. Посмотрите, какие соединения копятся:
ls -l /proc/<pid>/fd | awk '{print $NF}' | sort | uniq -c | sort -rn | head.