Введение / Зачем это нужно
В Linux каждому процессу и пользователю назначаются ограничения на использование ресурсов: количество открытых файлов, запущенных процессов, память и другие объекты. Эти ограничения управляются командой ulimit. Если лимиты слишком низкие, приложения могут выдавать ошибки вроде «Too many open files» или отказываться создавать новые потоки и соединения.
После выполнения этого гайда вы научитесь временно и постоянно увеличивать лимиты ulimit для сессий, пользователей и systemd-сервисов, а также сможете выбирать подходящий метод в зависимости от задачи.
Требования / Подготовка
- Сервер или ПК с Linux (Ubuntu, Debian, CentOS, RHEL).
- Права пользователя с доступом к
sudoили root для редактирования системных файлов. - Установленный текстовый редактор (
nano,vimили другой). - Для настройки systemd — наличие управляемого сервиса, лимиты которого нужно изменить.
Шаг 1: Проверить текущие лимиты
Перед изменением узнайте текущие значения. Для текущей оболочки выполните:
ulimit -a
Эта команда покажет все лимиты: -n (максимум открытых файлов), -u (максимум процессов пользователя), стек и другие параметры.
Для проверки лимитов конкретного процесса используйте его PID:
cat /proc/<PID>/limits
Также можно проверить глобальный предел открытых файлов в системе:
cat /proc/sys/fs/file-max
Шаг 2: Временно увеличить лимиты в сессии
Если нужно быстро поднять лимиты для текущей оболочки или скрипта, используйте ulimit. Например, для мягкого лимита открытых файлов:
ulimit -n 65536
Для максимума процессов пользователя:
ulimit -u 16384
⚠️ Важно: такие изменения действуют только в текущей сессии и не сохранятся после перезапуска терминала или системы. Кроме того, мягкий лимит не может превышать жёсткий — проверить его можно командой
ulimit -Hn.
Шаг 3: Настроить постоянные лимиты через limits.conf
Для постоянного увеличения лимитов по пользователям или группам отредактируйте /etc/security/limits.conf. Откройте файл с правами root:
sudo nano /etc/security/limits.conf
Добавьте строки по образцу:
# Для конкретного пользователя
username soft nofile 65536
username hard nofile 1048576
username soft nproc 16384
username hard nproc 32768
# Для группы
@groupname soft nofile 32768
@groupname hard nofile 524288
Здесь:
soft— мягкий лимит, который пользователь может повышать до жёсткого.hard— жёсткий лимит, который может изменить только root.nofile— максимум открытых файловых дескрипторов.nproc— максимум процессов на пользователя.
Сохраните файл. Чтобы настройки применились, перезайдите в сессию пользователя или перезагрузите систему.
Шаг 4: Настроить лимиты для systemd-сервисов
Если лимиты нужны для сервиса, запускаемого через systemd, используйте drop-in-файлы. Например, для nginx:
sudo systemctl edit nginx
Добавьте секцию с нужными лимитами:
[Service]
LimitNOFILE=65536
LimitNPROC=16384
Сохраните файл, затем перезапустите сервис:
sudo systemctl daemon-reload
sudo systemctl restart nginx
Вы можете проверить применение лимитов командой:
systemctl show nginx --property=LimitNOFILE,LimitNPROC
Шаг 5: Применить системные лимиты через sysctl
Для глобального ограничения и увеличения максимума открытых файлов в системе настройте fs.file-max. Откройте /etc/sysctl.conf:
sudo nano /etc/sysctl.conf
Добавьте или измените строку:
fs.file-max = 2097152
Примените настройку:
sudo sysctl -p
Этот параметр влияет на всю систему, но не отменяет пользовательские и сервисные лимиты — он задаёт верхнюю границу для всех процессов вместе.
Проверка результата
Убедитесь, что лимиты применились:
- Для текущей сессии:
ulimit -a. - Для пользователя после перелогина:
ulimit -nиulimit -u. - Для systemd-сервиса:
systemctl show <сервис> --property=LimitNOFILE,LimitNPROC. - Для процесса:
cat /proc/<PID>/limits.
Если значения не изменились, проверьте, не переопределяются ли лимиты в /etc/security/limits.d/, настройках PAM или drop-in-файлах systemd.
Возможные проблемы
- Лимиты не применяются для графических сессий — убедитесь, что PAM читает
limits.conf, и при необходимости настройте/etc/pam.d/common-session. - systemd игнорирует
limits.confдля своих сервисов — всегда используйте drop-in-файлы для systemd-юнитов. - Жёсткий лимит ниже нужного — повысьте его в
limits.confс ключомhardили временно черезulimit -Hnот root. - Ошибки выделения памяти или файлов после увеличения
nofile— проверьтеfs.file-maxи доступную память, чтобы система могла обслуживать новые дескрипторы.