AWS、GCP、さくらのクラウド でUnixBench CPU性能比較

#はじめに
パブリッククラウドを選定する際にはどのような情報を参考にしてますでしょうか？

* コスト
* ストレージ
* CPUコア数
* ファシリティ
* API

などの公開された情報を参考にされているのではないでしょうか。

さて、上記のような情報はHPで公開されておりますが、マシンのCPU性能はなかなか判断しにくいと思います。実際どの程度なのでしょうか。
ベンダーごとの実装方法や、CPUのアーキテクチャで変わってくるものなのでしょうか。

実際にAWS、GCP、さくらインターネットの三社のクラウドマシンでベンチマークを取りまして、スコアを参考に比較していきます。筆者のお財布事情から、無料利用枠のあるパブリッククラウドベンダーを選定しております。

この記事の前半では、ベンチマークツールを紹介しまして、OSにダウンロードします。ベンチマークツールが動作するところまで案内します。
後半ではベンチマークツールを使ってCPUの性能を計測します。

また付随して、仮想化を実装する基盤が、AWS=Xenで、GCPとさくら=KVMなので、そのあたりのスコアの違いも見れればいいなと思ってます。

※このベンチマークは2017年1月3日に計測しております。

#ベンチマークツール
**UnixBench**
Linux/Unix系OSで使われている定番のCPUベンチマークツールです。
標準ではCPUにまつわる12項目のテストを実施します。12項目のテストから総合スコアを計算します。
1コアあたりのスコアと、複数コアでのスコアの両方を計算できます。

|テスト項目|内容|
|:---|:---|
|Dhrystone 2 using register variables|2つのレジスタを使ってシステム（整数）プログラミングの性能|
|Double-Precision Whetstone|浮動小数点演算性能|
|Execl Throughput|関数の呼び出し性能|
|File Copy 1024 bufsize 2000 maxblocks|ファイルのコピー（バッファサイズ1024バイト）|
|File Copy 256 bufsize 500 maxblocks|ファイルのコピー（バッファサイズ256バイト）|
|File Copy 4096 bufsize 8000 maxblocks|ファイルのコピー（バッファサイズ4096バイト）|
|Pipe Throughput|パイプ処理のスループット|
|Pipe-based Context Switching|パイプベースのコンテキストのスイッチング処理|
|Process Creation|プロセス作成|
|System Call Overhead|システムコールでのオーバーヘッド|
|Shell Scripts (1 concurrent)|１つだけシェルスクリプトの実行|
|Shell Scripts (8 concurrent)|8つ同時にシェルスクリプトの実行|

#環境
**Amazon Web Services**
OS：Amazon Linux AMI release 2016.09

**Google Cloud Platform**
OS：CentOS 7.3

**さくらのクラウド**
OS：CentOS 7.2


#UnixBenchをダウンロード
まずUnixBenchを動かすためのモジュールをインストールします。

```:
# yum install -y wget gcc make perl perl-Time-HiRes patch
```

次にUnixBenchのパッケージファイルをGoogleからダウンロードして展開します。

```:
# wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/byte-unixbench/UnixBench5.1.3.tgz
# tar xvzf UnixBench5.1.3.tgz
```

UnixBenchのデフォルト設定だと16コア以上のCPUが計測できません。
制限を解放するパッチファイルがGoogleから公開されています。ダウンロードしてパッチを適用します。

```:
# wget http://storage.googleapis.com/google-code-attachments/byte-unixbench/issue-4/comment-1/fix-limitation.patch
# patch Run fix-limitation.patch 
```

それか「UnixBench/Run」の109行目、112行目、1332行目の3行を変更します。どちらでも大丈夫です。


```bash:UnixBench/Run
 109   'system'    => { 'name' => "System Benchmarks", 'maxCopies' => 0 },
 112   'misc'      => { 'name' => "Non-Index Benchmarks", 'maxCopies' => 0 }, 
1332    next if ($maxCopies > 0 && $copies > $maxCopies);
```


#ベンチマーク実施
AWS、GCP、さくらの3社でマシンを作成し、UnizBenchを実行します。
AWSのみ、シリーズによりマシン性能が異なるそうなので、汎用インスタンスのM4シリーズと、コンピューティング最適化インスタンスのC4シリーズで計測します。

