因为我对这个不是很了解,所以粗略地查了一下。
在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
- 指定用户最多只能启动5个进程(fork会失败)
nthr
- 指定用户最多只能执行5个线程
# rctl -a user:<USER NAME>:nthr:deny=5
- 指定用户最多只能执行5个线程
还有许多其他关于内存等方面的控制。 重启后,设置会消失,所以如果要持久化,可以在/etc/rctl.conf中进行记录。