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

    • 指定したユーザは5スレッド以上スレッドを実行できない
      # rctl -a user:<USER NAME>:nthr:deny=5
      

他にもメモリなどの制御もいろいろできるみたいです。 再起動すると、設定が消えてしまうので、永続化させる場合は /etc/rctl.conf に記載すればいいようです。