Amazon EC2 はじめました

というのも、作成中の VM のデモ目的で。自宅の PC は何度か試したが Wake on LAN では正常に立ち上がらない。家族に立ち上げてもらってもディスクにパスワードかかってる。そもそもリモートからちゃんと弄れる環境を作るのは少し厳しいし、この PC で仮想化をするのは CPU 的には問題ないもののメモリ的に少し厳しい。というわけで Amazon EC2 でデモ用マシンを立ちあげられるか試してみた。

インスタンスの立ち上げとセットアップ

最近は EC2 の余剰リソースを安く利用出来る Spot Instances があるため、立ち上げのコストは低め。VM の計算量と解析パスを同時に実行することを考えて m2.4xlarge*1 (mem 68.4GB, 26 ECU [3.25ECU * 8core]) の Windows Server*2 インスタンスを 1 時間立ち上げても 150 円程度。下手に他の手段を取るよりも安い。
立ち上げたインスタンスの CPU は Xeon X5550 と、今使ってるものと同世代の Nehalem マイクロアーキテクチャ。CPU とメモリでベンチマークを取ってみたが、まず自宅 PC に負けることはない。OS は Windows Server 2008 Datacenter*3
最初 Windows Server には 2GB のスワップが入っていたが、このメモリ量*4からして必要無さそうなのと EBS アクセスで余計に料金を取られそうなのとでスワップは切った。*5インスタンスは最初英語で立ち上がるのでそれを日本語にし*6、さらに .NET Framework 4 *7 などをインストールして AMI を作成。

ストレージの特性を知る前に。

AMI を作成する前後で不思議に思ったのは、ローカルのストレージはどこにあるのか? ということだ。至ってどこにも見当たらない。色々調べると、AmazonWindows Server AMI は EBS がデフォルトになっており、またローカルのストレージがデフォルト無効化されているとのことだ。
最初は Amazon EC2 のドキュメントに書いてあった ec2-register を使う方法を試したが AMI すら正しく作れない。色々試行錯誤したりググってみると、インスタンス立ち上げにコマンドラインを使い、そのとき -b オプションで明示的にマウントするディスクを指定すれば良いようだ。私の場合 Spot Instance を立ち上げるので、

ec2-request-spot-instances ami-******** -t m2.4xlarge -p *** -k ********** -b "xvdf=ephemeral0" -b "xvdg=ephemeral1"

とすれば、ローカルストレージを有効にした状態の Spot Instance を正しく要求できた。(この ephemeral0, ephemeral1 というのがローカルストレージ。インスタンスの種類によってこの ephemeral ディスクの数は異なる。)

ストレージの特性を知るために…

最近知ったことだが、ストレージには 2 種類、ローカルインスタンスストレージと EBS があるらしい。Amazon EC2 が用意している Windows Server AMI は幾つかあるが、すべて EBS ベースらしい。しかも EBS は容量だけでなくアクセスでも課金されるらしい。課金されるぐらいだから、EBS って良いのか? 某所では遅いと書いてあったし別の場所では速いと書いてあったけど。というわけでベンチマークをしてみた。
ベンチマークソフトは CrystalDiskMark 3.0。某所のようなサーバ用ベンチマークではない。まぁこの辺は単に私がサボったというのもあるし、ここで動かす予定のソフトの開発者だからアクセスの種類はある程度予測できているというのもある。いずれも 1000MB、5回平均。

X25-M 160GB (手元の PC)
Read (MB/s) Write (MB/s)
Seq 217.0 100.3
512k 113.5 52.17
4k (QD=1) 10.67 24.16
4k (QD=32) 20.88 28.04

まぁ SSD だな〜、って結果だ。ただしこれは純粋なベンチマークではない。TrueCrypt 7.0 が入った状態で調べているため、実際のパフォーマンスが暗号化処理でオーバーヘッドを受けている可能性がある。

Amazon EC2 - ローカルインスタンスストア (m2.4xlarge)
Read (MB/s) Write (MB/s)
Seq 111.0 38.88
512k 46.61 25.92
4k (QD=1) 0.712 0.628
4k (QD=32) 1.877 1.430

この結果を見るに、EC2 のストレージは明らかに HDD だ。(いや、840GB って容量で気づけよ。) 4k アクセスで低いスコアになっているのは比較的厳しい。あと Sequential Write の結果がやけに低い*8のが気になる。

Amazon EC2 - EBS (m2.4xlarge)
Read (MB/s) Write (MB/s)
Seq 104.0 56.53
512k 94.04 57.28
4k (QD=1) 13.45 5.953
4k (QD=32) 90.56 8.785

スコアの特性からするに、おそらくこれもバックエンドのストレージは HDD だろう。しかし…驚愕だ。明らかに性能が違う。Sequential Write が底上げされているのは当然として、512k、4k のランダムアクセスが明らかに HDD の1,2台では有り得ない速度を叩き出している。特に Random Read に関しては SSD 以上の性能を出している。
こういうスコア特性になるのは何だろうか? ディスクキャッシュだけでは説明の難しい結果だし、(HDD+SSD ハイブリッド and/or HDD 並列かつキャッシュメモリも載った) 鯖用のストレージシステムに高速接続しているかのだと予想する。

まとめない。

色々やってみたが、とりあえずデモ環境はうまく立ち上げられたからヨシとする。どうせ当面はトータルでも 10 時間ぐらいしか立ち上げない環境だろうし、EC2 でかかる費用もある程度予測できてはいる。まぁ…デモできる機会があるかどうかが最大の問題なんだけどね

*1:今のところリソースに余裕はあるようなので、場合によってはいっこ下の m2.2xlarge でも十分なようだ。

*2:わざわざ高い Windows Server にしたのは VM 実行と解析のデモを同時にやるためというのもあるが、最大の理由は Linux 向けの UI がしばらく完成する見込みすら無いということ。

*3:無駄にこの Datacenter というエディション名の響きで興奮しない?

*4:しかもデフォルト状態ではキャッシュを含めた全使用メモリが 2GB 未満だった。

*5:本当はスワップを切ると BSOD 時のダンプ等が正常にできなくなるのだが、そのような開発段階のバグは自宅 PC で潰してしまうため問題無さそう。

*6:Windows Server 2003 時には色々面倒だったようだが、2008 では単純に言語設定を変更するだけ (幾つかの言語がデフォルトで入っている。)

*7:VM も解析側も UI は .NET Framework で構成している。VM は 2.0、解析側は 4.0 Client Profile。

*8:この値が低いと高負荷時の VM トレースにおいて最大のオーバーヘッドになる。