====== FreeBSDのrctlコマンドでプロセスのCPU利用率を制限する ======
FreeBSD 9.0で登場した''rctl''コマンドを使うと、システムの種々の資源を様々な粒度で制限することが出来る。
ここではプロセスのCPU利用率を制御してみる。
===== 試した環境 =====
* FreeBSD 11.1-RELEASE-p4
===== 手順 =====
==== 準備 ====
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
==== プロセスのCPU利用率を制限する ====
rctlによるリソース制御は、ipfwのようにシステムにルールを追加/削除する形で行う。
プロセスのCPU利用率制限ルールは次のようになる。
rctl -a process:プロセスID:pcpu:deny=CPUを利用させない割合
pcpu(割合によるCPU資源の割り当て)はFreeBSD 10から使える機能のようだ。
実際に指定してみた例。ありったけのCPUリソースを持っていくプログラムminerdを、左が制限なし、右がrctlでdeny=50とした時のtopの図。
|{{ :freebsd:top_result_no_limitting_minerd.gif |}}|{{ :freebsd:top_result_limitting_minerd_by_rctl.gif |}}|
rctlでCPUリソースが制限されている様子が分かる。
挙動を見る限り、ある程度のスパンの平均を指定値に近づける戦略が取られているようだ。スクショではminerdへのCPU割り当てが0%と100%を行ったり来たりの極端な挙動となっているが、継続的に30~70%を割り当てて平均50%とする制御方法も確認した。どうのような条件で、制御方法に差が生じるのかは不明。
また、システム全体が高負荷となっている場合の挙動も未確認なので、利用する際は各自テストされたし。
===== 参考サイト =====
* [[https://www.freebsd.org/cgi/man.cgi?query=rctl&sektion=8|rctl(8)]]
* [[https://wiki.freebsd.org/Hierarchical_Resource_Limits|Hierarchical_Resource_Limits - FreeBSD Wiki]]
* [[https://wiki.freebsd.org/SummerOfCode2012/CPULimits|SummerOfCode2012/CPULimits - FreeBSD Wiki]]
* [[http://www.atmarkit.co.jp/ait/articles/1206/25/news141.html|FreeBSDのコレ知ってる?(1):自由な設定が可能な最新リソース制御機能 (1/2) - @IT]]