時間短縮のため5回で実施します

```:
# cd UnixBench
# ./Run -i 5 
```



##Amazon Web Services
###リージョン
東京リージョン
###CPU
Intel(R) Xeon(R) CPU E5-2686 v4 @ 2.30GHz (4600.1 bogomips) Hyper-Threading, x86-64
※汎用インスタンスのM4シリーズで計測してます。
###テスト項目ごとのスコア平均：1コア
|テスト項目|スコア|
|:---|:---|
|2つのレジスタを使ってシステム（整数）プログラミングの性能|2779.7|
|浮動小数点演算性能|692.8|
|関数の呼び出し性能|1090.1|
|ファイルのコピー（バッファサイズ1024バイト）|2991.2|
|ファイルのコピー（バッファサイズ256バイト）|1929.3|
|ファイルのコピー（バッファサイズ4096バイト）|6262.8|
|パイプ処理のスループット|1886.7|
|パイプベースのコンテキストのスイッチング処理|119.9|
|プロセス作成|1003.2|
|システムコールでのオーバーヘッド|2257.8|
|１つだけシェルスクリプトの実行|1858.1|
|8つ同時にシェルスクリプトの実行|2087.6|

###総合スコア
|CPUコア数|1コアのスコア|複数コアのスコア|
|:---|:---|:---|
|2core(m4.large)|1518.9|2305.4|
|4core(m4.xlarge)|1582.0|3449.6|
|8core(m4.2xlarge)|1658.1|5163.9|
|16core(m4.4xlarge)|1687.2|7564.4|

###CPU
Intel(R) Xeon(R) CPU E5-2666 v3 @ 2.90GHz (5800.2 bogomips) Hyper-Threading, x86-64
※コンピューティング最適化インスタンスのC4シリーズで計測してます。
###テスト項目ごとのスコア平均：1コア
|テスト項目|スコア|
|:---|:---|
|2つのレジスタを使ってシステム（整数）プログラミングの性能|3267.1|
|浮動小数点演算性能|812.6|
|関数の呼び出し性能|1189.9|
|ファイルのコピー（バッファサイズ1024バイト）|3508.8|
|ファイルのコピー（バッファサイズ256バイト）|2259.1|
|ファイルのコピー（バッファサイズ4096バイト）|6638.8|
|パイプ処理のスループット|2208.0|
|パイプベースのコンテキストのスイッチング処理|127.4|
|プロセス作成|1020.9|
|システムコールでのオーバーヘッド|2637.3|
|１つだけシェルスクリプトの実行|2405.4|
|8つ同時にシェルスクリプトの実行|4370.3|

###総合スコア
|CPUコア数|1コアのスコア|複数コアのスコア|
|:---|:---|:---|
|2core(c4.large)|1690.9|2572.0|
|4core(c4.xlarge)|1820.3|3924.7|
|8core(c4.2xlarge)|1836.5|5852.1|
|16core(c4.4xlarge)|1941.1|8517.2|

##Google Cloud Engine
###リージョン
東京リージョン
###CPU
Intel(R) Xeon(R) CPU @ 2.20GHz (4400.0 bogomips) Hyper-Threading, x86-64

###テスト項目ごとのスコア平均：1コア
|テスト項目|スコア|
|:---|:---|
|2つのレジスタを使ってシステム（整数）プログラミングの性能|2738.7|
|浮動小数点演算性能|683.1|
|関数の呼び出し性能|780.4|
|ファイルのコピー（バッファサイズ1024バイト）|2265.0|
|ファイルのコピー（バッファサイズ256バイト）|1549.2|
|ファイルのコピー（バッファサイズ4096バイト）|3150.0|
|パイプ処理のスループット|1192.3|
|パイプベースのコンテキストのスイッチング処理|238.7|
|プロセス作成|794.8|
|システムコールでのオーバーヘッド|1698.0|
|１つだけシェルスクリプトの実行|1247.1|
|8つ同時にシェルスクリプトの実行|1694.5|

###総合スコア
|CPUコア数|1コアのスコア|複数コアのスコア|
|:---|:---|:---|
|2core|1239.1|1943.2|
|4core|1445.3|3196.2|
|8core|1434.1|5113.2|
|16core|1505.5|7809.0|

