AWSのEC2インスタンスは色々なスペックタイプから選べるんですが、中でもt1.microインスタンスは特殊だったりします。単にスペックが低くて料金も安いというわけではない…というのをようやく理解したので、検証まとめ。
僕はこの特性をちゃんと理解せずに、安いからとt1.microをスケールアウト用に増産していました。料金も、t1.microだと$0.027/1hourで、m1.smallの$0.088/1hourと比べても3倍くらい違うので、t1.microを3台入れたほうが良いだろうと思ってたんです。
が、あまりパフォーマンスの割にコスパが良くないことに気がついて、m1.smallに切り替えました。
改めてサイトに表記してあるスペック表を見ると、t1.microは「最大2ECU」と書かれており、m1.smallの「1ECU」と見比べると一見t1.microが勝っているように感じられます。が、それは半分正解で半分間違い。
(*) 1ECU = 1つの1.0-1.2 GHz 2007 Opteron または 2007 Xeon プロセッサの CPU 能力に等しい能力
AWSのサイトからの引用です。
マイクロインスタンス(t1.micro)は、少量かつ一定量の CPU リソースをご提供するプランです。追加サイクルが利用可能であるときは、CPU 処理能力を短期バーストとして増大させることができます。このタイプが適しているのは、低スループットのアプリケーションやウェブサイトがときどき追加コンピュートサイクルを必要とする場合です。
ちょっと何言っているかわかりませんね。
ということで実際にベンチマークを取って検証してみました。
ベンチマーク1(1秒以下の処理)
<?php
$max = 1000;
$start = microtime(true);
for ($i=0; $i<$max; $i++) {
for ($k=0; $k<1000; $k++) {
}
echo sprintf('%0.10f', microtime(true) - $start) . "\n";
}
t1.micro と m1.small を比較しています。Y軸が秒数です。黄色いm1.smallを見ると段階的に処理がされているのが分かります。これは恐らく同居している他のインスタンスにCPUを使用しているんだと思います。
t1.microは、圧倒的に早く処理を終了しています。これだけ見ると、スペック表通りm1.smallよりも高速です。
ベンチマーク2(10秒以上の処理)
<?php
$max = 1000;
$start = microtime(true);
for ($i=0; $i<$max; $i++) {
for ($k=0; $k<100000; $k++) {
}
echo sprintf('%0.10f', microtime(true) - $start) . "\n";
}
次は、10秒以上かかる処理に変更しました。
相変わらずm1.smallは遅いですが安定した速度を出しています。それに対し、t1.microは13秒くらいまでは高速で動いていますが、それ以降は非常に遅い動作に変わっています。最終的にはm1.smallより遅く処理が終了しました。
なんてこったい。
これがバーストと呼ばれるもので、短時間であれば高速に動作しますが、高速動作が一定時間続くと低速モードに切り替わります。約80〜90%ほどリソースが落ちるようです。(stealと呼ばれる)
結論
CPUを多く使用し、それなりに負荷が続くような処理がメインの場合は、素直にm1.smallインスタンスを利用するほうが吉。
Webサーバなどで、トラフィックが集中し、負荷に応じてt1.microをスケールアウトするように組んだとしても、トラフィックが減らない限りは、低速モードになったインスタンスが増えるだけで、さほど効果が上がらないです。