経緯
最近読んでいる「プロのためのLinuxシステム・10年効く技術」にRedhat6以降からcgroupというリソース制御の仕組みが利用できるようになったのを拝見しました。
また、ペパボ福岡支社のインフラエンジニアの方の「次世代ホスティングの話し」にもcgroupのことが書かれていたので、せっかくなので検証してみることにしました。
パッケージのインストール
# yum install libcgroup
# chkconfig cgconfig on
# service cgconfig start
事前確認
ddでチェックしてみます。2GBのファイルを作成してみます。oflag=directでキャッシュを無効にしています。
# dd if=/dev/zero of=test.img bs=1K count=2000000 oflag=direct
# top <–別シェルで実行
Tasks: 127 total, 3 running, 124 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 2.4%sy, 0.0%ni, 0.0%id, 94.0%wa, 2.4%hi, 1.2%si, 0.0%st
Mem: 1020176k total, 305056k used, 715120k free, 6540k buffers
Swap: 1036284k total, 0k used, 1036284k free, 128060k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2175 root 20 0 102m 720 608 R 27.6 0.1 0:10.50 dd
私の環境ではデフォルトの結果として、CPU使用率は27%前後でした。
設定
# cp -p /etc/cgconfig.conf /etc/cgconfig.conf.`date +%Y%m%d`
# vim /etc/cgconfig.conf
group yes {
cpu {
cpu.cfs_quota_us = 50000;
cpu.cfs_period_us = 1000000;
}
cpuacct {
}
}
グループ名のyesはyesコマンドでテストするためにそのようにしましたが、特に意味は無いです。
cpu.cfs_period_usの値はマイクロ秒のようで、1000000分の50000に制限するという設定です。
実行する際は、
# cgexec -g cpu:yes コマンド
っていう感じで実行します。
テスト
“cgexec -g cpu:yes yes”を別のシェルを4つ立ち上げて、それぞれで実行し、計4つ実行させてみました。
そして、同時にddを同じように再実行します。
[結果]
Tasks: 149 total, 7 running, 142 sleeping, 0 stopped, 0 zombie
Cpu(s): 1.0%us, 5.4%sy, 0.0%ni, 0.0%id, 92.6%wa, 0.3%hi, 0.7%si, 0.0%st
Mem: 1020176k total, 323256k used, 696920k free, 7052k buffers
Swap: 1036284k total, 0k used, 1036284k free, 129924k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2251 root 20 0 102m 724 608 R 1.0 0.1 0:01.89 dd
2288 root 20 0 98.5m 604 516 R 1.0 0.1 0:00.43 yes
2289 root 20 0 98.5m 600 516 R 1.0 0.1 0:00.40 yes
2290 root 20 0 98.5m 600 516 R 1.0 0.1 0:00.38 yes
2327 root 20 0 98.5m 604 516 R 1.0 0.1 0:00.17 yes
CPUを全体の5%の中で分けあって使ってることがわかります。
このようにさっくり設定しても簡単に制御できました。
設定する値は、CPU以外にメモリや帯域、IOなども制御出来るようなので幅広い用途で使用できそうです。
特に色々記事をみていると、dockerなどで活用している事例があるようです。
実際は各サーバーやサービスなどにあわせて設定しなければいけないので、かなり検証した上で値を決定したほうが良いとは思いますが、一つ覚えておくと便利かなと思いました。
以上