LinuxのCFSのBandwidth Controlを使って簡単にプロセス単位でのCPU消費量を制御できるツールをPerlで書いてみました。Linux Kernel 3.4.7で動作確認済みです。kernelのコンパイルオプションで「CONFIG_CFS_BANDWIDTH」を有効にしましょう。
CFSのBandwidth ControlはLinux3.2からの新しい機能のようです。本エントリではその詳しい話は割愛して、作ったツールの使い方を見て行きましょう。例の如くGithubにソースをあげています。
run-cpu-rate – コマンド実行時からCPU消費量を任意の値で制御しながら実行
run-cpu-rateコマンドは、実行時から任意のCPU消費量に制限してコマンドを実行したい場合に使います。使い方は簡単で以下のように実行します。第一引数にCPU消費量、第二引数以降に実行コマンドを渡します。
./run-cpu-rate 50 sh while.sh
例えば、無限ループだけするようなツールwhile.shがあったとします。その場合、そのwhile.shを実行すると通常はCPUを100%使ってしまいます。このように、実行する前からCPU消費量が多いと分かっていて、なおかつ時間がかってもいいからどろどろと実行したい場合に、例えばCPU消費量を50%(任意の値)に制限してコマンドを実行することができます。
実行後、topで確認すると以下のようになります。psで得られるCPU消費量は実行後の統計値になるので、リアルタイムのCPU消費量はtopで確認するようにしましょう。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
5020 root 20 0 3304 968 840 R 49.9 0.0 0:05.97 sh
例えば、ログ解析で時間はかかっていいけど、他のサービスに迷惑がかからない程度で解析して欲しい場合は、10%ぐらいに指定して実行すれば良いでしょう。実行させたまま、安心して家に帰る事だってできるでしょう。また、プロセスの処理が終了時は、CPU消費量設定のために作成したディレクトリやファイル群のゴミ掃除もしてくれるので、/sys/fs/cgroups/cpu/cpu_manage/以下のゴミディレクトリをあまり気にする必要がないのも良い所です。
change-cpu-rate – 起動中のプロセスのCPUの消費量を変更
change-cpu-rateは、すでに動いているプロセスに対してPIDを元にCPU消費量を変更するためのツールです。例えば、以下のようにApacheで動いているcgiがCPUを食い尽くしていたとします、
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
5023 root 20 0 2304 921 740 R 99.2 0.0 0:02.38 mt.cgi
この場合は、以下のようにCPUの消費量を30%に変更してやります。
./change-cpu-rate -p 5023 -r 30
すると、このように暴れていたcgiのCPUを30%以下に制御することができます。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
5023 root 20 0 2304 921 740 R 29.9 0.0 0:03.18 mt.cgi
また、CPUの制御を解除したい場合はrateに0を渡してやります。
./change-cpu-rate -p 5023 -r 0
これで、制限のかかっていない状態に戻ります。
こちらのツールは、CPU消費量制限中にプロセスが終了した場合、run-cpu-rateと違ってゴミが/sys/fs/cgoups/cpu/cpu_manage/以下に残ってしまうので、注意が必要です。-r 0で事前に制限を解除していれば、ゴミが残る事はありません。ゴミが残っていてもおそらく問題はないと思いますが、実運用してみると思わぬ落とし穴があるかもしれません。
さいごに
CFSの勉強がてら、CPU消費量制限を手動でやっていると、あまりに面倒だったのでツール化してみると、意外と便利だったので公開しました。メンテナンス時に他のサービスに影響は与えたくないけど実行しないといけないようなコマンドや、負荷をかけてるユーザを制限するため等に使えると思います。気が向いたら、IOやトラフィック、メモリを制限するツールも作るかもしれません。まぁ、元々のこのツールを作ろうと思ったモチベーションは以下の呟きからなんですけどね。
Linuxだったらiphotoに対してcgroupでCPUの制限をしているところだったが、Macなので遺憾ながら見逃している。
— MATSUMOTO, Ryosukeさん (@matsumotory) 8月 5, 2012
「LinuxのCFSを使ってプロセスのCPU消費量を制御するツール作った」への1件のフィードバック
コメントは受け付けていません。