Как настроить ограничения ресурсов для пользователей и процессов (ulimit, systemd) на VPS?

В этой статье разберём:

  • что такое ulimit и как работают soft/hard limits;
  • как задавать ограничения для пользователей;
  • как управлять лимитами через /etc/security/limits.conf;
  • как применять ограничения на уровне systemd (для сервисов);
  • как проверять текущие лимиты и диагностировать ошибки.

Как работает ulimit и зачем он нужен

ulimit ограничивает ресурсы для текущей shell-сессии или процессов, запущенных внутри неё. Используются два типа лимитов:

  • soft — текущее значение, которое пользователь может изменить;
  • hard — максимальное значение, которое может установить только root.

Проверим все текущие ограничения:

ulimit -a

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

open files                      (-n) 1024
max user processes              (-u) 3777
file size                       (blocks, -f) unlimited
Вывод ulimit -a

Настройки ulimit в терминале

Чтобы изменить ограничение на количество открытых файлов (-n):

Soft limit:

ulimit -Sn 4096

Hard limit:

sudo ulimit -Hn 8192

Ограничение памяти (виртуальной):

ulimit -Sv 1048576   # 1 ГБ

Важно: настройки ulimit, применённые в shell, работают только до выхода из сессии.

Настройка ulimit в терминале

Постоянные лимиты в /etc/security/limits.conf

Чтобы ограничения действовали всегда, измените файл:

sudo nano /etc/security/limits.conf

Примеры правил:

# Ограничение для пользователя developer
developer soft nofile 4096
developer hard nofile 8192

# Ограничение на количество процессов
developer soft nproc 2000
developer hard nproc 4000

# Групповое правило
@developers soft nofile 4096

Для применения ограничений нужно выйти и войти снова (или перезагрузить сервис, который использует PAM).

Пример limits.conf

Ограничение ресурсов systemd (для сервисов)

Если приложение работает как systemd-сервис, лучше применять ограничения на уровне systemd — они жёстче и стабильнее.

Открываем юнит-файл:

sudo systemctl edit nginx

Появится файл override.conf:

[Service]
LimitNOFILE=8192
LimitNPROC=4096
MemoryMax=512M
CPUQuota=50%

Пояснения:

  • LimitNOFILE — количество открытых файлов;
  • LimitNPROC — число процессов;
  • MemoryMax — максимальная память для сервиса;
  • CPUQuota — ограничение загрузки CPU (например, 50% одного ядра);

Перезапускаем службу:

sudo systemctl daemon-reload
sudo systemctl restart nginx

Ограничение CPU, RAM и IO через systemd

Systemd также может задавать ограничения на уровне cgroups:

Ограничение CPU:

CPUQuota=25%

Ограничение памяти:

MemoryMax=1G

Ограничение дискового IO:

IOReadBandwidthMax=/dev/sda 10M
IOWriteBandwidthMax=/dev/sda 5M

Ограничения IO работают только в системах с поддержкой cgroups v2.

Проверка активных ограничений

Проверка ulimit для процесса:

cat /proc/<PID>/limits

Проверка ограничений systemd:

systemctl status nginx

Проверка cgroups:

systemctl show nginx | grep -E 'CPU|Memory|IO'
Проверка ограничений процесса

Типичные ошибки и их исправление

1. «Too many open files»

Увеличьте лимит:

sudo nano /etc/security/limits.conf

2. systemd игнорирует LimitNOFILE

Проверьте, не стоит ли в юните:

PrivateTmp=yes

3. Ограничения не применяются к SSH

Проверьте PAM:

grep pam_limits.so /etc/pam.d/sshd

4. «Failed to parse resource control» — ошибка systemd

Вероятно, система работает на cgroups v1. Проверить:

cat /sys/fs/cgroup/cgroup.controllers

Итоги

  • Разобрали, как работает ulimit и какие лимиты он задаёт.

  • Настроили постоянные ограничения через limits.conf.

  • Выставили системные лимиты для сервисов через systemd.

  • Разобрали ограничения CPU, RAM и IO через cgroups.

  • Научились проверять активные лимиты и устранять типичные ошибки.

Вывод: корректно настроенные ограничения ресурсов защищают VPS от неконтролируемых процессов и повышают надёжность всей системы. Это один из обязательных элементов системного администрирования.

Оставить комментарий