В этой статье разберём:
- что такое
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 в терминале
Чтобы изменить ограничение на количество открытых файлов (-n):
Soft limit:
ulimit -Sn 4096
Hard limit:
sudo ulimit -Hn 8192
Ограничение памяти (виртуальной):
ulimit -Sv 1048576 # 1 ГБ
Важно: настройки ulimit, применённые в shell, работают только до выхода из сессии.
Постоянные лимиты в /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).
Ограничение ресурсов 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 от неконтролируемых процессов и повышают надёжность всей системы. Это один из обязательных элементов системного администрирования.