SystemdDoctor

Пределы ресурсов в unit-файле не применяются

Пределы ресурсов службы задаются только в unit-файле. Настройки в /etc/security/limits.conf относятся к входу пользователя в систему и на службы не влияют — это самая частая причина «я поднял лимит, а он прежний».

Вероятные причины

По порядку: сверху то, что встречается чаще.

  1. Предел задан в limits.conf

    Этот файл читает модуль PAM при входе пользователя. Служба запускается менеджером напрямую, без входа в систему.

  2. Предел изменён, но служба не перезапущена

    Пределы применяются при запуске процесса. Перезагрузка конфигурации их не меняет.

  3. Программа сама понижает предел

    Часть программ выставляет свой предел при старте, игнорируя заданный. Тогда unit-файл тут не поможет.

Диагностика

Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.

Действующие пределы процесса — единственный достоверный источник.

PID=$(systemctl show -p MainPID --value myapp.service); cat /proc/$PID/limits

Что задано в unit-файле.

systemctl show myapp.service | grep ^Limit

Общее значение по умолчанию для всех служб.

systemctl show -p DefaultLimitNOFILE

Решение

Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.

1. Предел задан в limits.conf
Почему происходит
Этот файл читает модуль PAM при входе пользователя. Служба запускается менеджером напрямую, без входа в систему.
Как проверить
Посмотрите действующий предел процесса службы.
PID=$(systemctl show -p MainPID --value myapp.service); cat /proc/$PID/limits | head -12
Как исправить
Задайте предел в unit-файле через переопределение и перезапустите службу.
sudo systemctl edit myapp.service   # [Service]\nLimitNOFILE=65535
2. Предел изменён, но служба не перезапущена
Почему происходит
Пределы применяются при запуске процесса. Перезагрузка конфигурации их не меняет.
Как проверить
Сравните заданное и действующее значение.
systemctl show myapp.service -p LimitNOFILE
PID=$(systemctl show -p MainPID --value myapp.service); grep -i "open files" /proc/$PID/limits
Как исправить
Перезапустите службу полностью: systemctl restart, а не reload.
3. Программа сама понижает предел
Почему происходит
Часть программ выставляет свой предел при старте, игнорируя заданный. Тогда unit-файл тут не поможет.
Как проверить
Сравните предел процесса с заданным в unit.
PID=$(systemctl show -p MainPID --value myapp.service); grep -i "open files" /proc/$PID/limits
Как исправить
Настройте предел в самой программе: у баз и веб-серверов для этого есть собственные параметры.

Пример вывода

В limits.conf предел поднят, у службы прежний. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.

$ grep nofile /etc/security/limits.conf
*    soft    nofile    65535

$ PID=$(systemctl show -p MainPID --value myapp.service); grep -i "open files" /proc/$PID/limits
Max open files            1024                 524288               files

Связанные ошибки

Где встречается чаще всего

Источники

  • systemd.exec(5)
    Limit*= и отношение к limits.conf.
    официальная документация, systemd 255
    сверено 15 сентября 2026
  • Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
    Проверено: значение из limits.conf на службу не действует.
    собственная проверка, systemd 255
    сверено 15 сентября 2026