Периодически при работе сервера вы можете столкнуться с ошибкой «Too many open files» в Linux системах. Чаще всего это бывает на нагруженных серверах. Это значит, что сервер достиг лимита на количество открытых файлов. Этот лимит может быть указан для конкретного пользователя или сессии.
В этой статье я расскажу какие бывают лимиты (а их два вида) и как их увеличить.
Лимитов существует два вида:
- Жесткий лимит — максимальное количество открытых файлов для пользователя или сессии. Устанавливается только администратором/root
- Мягкий лимит — текущее эффективное значение для пользователя или сессии. Может быть изменен самим пользователем, но значение не может превышать жесткого лимита.
Проверка текущих лимитов
Для контроля лимита ресурсов в Linux имеется утилита ulimit.
Получим текущее значение лимитов:
ulimit -a
В результате выполнения команды вы увидите список текущих лимитов, а именно тип лимита и его значение.
Чтобы узнать жесткий и мягкие лимиты, используйте следующие команды:
ulimit -Sn # Мягкий лимит ulimit -Hn # Жесткий лимит
Увеличение лимита для текущей сесии
Большинство операционных систем позволяют изменить лимит открытых файлов для текущей сессии с помощью команды ulimit -n:
ulimit -n 20000
Увеличение лимита для пользователя
Вы также можете изменить лимиты для каждого пользователя в отдельности. Для этого нужно отредактировать файл /etc/security/limits.conf в удобном вам редакторе, в моем случае это будет vim
vim /etc/security/limits.conf
и добавить в него следующие строки:
* soft nproc 65535 * hard nproc 65535 * soft nofile 65535 * hard nofile 65535 max soft nproc 20000 max hard nproc 20000 max soft nofile 20000 max hard nofile 20000
Это значит, что для пользователя «max» будут установлены лимиты в 20000, а для всех остальных пользователей — 65535. Измените эти значение по своему усмотрению.
Изменение лимита для всей системы
Вы также можете изменить лимиты для всех пользователей системы, для этого нужно отредактировать параметры sysctl. Откройте в редакторе файл /etc/sysctl.conf и добавьте следующую строку:
fs.file-max = 131070
После чего примените эти изменения командой
sysctl -p
Этим вы установили лимиты для всей системы. Лимиты для конкретного пользователя или сессии не могут превышать лимитов системы.