Amazon EC2を高速化する方法

Amazon EC2 に High-CPU Extra Large Instance (c1.xlarge) というのがありまして、8コアのCPUと7GBのメモリを持っています。CPUは Intel Quad Core Xeon が2つ載っているものが多いそうです。

しかし、こいつがくせ者で、http://developer.amazonwebservices.com/connect/thread.jspa?messageID=116855 でも、取り上げられていますが、いまいち速くならない!

top コマンドで、1を押すと、各コアのCPUの使用状況が見れるのですが、2〜4コアしか使ってくれません。しかも、使用コア数は、動的に変化します。いろいろ試して発見したのですが、nice -n -20 を使って、プロセスのプライオリティをあげると、6〜8コア(だいたい8コア)を使ってくれて、期待通りの計算速度で動いてくれます。なぜ?なぜ?なぜ?バーチャルコアの割り振りはどういう仕組みになっているのでしょうか?8コア使ってくれないときの、未使用コアのCPU使用率は0%になっています。

Amazon EC2 の High-CPU Extra Large Instance は期待通りの速度で動くと、並列化が100%うまくいくタスクならば、Intel Core i7 の2倍くらいの速度で計算してくれます。

追記1

http://lucille.atso-net.jp/blog/?p=659 にこの件に関して、c1.xlarge は4GFLOPS出るのではないかと、コメントしてみました。

追記2

起動時の画面は、4657.44 BogoMIPSで、L1 I 32K、L2 D 32K、L2 4096K になってます。これによると、4.5 GFLOPS ですね。(って、BogoMIPSをFLOPSにしちゃだめか)

追記3

(追記6で再度訂正)

Quad Core 2つと書きましたが、Dual Core 4つの気がします。根拠は、

  1. 2次キャッシュが4MBと小さいこと。Quad Coreなら、もっと大きいです。
  2. High-CPU Medium Instance が Dual Core の2.5GHz〜3.0GHz となっていること。

かなり、想像ですが、Dual Core の 2.5GHz〜3.0GHz を、High-CPU Extra Large Instance は CPU が暇なときは1つだけ、忙しくなると(CPUリソースが不足すると)最高4つ割り当てるように、動的に切り替えている気がします。「不足すると」の判断基準がわからないです。

そして、その、空いたCPUの隙間を、High-CPU Medium Instance で埋めていっている気がします。もし、これが正しいならば、本当に動的だなぁ。

追記4

http://accc.riken.jp/HPC/HimenoBMT/index.html をがんばってコンパイルしてみました。Fortran90 + MPI を使ったのですが、mpirun で -mpinice -20 を指定すると、2コアくらいから、5〜6コアくらいまで増えてくれるんですが、どうしても8コア全て使ってくれない!自作のプログラムだと、結構8コア使ってくれたんですが…

追記5

追記だらけ。追記1の件ですが、syoyoさんによると、シングルスレッドのベンチマーク結果だそうです。http://lucille.atso-net.jp/blog/?p=659

追記6

うわ、追記3、適当なこと書いてる。cat /proc/cpuinfo でみれるんですが、Intel Quad Core Xeon E5345 2.33GHz が多いです。L2 は 4MB×2 = 8MB だそうです。