FreeBSD资源限制的备忘录
服务器
Published: 2022-08-10

因为我对这个不是很了解,所以粗略地查了一下。

在FreeBSD中,需要使用RCTL,因此需利用启用RACCT、RCTL的内核
FreeBSD 13.1的Generic内核似乎是启用的,可以在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等。
    • 如果PID的CPU使用时间超过100秒,则记录到日志
      # rctl -a process:<PID>:cputime:log=100
      
  • pcpu

    • 以每个核心的百分比来指定
    • 在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中进行记录。