Я не был очень знаком с этим, поэтому кратко исследовал.
В FreeBSD используется RCTL, поэтому нужно использовать ядро, в котором активированы RACCT и RCTL.
Похоже, что Generic-ядро FreeBSD 13.1 активно, поэтому нужно активировать его в loader.conf.
root@freebsd13:~ # grep -E 'RACCT|RCTL' /usr/src/sys/amd64/conf/GENERIC
options RACCT # Фреймворк учёта ресурсов
options RACCT_DEFAULT_TO_DISABLED # Установить kern.racct.enable=0 по умолчанию
options RCTL # Ограничения ресурсов
# echo "kern.racct.enable=1" >> /boot/loader.conf
# reboot
Команда rctl
rctl -a Добавить правило
-r Удалить
-u Показать текущие значения ограничений
-h Человеко-читаемая форма
Без параметров Показать список правил
Удаление и показ списка можно фильтровать по user: или ::maxproc: и т.д.
Пример)
# rctl user:
user:admin:pcpu:deny=10
Диапазон ограничения
Можно устанавливать ограничения на уровне process, user, loginclass, jail.
Ограничения на уровне процесса
# rctl -a process:<PID>:<resource>:<action>=<amount>
- Ограничения наследуются дочерними процессами, но ограничиваются по процессу.
Ограничения на уровне пользователя
# rctl -a user:<USER NAME>:<resource>:<action>=<amount> # rctl -a user:<UID>:<resource>:<action>=<amount>
Ограничения для пользователя на уровне процесса
# rctl -a user:<USER NAME>:<resource>:<action>=<amount>/process # rctl -a user:<UID>:<resource>:<action>=<amount>/process
loginclass и jail также могут быть ограничены на этом уровне.
CPU
cputime
- Использует время CPU процесса (время исполнения CPU) в правилах
- Можно использовать действия log, devctl, sig и т.д.
- Если время использования CPU процесса с PID превышает 100 секунд, записать в лог
# rctl -a process:<PID>:cputime:log=100
pcpu
- Указывается в процентах на один ядро CPU
- При просмотре с помощью top значения ограничиваются не напрямую, а по среднему значению.
- Установить ограничение в 20% на одно ядро CPU (для 2 ядер соответственно 200%).
# rctl -a process:<PID>:pcpu:deny=20
Контроль процесса
maxproc
- Указанный пользователь не сможет запустить более 5 процессов (возникнет ошибка fork).
# rctl -a user:<USER NAME>:maxproc:deny=5
- Указанный пользователь не сможет запустить более 5 процессов (возникнет ошибка fork).
nthr
- Указанный пользователь не сможет выполнять более 5 потоков
# rctl -a user:<USER NAME>:nthr:deny=5
- Указанный пользователь не сможет выполнять более 5 потоков
Кроме того, есть множество других способов управления памятью и другими ресурсами. После перезагрузки настройки будут потеряны, поэтому для их сохранения рекомендуется записать в /etc/rctl.conf.