漢ならアプリに CPU 優先度を付けて実行したいですよね! でも nice だとうまくいかない… 悲しくて涙で枕を濡らす日々が続いていました…
そこで昨今の Linux に搭載されている cgroups による CPU リソース制御を使ってみます.
当然ベンチマークアプリは aobench http://code.google.com/p/aobench/ ですね.
OpenMP 化してマルチスレッド実行するようにしておきましょう.
設定
cgroups の機能を有効にしておきます.
$ sudo chkconfig cgconfig on
$ sudo service cgconfig start
aobench 用のグループを作ります.
$ sudo cgcreate -g cpu:/aobench-group
ディレクトリが出来ているのを確認します.
$ ls /cgroup/cpu/aobench-group
CPU 利用率を 50% に設定します.
$ sudo sh -c "echo 50000 > /cgroup/cpu/aobench-group/cpu.cfs_quota_us"
実行
まずは普通に aobench 実行します.
$ ./ao
$ top
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
15813 syoyo 20 0 114m 26m 932 R 794.9 0.1 2:13.43 ao
4 core(8 HT cores) なので理論上 800% のうち 750% ~ 795% くらい出ています. 期待通りですね.
cgroup の設定を使って 50% の利用率になるように実行してみます.
$ sudo cgexec -g cpu:aobench-group ./ao
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
16300 root 20 0 114m 26m 940 R 49.9 0.1 0:21.94 ao
50% にはなりましたが, 物理 1 コアの半分での 50% になってしまいました… 400% が期待される結果なのですが, マルチコアでの設定はなにかやりかたが違うのでしょうかね.
TODO
- Docker で使いたい
- マルチコア環境での設定方法
References
- [Linux][cgroup]cgroupを使ってCPUとメモリの割り当てを制限する http://d.hatena.ne.jp/nullpobug/20140619/1403185834