俺の報告

RoomClipを運営するエンジニアの日報(多分)です。

日報 #107 - AWSのEC2インスタンスのコア数を考慮しながらLoadAverageをきめる

また一段と寒くなりました。
2月には雪かもしれませんね。
弊社でもチラホラと体調を崩す人が増えてきました(俺含む)
風邪って奴に完全な抵抗力を持つ日は来るのでしょうか…

さて、本日はちょいとサーバサイドのお話。
コンピュータの負荷指標は色々ありますが、皆様はどれを重要指標としてますでしょうか。
前にも少し触れましたが僕が気にしている指標を一応列挙いたします。

  • ELBのLatency
  • EC2のCPU Usage
  • EC2のMemory USAGE (-/+ buffers/cacheのused)
  • EC2のCPU LoadAverage
  • RDSのCPU Usage
  • RDSのDBConnect

I/O周りでは、

  • EC2のSwap I/O
  • EC2のDisk I/O
  • RDSのDisk I/O

と言った感じです。
これらをCloudWatchで毎分観測し、物によってはAlert設定をしています。
今回はその中でも特に重要指標となるLoadAverageの適正値について少しおさらい。
というのもEC2のインスタンスタイプを少々変更することになりまして、
一体いくつくらいまでならLAは許容されるのかを調べることになったのです。
なのでその手順をば。

そもそも、LAはCPUへの処理待ちプロセスの平均数的なものなのですが、
どうやら不親切なことにCPU数で割った値ではないみたいなんですね。
だもんで、例えばOSから見たCPUの数が10個あれば、LAの値が5と出ても不思議ではないんですね。
むしろ5程度なら1CPUあたり0.5という数値になるので、
単位時間あたりの待ちプロセス数(処理プロセスも含む)が1きっているのはとても健全なわけです。

で、例えばc3.xlargeの場合vCPUが4だといっているので、
LAの最大値は4だと考えるのが普通だと思いますが、
とある理由から僕は2.4程度が安全ラインだと思っています。

今からその理由をながーーーーく説明しますので、
興味ある方は是非。

以下の説明は、僕の主観と予想がまざりますので、鵜呑みにせぬようお願いします。。。

一般的には、EC2インスタンスのCPU数というのがわかれば、
まぁ大体の適正LA値が分かるわけですね。
ということで調べるわけですが、
昨今の仮想化時代においてはCPU様も仮想化されているので、
しっかりと「OSから見たCPUの数」と「物理的なCPUの数」を分けなきゃいけないんですね。
もっと突っ込んで言えば、「コアの数」という概念もあるので、
そこも含めて調査しましょう。

すげー簡単に言いますと、CPUは下記4つの部分に大別できます。

  1. 演算部分
  2. 演算の制御部分
  3. 演算するときのちょっとした記憶装置
  4. 処理全体のリズムをとるクロック部分

このクロック部分はいわゆる周波数なんですが、まぁCPUにおける時間の概念そのものなので、
大概この部分は物理的にも1CPUで1個です。
時計が複数あったら同期できませんしね。
で、残ったCPUの演算部分と、その制御と記憶装置に関してまるっとまとめて「コア」と表現する時があります。
いや、多分そう表現する時があります。
…もっと正確に言うと僕はそう思ってます。 結構「コア」の使い方がバラバラのような気がしているので、
ここではそういう定義にしますね。
間違ってる!って思った御仁はどんな暴力的表現でもいいのでコメント下さいお願いします。

んで、
まぁ歴史的流れで言えば、「周波数を上げれば処理速度は改善されるはず!」だったんですが、
(例えば10Hzだと1秒間に10回の処理ができますが、100Hzなら100回!)
高周波数は制御がむっちゃむずい(高周波回路は鬼制御が必要なのです)上に、
凄い電力が必要だし、すぐチンチンに熱くなっちゃう問題があったんです。
なので、世間の流れは「コアを増やせばいんじゃね?」に移行していくんですね。
演算部分を2つ3つにしていけば同時に物凄い沢山処理できるしね。
でもよくよく考えたら、これってそんな簡単な話じゃなくてソフトウェアが対応してないと駄目なんですね。
それにコア増やす分だけやっぱり消費電力もあがるわけです。
あと、なんでも並行作業にすれば早くなるわけでもなかったんですね。
だからまぁ大体2つか4つに落ち着いてる昨今ですが、
サーバとなるとそうもいきません。
サーバはむっちゃくちゃコアが多いのが主流みたいです。

あぁ、御託が長いのではしょって、、、

とにかく1CPU複数コアにするってのが昨今のトレンドみたいです。
ということで、例えばc3.xlargeのEC2インスタンスで調べてみましょう!
きっと1CPU複数コアなんでしょう!

調べ方はとっても簡単です。
まずは物理CPUの数を調べてみます。

sudo cat /proc/cpuinfo | grep 'physical id'  

これを叩いて出てきたphysical idの数が幾つになるかを見てみます。
c3.xlargeでは見事に1つでした。
おぉ、予想通り。
では続いて物理的なコアの数を調べます。

sudo cat /proc/cpuinfo | grep 'cores'

