CentOSのリソースを制御するためにcgroupを検証した話

経緯

最近読んでいる「プロのための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などで活用している事例があるようです。

実際は各サーバーやサービスなどにあわせて設定しなければいけないので、かなり検証した上で値を決定したほうが良いとは思いますが、一つ覚えておくと便利かなと思いました。

 

以上