Azure と AWS のインスタンス性能比較

#概要
クラウドプラットフォームの選択においてコンピュート性能と価格の正しい選定が重要となってきます。このコンピュート性能を表す指標として、Microsoft Azure では [ACU (Azure Compute Unit)](https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/acu)、Amazon Web Services では [ECU (EC2 Compute Unit)](https://aws.amazon.com/jp/ec2/pricing/on-demand/) という論理的指標を公開しています。今回はこの指標を用いて、Azure VM と AWS EC2 のインスタンス性能の比較をしてみたいと思います。

#Azure と AWS コア数の考え方
一般的に Azure の物理ホストサーバーは[ハイパースレッディング](http://e-words.jp/w/%E3%83%8F%E3%82%A4%E3%83%91%E3%83%BC%E3%82%B9%E3%83%AC%E3%83%83%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0.html)がオフ（一部 Dv3 インスタンス等で例外あり）、AWS のホストサーバーはオン（一部 HPC インスタンス等で例外あり）となっています。ハイパースレッディングがオフの場合、物理コア 1 に対して論理コアは１となりますが、ハイパースレッディングがオンの場合、物理コア 1 に対して論理コアは２となります。すなわち Azure の仮想マシンで２コアのインスタンスは、物理コア２個にマップされますが、AWS EC2 の場合２コアのインスタンスは物理コア１個にマップされます。

つまり同じ CPU スペックのインスタンスを Azure と AWS で比較した場合、仮想コア数が同じであっても Azure のインスタンスの方が高性能だと言えます。（なぜなら倍の物理コアが割り当てられている為！）これを意識せずに単純に仮想コア数でインスタンスタイプを選定し、Azure と AWS で価格比較してしまうと誤った結果を導き出す事となります。

#ACU と ECU
そこで登場するのが冒頭で触れた [ACU (Azure Compute Unit)](https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/acu) と [ECU (EC2 Compute Unit)](https://aws.amazon.com/jp/ec2/pricing/on-demand/) になります。ACU は Azure A1 インスタンス (AMD Opteron 4171 HE @ 2.1 GHz) １仮想コアのパフォーマンスを 100 と定義し、Azure の各種インスタンスはそれとの相対比較として定義されます。例えば同 CPU スペックで仮想コア数が２個の A2 インスタンスは ACU = 200 となります。ECU は m1.small インスタンス (2007 AMD Opteron 1.0～1.2 GHz) を１として定義されています。

#ACU / ECU 比率
この ACU と ECU ですが、論理的な指標となるため変化の激しいクラウド界隈において不変の定義となります。このため ACU と ECU の比率も同様に不変となります。

**　　ACU ≒ 46 × ECU**

この式は Azure, AWS それぞれで複数タイプのインスタンスに対して、同じ CPU ベンチマークを実施する事で求めた結果です。この式を使えば例えば AWS EC2 で m3.large インスタンスは 3.75 ECU なので、46 × 3.75 = 172.5 ACU となります。これに相当もしくはより高性能な Azure インスタンスとしては A2v2 = 200 ACU や D1v2 = 210 ACU 等が挙げられます。これらを[価格面](https://azure.microsoft.com/ja-jp/pricing/details/virtual-machines/linux/)で比較すると次のようになります。

東日本（東京） Linux OS ベースの時間単価比較（EC2 JPY は 114円換算、2017/03/14時点の価格）

| インスタンス   |         ACU |   時間単価（USD）|   時間単価（JPY）|
|:--------------|------------:|----------------:|----------------:|
| m3.large      |       172.5 |           $0.096|          10.94円|
| A2 v2         |         200 |           $0.113|          11.53円|
| D1 v2         |     210-250 |           $0.102|          10.41円|

この表を見てわかるように、いずれも比較的同じ価格性能比が示されているのがわかります。また同じ Azure のインスタンスであってもコストパフォーマンスに違いが出ているのがおもしろい結果と言えます。

#補足情報
上記の式を導くのに用いた [CINBENCH](http://www.pc-master.jp/blog/freesoft/7149.html) による負荷テスト結果を参考までに掲載しておきます。Azure VM, AWS EC2 の各種インスタンスに対して同一ツールにより負荷をかけることで、負荷テスト結果に対する ACU, ECU の平均値を算出します。

|    Azure VM |      ACU |  CINBENCH |   ACU/Bench |
|:------------|---------:|----------:|------------:|
| A2 v2       |      200 |        81 |    2.469136 |
| F1          |      230 |       105 |    2.190476 |
| D3          |      640 |       291 |    2.199313 |
| D4 v2       |     1840 |       842 |    2.185273 |
| H8          |     2360 |      1060 |    2.226415 |
|  Avarage    |          |           |    2.254123 |

|  AWS EC2    |      ECU |  CINBENCH |   ECU/Bench |
|:------------|---------:|----------:|------------:|
| m4.xlarge   |       13 |       275 |    0.047273 |
| m4.4xlarge  |     53.5 |      1131 |    0.047303 |
| c4.large    |        8 |       156 |    0.051282 |
| c4.4xlarge  |       62 |      1256 |    0.049363 |
|  Avarage    |          |           |    0.048805 |

小学校で分数どうしの割り算を習うかと思いますが、割る数の分子と分母をひっくり返して掛けるので Bench が打ち消され

**　　ACU/Bench ÷ ECU/Bench = ACU/Bench × Bench/ECU = ACU/ECU**

となります。それぞれの平均値より 2.254123 / 0.048805 = 46.186043 となり

**　　ACU / ECU ≒ 46** 

すなわち 

**　　ACU ≒ 46 × ECU** 

が導き出されます。