Nginx: accept4() failed (23: Too many open files in system) — Решение
Nginx перестает обрабатывать новые сетевые запросы, полностью блокируя стек сетевого ввода-вывода. В системном журнале ядра и error.log Nginx массово генерируется ошибка системного вызова: accept4() failed (23: Too many open files in system) while accepting new connection.
| Код ядра | Обозначение POSIX | Масштаб проблемы |
|---|---|---|
| Код 24 | EMFILE | Превышен лимит дескрипторов отдельного процесса |
| Код 23 | ENFILE | Превышен глобальный лимит дескрипторов всей ОС Linux |
fs.file-nr | Метрика ядра | Текущее число выделенных дескрипторов достигло fs.file-max |
- Сбой затрагивает не только Nginx, но и все остальные процессы на хосте (SSH, базы данных, Docker daemon перестают открывать сокеты и файлы).
- Попытка выполнить системные команды в консоли может завершаться ошибкой
-bash: ...: Too many open files in system.
- Проверьте текущее состояние системной таблицы дескрипторов ядра Linux:
cat /proc/sys/fs/file-nr # Формат вывода: [выделено файлов] [неиспользуемые] [максимальный лимит] - Увеличьте глобальный лимит файловых дескрипторов операционной системы через утилиту
sysctl:sudo sysctl -w fs.file-max=2097152 sudo sysctl -w fs.nr_open=2097152 - Зафиксируйте настройки на постоянной основе в конфигурационном файле
/etc/sysctl.d/99-file-limits.conf:fs.file-max = 2097152 fs.nr_open = 2097152 - Примените параметры ядра без перезагрузки системы:
sudo sysctl -p /etc/sysctl.d/99-file-limits.conf - Выявите процессы-виновники утечки дескрипторов:
sudo lsof | awk '{print $1}' | sort | uniq -c | sort -rn | head -n 15 - Перезапустите стек веб-сервера:
sudo systemctl restart nginx.
fs.nr_open определяет жесткий потолок (hard limit), выше которого ни один отдельный процесс не может поднять свой RLIMIT_NOFILE. Значение fs.file-max задает суммарный лимит для всей операционной системы в целом.Частые вопросы (FAQ)
В чем разница между ошибками ядра 24 и 23?
Ошибка 24 (EMFILE) означает, что лимит превысил конкретный воркер Nginx. Ошибка 23 (ENFILE) означает, что во всей операционной системе Linux закончились свободные слоты для открытия любых новых файлов и сокетов.
Что показывает третья цифра в /proc/sys/fs/file-nr?
Третья цифра отображает максимальное допустимое количество открытых файлов в системе (значение sysctl fs.file-max).
Может ли утечка сокетов в Docker контейнерах вызвать ошибку 23?
Да, поскольку таблица файловых дескрипторов ядра Linux является общей для всей системы, неконтролируемая утечка сокетов в любом изолированном контейнере исчерпает лимит для всего хоста.
Какое безопасное значение fs.file-max для highload серверов?
Для современных серверов с оперативной памятью от 16 ГБ стандартным промышленным значением является 2 097 152 (2 миллиона) дескрипторов.