先日 Amazon EC2 Micro インスタンスを使う機会があり,色々と試してみた.
使っていると,すぐにターミナルの応答性が悪くなったり Ping の応答時間が不安定になるといったことが起きた.
top コマンド実行してみたところ,Steal が極端に多くなっていた.
Cpu(s): 2.2%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 97.8%stSteal は@ITの記事によると,使いたいけど使えなかった時間らしい.
CPUリソースはバーストできるじゃないのかよー,と思って調べてみた.steal列には、ゲストOSがリソース要求を行ったにもかかわらずCPUリソースを割り当ててもらえなかった時間の割合が表示されます。@IT リソース制御でサービスレベルを確保せよ
計測方法
ループするだけのプログラムで負荷を掛け,どれだけ CPU リソースを利用できたかをグラフ化させる.
ついでに,使用する CPU リソースをどれだけ制限すれば,Steal を少なくできるかも調べてみる.
使用するモノ
- EC2 の Micro インスタンス.
- 今回は Amazon Linux AMI x86_64 を使用した.
- ループするだけのプログラム
- cgroup
- schedtool
- cgroup から値を盗ってくるスクリプト
まず,ループするだけのプログラム
void main() { while(1){} }
次に cgroup をマウントする.
$ sudo mount -t cgroup cgroup /sys/fs/cgroupで,適当なディレクトリを掘ってシェルのプロセスIDを入れる
最後にループするプログラムを起動しつつ,cpuacct.stat から値をとり続ける.$ sudo mkdir /sys/fs/cgroup/test $ echo $$ | tee /sys/fs/cgroup/test/tasks
CPU リソースの制限は cpu.rt_period_us と cpu.rt_runtime_us で行う.
cpu.rt_period_us で指定した時間のうち,cpu.rt_runtime_us で指定した時間だけ CPU を使用できる.
時間の単位はファイル名の通りマイクロ秒.
例えば,以下のような値を入れた場合は1秒のうち0.5秒まで CPU リソースを消費できる.
cpu.rt_period_us | cpu.rt_runtime_us |
---|---|
1,000,000 | 500,000 |
今回は以下のパターンで計測した.
cpu.rt_period_us | cpu.rt_runtime_us |
---|---|
1,000,000 | 100,000 |
1,000,000 | 125,000 |
1,000,000 | 150,000 |
1,000,000 | 250,000 |
1,000,000 | 500,000 |
計測結果
0.5秒に制限した場合だいたい30秒ほどでリソースを使い切ってしまっているので,制限なしだと10秒〜15秒ほどで使い物にならなくなってしまう.
1秒あたり0.15秒以下の時間だけ使うことにすれば,安定的に CPU リソースを使うことが出来る.
まとめ
計測してて自分が何を求めているのかよく判らなくなったりしたが,とりあえず記録として残しておく.
だいたい2分毎に使用リソースがリセットされていることがわかった.
なので,こんな用途に向いてるんじゃないかなあと思う.
- 1分もしくは2分毎に少量のバッチ処理.
- Tweet の取得とか
- CPUリソースをあまり喰わない低負荷な処理
- アクセス数が多くないスタティックなサイトとか?
と,これくらいしか思い浮かばない.みんなどんなことに使ってるんだろう.
結局のところ,Amazon EC2 のサイトに書かれている説明の通りってことなんだけど.
このファミリーのインスタンスは、少量の整合性のあるCPUリソースを提供し、他のサイクルが可能になると、CPU 容量をバーストできます。定期的にかなりの計算サイクルを消費する、少量のスループットアプリケーションやウェブサイトに最適です。「少量の整合性のあるCPUリソース」と言われて理解できる人っているのかなあ.
あ,リソースを制限したところで,使用できる CPU リソースは変わらないが,ネットワークの安定性とかターミナルの応答性は安定します.