Ошибка Too many open files в Linux: увеличение ulimit и limits.conf
Почему возникает сбой Too many open files?
В Linux действует фундаментальный принцип: «Всё есть файл». Каждый открытый документ, конфигурационный файл, входящее сетевое соединение клиента, сокет базы данных или пайп считаются операционной системой за файловый дескриптор (File Descriptor). По умолчанию для одного пользователя установлен лимит всего в 1024 дескриптора. При росте нагрузки Nginx, Node.js или MySQL упираются в этот потолок и падают с ошибкой:
java.io.IOException: Too many open files
worker_connections are not enough / socket() failed (24: Too many open files) Пошаговое увеличение лимитов дескрипторов
- Проверьте текущие лимиты:
ulimit -n - Увеличьте системные лимиты в файле limits.conf:
sudo nano /etc/security/limits.confДобавьте в самый конец файла строки:
* soft nofile 65535 * hard nofile 65535 root soft nofile 65535 root hard nofile 65535 - Увеличьте глобальный лимит ядра Linux:
sudo nano /etc/sysctl.confДобавьте параметр:
fs.file-max = 2097152и примените командойsudo sysctl -p. - Для служб под управлением Systemd (Nginx, MySQL, Docker):
Откройте переопределение службы, например Nginx:sudo systemctl edit nginxи вставьте:
Затем выполните:[Service] LimitNOFILE=65535sudo systemctl daemon-reload && sudo systemctl restart nginx.
Разница Soft и Hard: Soft limit — это текущее действующее ограничение для пользователя, а Hard limit — максимальный потолок, выше которого пользователь не может поднять лимит самостоятельно.
Частые вопросы (FAQ)
Как временно поднять лимит в текущем терминале?
Выполните команду `ulimit -n 65535`. Лимит будет действовать только для текущей командной строки и запущенных в ней программ.
Нужно ли перезагружать сервер после изменения limits.conf?
Сервер перезагружать не обязательно, но пользователю потребуется перелогиниться по SSH, чтобы новые лимиты вступили в силу.
Как узнать сколько файлов открыто в системе прямо сейчас?
Выполните команду `cat /proc/sys/fs/file-nr`. Первое число покажет количество открытых в данный момент дескрипторов.
Почему limits.conf не помогает сервисам Nginx или Redis?
Службы, запускаемые демоном systemd, игнорируют файл `limits.conf`. Для них лимит задается строго через параметр `LimitNOFILE=` в unit-файле службы.