あまり私は詳しくなかったのでざっくり調べてみました。
FreeBSDではRCTLを使うため、RACCT、RCTLが有効なカーネルを利用する
FreeBSD 13.1のGenericカーネルは有効のようなのでloader.confで有効化する
root@freebsd13:~ # grep -E 'RACCT|RCTL' /usr/src/sys/amd64/conf/GENERIC
options RACCT # Resource accounting framework
options RACCT_DEFAULT_TO_DISABLED # Set kern.racct.enable=0 by default
options RCTL # Resource limits
# 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 time(CPU実行時間)をルールに使う
- アクションは log、devctl、sig などが使える。
- PIDのCPU使用時間が100秒を超えたらログに記録する
# rctl -a process:<PID>:cputime:log=100
pcpu
- CPUの1コアあたりのパーセントで指定する
- topで見ると綺麗に制限されるのではなく、平均値が制限値になってそう。
- 1コアあたりのCPU20%で制限をかける (2コアなら200%とかでよさそう。)
# rctl -a process:<PID>:pcpu:deny=20
プロセス制御
maxproc
- 指定したユーザは5プロセス以上起動できなくする(forkに失敗する)
# rctl -a user:<USER NAME>:maxporc:deny=5
- 指定したユーザは5プロセス以上起動できなくする(forkに失敗する)
nthr
- 指定したユーザは5スレッド以上スレッドを実行できない
# rctl -a user:<USER NAME>:nthr:deny=5
- 指定したユーザは5スレッド以上スレッドを実行できない
他にもメモリなどの制御もいろいろできるみたいです。 再起動すると、設定が消えてしまうので、永続化させる場合は /etc/rctl.conf に記載すればいいようです。