この数も1つでした。
あれ?
物理的には1CPUで1コア?
あらま。
どういうことでしょう。マルチコアじゃない?
じゃぁマルチプロセッサ?CPUそのものが複数個あるのかしら?
まさかね?
じゃぁOSからみたCPUの数を調べてみましょう。

sudo cat /proc/cpuinfo | grep 'processor'

プロセッサーは4つあるそうです。
要はOSからは4つのCPUだと判断されているみたいです。
はて。
ま、、、まぁいいか、とにかく4つCPUがあるんだから、
LoadAverageは4くらいまで耐えられるってことでしょ、、、

と、早々に判断してはまずいのです。

どうやら、EC2のCPU(というか最近のインテルXeon系HT利用のCPU)は、
上記のようなヌルい考えではまだ足りんわけですね。
カラクリは何かと申しますと、
ここでもやっぱり「仮想化」です。
CPUは処理の保証が重要ですので、1処理において結構バッファがあります。
説明が難しいですが、、、なんというか、要はかなり余裕をもって1処理を行うせいで、 バスラインとかに結構空白(余裕)があるものなのです。
そういう余った部分を、あたかも「別のCPU」のように扱うようにした技術がHT(ハイパースレッディング)というものです。
つまり、1つのCPUで2つのCPUのように見える仮想化技術なんですね。
とはいえ、HTで得たCPUは、本来の処理ラインの余剰分を使う程度なので、本ちゃんの処理能力の20%程度の処理能力しかない、
と一般的に言われております。
でも「並列処理ができる」という強みがあるわけですね。
このHT技術を使えば、1つの物理CPU、1つのコアに対してHT技術を用いれば2つのCPUに見えることができますのです。
これだと一般的に1CPUで以下のコマンドを叩くと、、、

sudo cat /proc/cpuinfo | grep 'processor'

プロセッサは2つにみえるわけですね。
でもだからといってLAの値を2まで確保していいのでしょうか?
駄目ですね。
20%程度のちからしかないので、大体1.2くらいと想定するのがよいわけです。

で、ちなみにこのHT技術が使われている判定はどうすればいいのでしょうか。
長いからこの話は今はなし!
でもHTによってどの程度コアの数が増えているように見えるのか、を見ることができます。
それがsiblingsという値。

sudo cat /proc/cpuinfo | grep 'siblings'

これを叩いてみると、見事4つとでました。
1CPUで1Coreですが、HT技術で4つに見えているわけですね。

あれ?4つ?
HT技術って1CPUに対して2コアに見せる技術じゃなかったの?

さぁナゾが深まってきました。
とにかく分かっているのは「物理的には1CPUに、1コア、なのに、4CPUにみえている」というこの疑問ですね。
これだけでLAのしきい値を4にしてしまうと、HT技術の損失分があるはずなので、若干不安。
ということで、c3.xlargeの実際のCPUは何が使われているのかを調べましょう。
http://aws.amazon.com/jp/ec2/instance-types/
ここ参照しますと、
c3.xlargeにはIntel Xeon E5-2680 v2というCPUを用いて、vCPUが4つだと言いはってます。
周波数は2.8GHzのままです。
実際 cat /proc/cpuinfo の model nameにもIntel Xeon E5-2680 v2で2.8GHzとあります。

じゃぁIntel Xeon E5-2680 v2というCPUのスペックを調べましょう。
http://ja.wikipedia.org/wiki/Xeon
http://ark.intel.com/products/75277/Intel-Xeon-Processor-E5-2680-v2-25M-Cache-2_80-GHz
な、なんと、10コアもあります。
10コア20スレッド、HT技術YESということで、物理的には10コアあって、HTつかって20論理コアにみせているCPUみたいです。
おっそろしいCPUなんですね。
でもc3.xlarge自体はvCPU4だと言いはってます。
この辺にカラクリがありそうですね。
恐らくですが、c3.xlarge自体はフルにIntel Xeon E5-2680 v2を使い切っておらず、
その内の「4コア分だけ使ってる」ということなんでしょう。
これでなぞーは解決しました。

で残った問題は「LAはいったいいくつまで耐えるのよ?」という話ですが、
物理10コア、HTで20コア⇒全体パフォーマンスとしては10+10*20%=12コア程度が全体の処理能力と考えますと、 本当は20コア中4コア使っているつもりが、実質は12コアに対してなんぼ?という話だとして、
12*4/20 = 2.4 くらいの処理能力と捉えるといいかもしれません。
(もちろん実際のところ、フルで4コア分を使えている可能性もあるので、何とも言えませんが)
安全を見て2.4程度とみておくのがよいのではないでしょうか?
ここの論理はかなり飛躍しているので、詳しくはもっと調査が必要です。
ですが、あくまで超安全な運用、という意味で疑いがある以上コンサバに読んだ、という風にご理解くださいませませ。

すんげーーーながくなりましたが、
割りと重要な話だと思いましたので、記載いたしました。
以上でございまする。

(ちなみに、なぜ「物理1コアに見えたのか?」という疑問は未だ解決してません。。。)