Заметки о ограничения ресурсов FreeBSD
Сервер
Published: 2022-08-10

Я не был очень знаком с этим, поэтому кратко исследовал.

В 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
      
  • nthr

    • Указанный пользователь не сможет выполнять более 5 потоков
      # rctl -a user:<USER NAME>:nthr:deny=5
      

Кроме того, есть множество других способов управления памятью и другими ресурсами. После перезагрузки настройки будут потеряны, поэтому для их сохранения рекомендуется записать в /etc/rctl.conf.