AWSのt1.microのCPUがStealする話。
色々散々出てきているので既知の話だと思いますが cgroup するのがRedhat経の話ばかりでUbuntuのやり方が出ていなかったのでその二番煎じの記事です。
なので環境はUbuntuで実施しています。
1) install cgroup-bin
sudo apt-get install cgroup-bin
2) Reboot.
リブートすると /sys/fs/cgroup ができていると思います。再起動しなくてもできている?
3) Edit /etc/cgconfig.conf
このファイルは存在しないので1から作ります。制限をかけるのがユーザが別なのかRootユーザなのかで変わってくると思いますが。
group limit {
cpu {
cpu.cfs_quota_us = 250000;
cpu.cfs_period_us = 1000000;
}
cpuacct {
}
}
その後
cgconfigparser -l /etc/cgconfig.conf
を実行。これを実行しておかないと [cgroup change of group failed]というエラーが表示されました。
4) Run Process.
cgexec -g cpu:limit perl ./test1.pl &
上記は適宜読み替えて下さい。
画像ではあえて2つのユーザでPerを実行していますが25%,25%づつになっているのがわかります。(このサーバはt1.microではないのでstealは発生していません)
起動時には cgconfig.conf を読み込んでくれません。cgconfigpaserを実行した後に cpu/limit のディレクトリが作成されます。ubuntuのパッケージは自動起動用のツールが用意されていませんので気をつけます。
5) 実際に使ってみる
muninのサーバを動かした場合には、ユーザが munin となるため /etc/cgconfig は以下のように記述します。 /sys/fs/cgroup/cpu/limit の権限に実行するユーザの権限が必要になります。
group limit {
perm {
admin {
uid = munin;
}
task {
uid = munin;
}
}
cpu {
cpu.cfs_quota_us = 250000;
cpu.cfs_period_us = 1000000;
}
cpuacct {
}
}
なので上記のように定義しておきます。この状態で cgconfigparserを実行すると
munin@ip-172-16-1-133:/var/log/munin$ ls -l /sys/fs/cgroup/cpu/
drwxr-xr-x 2 munin root 0 Mar 17 14:47 limit
上記のように limit ディレクトリの所有者が munin に変更されます。こうなっているとmuninユーザでもcgexecが実行できるようになります。
その後はCronから起動される munin-cron の中で実行しているコマンドに cgexec を付与することで有効になります。
起動設定については /etc/init.d/munin のStartの部分にcgconfigparserを追加
case "$1" in
start|restart|force-reload)
# Create various dirs
/usr/sbin/cgconfigparser -l /etc/cgconfig.conf
mkdir -p /var/run/munin && chown munin /var/run/munin
exit $?
;;
stop)
ちなみにSteal中はこんな感じに燃え上がる。
変更実施後は
このように赤い(Steal)がなくなっているのがわかる、これにともなって以下のようにLoadやDevice Latencyも同様に改善されているのが分かります。