Hatena::ブログ(Diary)

アルパカDiary このページをアンテナに追加 RSSフィード

Perl用ブログも始めましたPerl勉強メモ

2014-03-12

[][]microインスタンスはlimitかけると大きくパフォーマンスが向上する(※再追記あり) 23:25 microインスタンスはlimitかけると大きくパフォーマンスが向上する(※再追記あり)を含むブックマーク microインスタンスはlimitかけると大きくパフォーマンスが向上する(※再追記あり)のブックマークコメント

※2014/07/02 T2インスタンスタイプとの比較 を追記しました。

※2014/03/13 他インスタンスタイプとの比較/m3.mediumの検証 を追記しました。



こちらの記事の二番煎じです。

cgroupで、お手軽CPU使用率制限


なるほど。

リソースにLimitかけるとstealを防げるためパフォーマンスも上がるというわけですね。

どのくらい変わるのか実験してみました。


cgroup前準備

sudo yum install libcgroup
sudo chkconfig cgconfig on
sudo service cgconfig start

cgroup設定

上記参考URLとほぼ同じ設定です。

実行時はcpu.cfs_quota_usを変動させて比較してみました。

sudo vi /etc/cgconfig.conf

# 以下を追加
group limittest {
 cpu {
   cpu.cfs_quota_us  = 250000;   # Max25%
   cpu.cfs_period_us = 1000000;
 }
 cpuacct {
 }
}

# 変更後はリスタート
sudo service cgconfig restart

定常的に使う時は、memory.limit_in_bytes なども設定して

メモリもlimitかけると良いかもしれません。


比較コマンド

perlビルドの時間を比較してみました。

リミットなしバージョン
time perlbrew install perl-5.18.2
リミットありバージョン
time cgexec -g cpu:limittest /root/perl5/perlbrew/bin/perlbrew install perl-5.18.2

結果

-realusersys
リミットなし186m59.721s127m54.352s51m52.487s
リミットあり(Max25%)90m8.645s15m4.317s5m31.501s
リミットあり(Max30%)75m3.421s15m1.468s5m24.844s
リミットあり(Max40%)87m26.738s23m40.645s8m50.737s

リミット無しでsteal発生しまくりの時はおよそ3時間かかっていたのが、

リミットあり(Max30%)だと1時間15分ほど。2倍以上速い!!


※以下引用

いくつかの調査をした結果,

 ・直近の100秒のCPU使用率が20%を超えている場合は低速モードに移行する

 ・低速モードはCPU使用率の97%が使えない状態(steal)になる

Amazon EC2 Microインスタンスの挙動について

とあるので、20%ギリギリ超えるくらいがちょうどいいかなと予想していましたが

実際には30%が一番パフォーマンスが良かったです*1


vmstatでstealの値も見ていたんですが、

Max40%だと結構stealが発生していて、

Max30%の場合ごくごくわずかにstealが発生するくらいでした。

常にCPUMaxをつかう処理があるわけではないと思うので、

20%よりも少しばかり高めに設定したほうが

効率が良いのかもしれませんね。


まとめ

cgroupで制限するとmicroインスタンスでは大幅なパフォーマンス向上が見られました。

大きいビルドなど行うときには必須ではないでしょうか!







※追記 他インスタンスタイプとの比較

smallとの比較があったらよいのでは、というコメントを頂いたので

ついでにインスタンスタイプ別に比較してみました。

m1.smallだけでなく、グループ毎の下位クラスも一緒に比較してみました。

-realusersys
t1.microリミットありver75m3.421s15m1.468s5m24.844s
m1.small46m3.623s29m54.188s10m54.853s
m1.medium25m33.974s15m17.969s5m0.599s
m3.medium31m42.804s18m45.818s7m47.473s
c1.medium25m1.527s15m16.129s5m34.785s
c3.large16m41.832s9m31.712s3m25.633s

c3は予想通りの早さですね。

他のインスタンスも軒並み予想通りですが、一つだけ気になる結果があります。

m3.mediumインスタンスです。


m1.mediumとm3.medium

公式のインスタンスタイプを見ると

以下のようになっています。

-ecuvcpu
m1.medium21
m3.medium31

あれれ、数値上はm3.mediumの方が良さそうですね*2

なぜm1.mediumの方が速いのでしょうか?


ビルド時のスナップショット

m3.mediumのビルド時のvmstatのスナップショットです。

f:id:toritori0318:20140313030625p:image:w500

stealが40-50%ほど発生しています。

m1.mediumはというと、stealの発生はありませんでした。


予想:CPU共有タイプ?

公式ドキュメントからは確認出来なかったのですが、

おそらくm3.mediumもm1.smallと同じように

CPU共有型なのではないか」と予想しました。

詳しくは以下のブログをご覧頂くと良いです。

AmazonEC2 m1.smallのCPU配分

http://php6.jp/linux/2012/01/20/amazonec2-m1-small/


vmstatの推移がm1.smallとm3.mediumで同じような挙動をしているので

ほぼ間違いないのではないかと思います。


m3.largeも試してみる

本当は上記インスタンスだけ比較して終わろうと思ったのですが、

m3のグレードを一つ上げたらstealしなくなるか、を確認してみました。

-realusersys
m3.large17m1.667s10m1.062s3m21.857s
ビルド時のスナップショット

f:id:toritori0318:20140313030626p:image:w500

stealが消え、ほぼ公式と同じような性能が出ているように見えます*3

やはり、stealが発生するのはm3.mediumだけのようです。


追記:まとめ

単に性能比較して終わる予定だったのですが、

m3.mediumインスタンスで新たな発見がありました。

m1.mediumと比べて、

「m3.mediumの方が安いし性能もいいしこれでいいじゃんヒャッハー!!!」

と思っていましたが、mediumだけでみると「m1.mediumの方が速い」という結果でした。

ほげぇ。


匿名さん、コメントありがとうございました。



再追記:T2インスタンス

バーストありとバーストなしで追試しました。

バーストあり時は t2.micro/t2.small/t2.medium であまり変わらなかったので

どちらもt2.microの値です。

-realusersys
t2.micro(バーストあり)14m46.383s8m53.064s0m26.884s
t2.micro(ベースライン:10%)-(※注1)-(※注1)-(※注1)

バースト時にはc3インスタンスと遜色ないですね。


また、以下はt2.microのバーストあり時の残高クレジットです。

f:id:toritori0318:20140703005917p:image:w480

30-22で、およそ8クレ消費しているようですね。


※注1

【悲報】ベースラインビルド、なんと

 2週間回し続けても一向に終わる気配がありませんでした!!!

 (途中で強制終了しました)

 もしかしたら実測としてはベースラインを大きく下回っているのかも…

*1:途中ネットワークアクセスなども発生していたり、というのもあると思います

*2:自分もこの辺りの性能比較を過去記事に書いています http://d.hatena.ne.jp/toritori0318/20140203/1391445479

*3:c3.largeと比較して

匿名匿名 2014/03/13 00:42 良記事ありがとうございます。参考にさせて頂きます。
スモールインスタンスと比較していただけると、すごく嬉しいです。

toritori0318toritori0318 2014/03/13 00:53 > 匿名さん
なるほど。記事の趣旨は変わってしまいますが
他のインスタンスとの比較があるとたしかに面白いかもしれないですね。
後ほど別記事で補足したいと思います。

リンク元