AmazonEC2 m1.smallのCPU配分

AmazonEC2のサーバのCPUは、ECUという単位の処理能力で表現されます。標準的なインスタンスである、m1.small, m1.large, m1.xlargeでは、それぞれ、1ECU*1コア, 2ECU*2コア, 2ECU*4コアという風に表されています。ここで気になるのは、m1.smallだけ、1コア当たりの処理能力が低いという事実です。m1.small以外のインスタンスではCPUコア当たりの処理能力は2ECUなのですが、m1.smallだけは1ECUです。m1.smallだけ異なるCPUが割り当てられているとは考えづらいので、おそらく時分割で共有しているのでしょう。Amazonのサイトで具体的な記述を見つけることが出来なかったので、実際に検証してみました。

スモール インスタンス – デフォルト*
1.7 GB メモリ
1 ECU(1 ECU × 1仮想コア)
160 GB インスタンスストレージ
32ビット プラットフォーム
I/O 性能: 標準
API 名: m1.small

ラージ インスタンス
7.5 GB メモリ
4 ECU(2 ECU × 2仮想コア)
850 GB インスタンスストレージ
64ビット プラットフォーム
I/O 性能: 高速
API 名: m1.large

エクストララージ インスタンス
15 GB メモリ
8 ECU(2 ECU × 4仮想コア)
1,690 GB インスタンスストレージ
64ビット プラットフォーム
I/O 性能: 高速
API 名: m1.xlarge

検証に使ったプログラム

ループを回しながら、定期的に時刻を表示します。途中で処理が止まると、時刻が大きく進むはずです。

<?php
$start = microtime(true);
for($i = 0; $i < 10000; $i++){
printf("%.5f<br>", (microtime(true)-$start));
for($j = 0; $j < 500; $j++);
}

実行結果

一定時間ごとにCPUが止まっている(他のインスタンスの処理をしている)ことが一目瞭然で分かる結果になりました。CPUが動作している時間、停止している時間は共に60ms程度で一定しています。2つのインスタンスを時分割で実行していることが確認できました。

(縦軸が時刻、横軸が処理の回数)

結論

m1.smallは、1つのCPUコアを2つのインスタンスで共有しており、60ms間隔で動作状態と停止状態が切り替わっている。停止状態になった瞬間に受け取ったリクエストは最低でも60ms以上待たされることになるので、リアルタイム性を重視する用途にm1.smallを使うべきではない。また、今回は特に検証していないが、t1.microでは、2ECUの性能を持つCPUを負荷に応じて割り振っている(バースト的な処理に対応)が、負荷が高い状態が続くと割り当ての優先度が下がるよう調整されていると推定できる。