FreeBSD 9.0で登場したrctl
コマンドを使うと、システムの種々の資源を様々な粒度で制限することが出来る。
ここではプロセスのCPU利用率を制御してみる。
rctlを使うにはカーネルのRACCT機能を有効にする必要がある。(RACCTって何の略なんだろう…リソースなんちゃらだとは思うけど。)
/boot/loader.conf
に次の一文を追加し、システムを再起動する。
# echo 'kern.racct.enable="1"' >> /boot/loader.conf # reboot
再起動後、とりあえずrctlコマンドを叩いて以下のように言われればRACCTが機能している。
$ rctl rctl: failed to show rules for '::': Operation not permitted
rctlによるリソース制御は、ipfwのようにシステムにルールを追加/削除する形で行う。
プロセスのCPU利用率制限ルールは次のようになる。
rctl -a process:プロセスID:pcpu:deny=CPUを利用させない割合
pcpu(割合によるCPU資源の割り当て)はFreeBSD 10から使える機能のようだ。
実際に指定してみた例。ありったけのCPUリソースを持っていくプログラムminerdを、左が制限なし、右がrctlでdeny=50とした時のtopの図。
rctlでCPUリソースが制限されている様子が分かる。
挙動を見る限り、ある程度のスパンの平均を指定値に近づける戦略が取られているようだ。スクショではminerdへのCPU割り当てが0%と100%を行ったり来たりの極端な挙動となっているが、継続的に30~70%を割り当てて平均50%とする制御方法も確認した。どうのような条件で、制御方法に差が生じるのかは不明。
また、システム全体が高負荷となっている場合の挙動も未確認なので、利用する際は各自テストされたし。