##さくらのクラウド
###リージョン
東京リージョン
###CPU
Intel(R) Xeon(R) CPU E5-2650 v3 @ 2.30GHz (4589.4 bogomips) x86-64
###テスト項目ごとのスコア平均：1コア
|テスト項目|スコア|
|:---|:---|
|2つのレジスタを使ってシステム（整数）プログラミングの性能|2588.7|
|浮動小数点演算性能|693.4|
|関数の呼び出し性能|1081.6|
|ファイルのコピー（バッファサイズ1024バイト）|2739.0|
|ファイルのコピー（バッファサイズ256バイト）|1849.3|
|ファイルのコピー（バッファサイズ4096バイト）|4430.6|
|パイプ処理のスループット|1497.6|
|パイプベースのコンテキストのスイッチング処理|912.0|
|プロセス作成|1317.7|
|システムコールでのオーバーヘッド|2647.4|
|１つだけシェルスクリプトの実行|1456.1|
|8つ同時にシェルスクリプトの実行|1368.2|

###総合スコア
|CPUコア数|1コアのスコア|複数コアのスコア|
|:---|:---|:---||
|2core|1652.1|2321.8|
|4core|1338.7|3381|
|8core|1485.7|4691.9|
|16core|1270.6|6446.6|


#UnixBenchスコアまとめ

###テスト項目ごとのスコア平均：1コア

|テスト項目|AWS(M4)|AWS(C4)|GCP|さくら|
|:---|:---|:---|:---|:---|
|2つのレジスタを使ってシステム（整数）プログラミングの性能|2779.7|3267.1|2738.7|2588.7|
|浮動小数点演算性能|692.8|812.6|683.1|693.4|
|関数の呼び出し性能|1090.1|1189.9|780.4|1081.6|
|ファイルのコピー（バッファサイズ1024バイト）|2991.2|3508.8|2265.0|2739.0|
|ファイルのコピー（バッファサイズ256バイト）|1929.3|2259.1|1549.2|1849.3|
|ファイルのコピー（バッファサイズ4096バイト）|6262.8|6638.8|3150.0|4430.6|
|パイプ処理のスループット|1886.7|2208.0|1192.3|1497.6|
|パイプベースのコンテキストのスイッチング処理|119.9|127.4|238.7|912.0|
|プロセス作成|1003.2|1020.9|794.8|1317.7|
|システムコールでのオーバーヘッド|2257.8|2637.3|1698.0|2647.4|
|１つだけシェルスクリプトの実行|1858.1|2405.4|1247.1|1456.1|
|8つ同時にシェルスクリプトの実行|2087.6|4370.3|1694.5|1368.2|

###複数コアの総合スコア

|CPUコア数|AWS(M4)|AWS(C4)|GCP|さくら|
|:---|:---|:---|:---|:---|
|2core|2305.4|2572.0|1943.2|2321.8|
|4core|3449.6|3924.7|3196.2|3381|
|8core|5163.9|5852.1|5113.2|4691.9|
|16core|7564.4|8517.2|7809.0|7446.6|

#まとめ
* 物理的なCPUは、AWSがパフォーマンスの高いものを使用している。
* レジスタの性能と、浮動演算装置の性能はおおむね横ばい。
* バッファサイズの大きいファイルのコピーではAWSが優れている。
* パイプ処理のスループットはAWSが優れているが、コンテキストのスイッチング処理ではさくらが4倍くらいの差をつけていた。
* プロセスの作成ではさくらが優れている。
* システムコールでのオーバーヘッドは、KVMを使っているGCPとさくらで差が開いた。
* シェルスクリプトの実行処理ではAWSが優れている。
* CPUの総合性能はコンピューティング最適化インスタンス(AWS)が優れている。
* スコアはコア数に比例するが、等倍ではない。

UnixBenchでスコアをとってきました。CPUの性能ではC4シリーズが優勢でした。
同じ仮想化基盤を使っているのに関わらず、システムコールのオーバーヘッドがGCPとさくらとで差が開いたのが気になりました。昨年、東京にデータセンターが開設されたばかりということで、GCPの開発がまだ進んでいないのか、または、さくらが特別な実装を行っているのではないでしょうか。

お付き合いいただき、ありがとうございました。
この記事がパブリッククラウドの選定の参考になれば幸いです。