Справочник системных ошибок и решений

Windows Server, Active Directory, 1С:Предприятие, СУБД, Linux, Cisco, MikroTik, Asterisk.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты на сайте предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, программного обеспечения, баз данных, сетевого оборудования и других компонентов инфраструктуры. Перед выполнением действий создайте резервную копию и по возможности протестируйте изменения в безопасной среде. Пользователь самостоятельно оценивает риски и несет ответственность за результат. При отсутствии необходимых знаний обратитесь к квалифицированному ИТ-специалисту.

Too many open files Linux / DevOps

Ошибка Too many open files в Linux: увеличение ulimit и limits.conf

Обновлено: 27.08.2026 · Официальная документация ↗

Почему возникает сбой 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)

Пошаговое увеличение лимитов дескрипторов

  1. Проверьте текущие лимиты:
    ulimit -n
  2. Увеличьте системные лимиты в файле limits.conf:
    sudo nano /etc/security/limits.conf

    Добавьте в самый конец файла строки:

    * soft nofile 65535
    * hard nofile 65535
    root soft nofile 65535
    root hard nofile 65535
  3. Увеличьте глобальный лимит ядра Linux:
    sudo nano /etc/sysctl.conf

    Добавьте параметр: fs.file-max = 2097152 и примените командой sudo sysctl -p.

  4. Для служб под управлением Systemd (Nginx, MySQL, Docker):
    Откройте переопределение службы, например Nginx: sudo systemctl edit nginx и вставьте:
    [Service]
    LimitNOFILE=65535
    Затем выполните: sudo systemctl daemon-reload && sudo systemctl restart nginx.

Разница Soft и Hard: Soft limit — это текущее действующее ограничение для пользователя, а Hard limit — максимальный потолок, выше которого пользователь не может поднять лимит самостоятельно.

💡 Практика специалистов: Для высоконагруженных веб-серверов выставляйте `LimitNOFILE=100000` и не забудьте синхронно увеличить директиву `worker_rlimit_nofile 100000;` в главном контексте файла `/etc/nginx/nginx.conf`.

Частые вопросы (FAQ)

Как временно поднять лимит в текущем терминале?

Выполните команду `ulimit -n 65535`. Лимит будет действовать только для текущей командной строки и запущенных в ней программ.

Нужно ли перезагружать сервер после изменения limits.conf?

Сервер перезагружать не обязательно, но пользователю потребуется перелогиниться по SSH, чтобы новые лимиты вступили в силу.

Как узнать сколько файлов открыто в системе прямо сейчас?

Выполните команду `cat /proc/sys/fs/file-nr`. Первое число покажет количество открытых в данный момент дескрипторов.

Почему limits.conf не помогает сервисам Nginx или Redis?

Службы, запускаемые демоном systemd, игнорируют файл `limits.conf`. Для них лимит задается строго через параметр `LimitNOFILE=` в unit-файле службы.

Полезные материалы
Рекомендуем