知らないと損する!EC2のCPU性能の真実
こんにちは、ゲームソリューション部の出村です。
みなさん、EC2は利用していますか? EC2ではインスタンスタイプによって割り当てられているCPUの数は、vCPUという数値で示されています。
いまどきのCPUは、1つのCPUに複数の物理CPUコア(=人間の脳に相当)が、搭載されています。そのため、「vCPU数 = インスタンスに割り当てられている物理CPUコアの数」と捉えてしまうかもしれません。
これ、実は「インスタンスタイプによって異なる」のが正解です。そもそもvCPUは、仮想CPU(Virtual CPU)の意味ですので、かならず物理CPUの数と一致するとは限りません。そして、この謎を解き明かすキーワードが「ハイパースレッディング」です。
ハイパースレッディングとは
CPUの処理速度を向上させるため、CPUの内部での処理をより効率化させるため、CPUベンダー各社はさまざまな技術を生み出しています。それら技術のうちの1つが、これから紹介するハイパースレッディングです。
ハイパースレッディング(Hyper-Threading)は、1つの物理CPUコアに対して、複数の命令制御装置(たとえばメインメモリから実行する命令を取得する、といった演算前後を処理を行うCPU内部の回路)を用意することで、物理CPUコアをより効率的に動作させる技術です(なおハイパースレッディングはIntelの登録商標です。)
この技術を活用することで、CPU物理コアの稼働率を向上させ、結果としてより多く処理できるようになります。
ハイパースレッディングとは何か?
ハイパースレッディングを具体的に説明していきます。
ハイパースレッディングがないCPUでは、1つの物理CPUコアに対して、1つの命令制御装置を備えています。なお、すべての命令は命令制御装置で制御されています。
そして、ハイパースレッディングを有効化したCPUは、1つの物理CPUコアに対して、複数の命令制御装置を備えています。これにより、1つの物理CPUコアに対して、複数の入り口が用意されており、これによって物理CPUコアの数以上のCPUコアが搭載されているようにOSからは見えるようになっています。
これを郵便窓口で例えてみます。ハイパースレッディングがないCPUは1つの窓口で1人の郵便局員が対応しています状況です。ハイパースレッディングがあると、1つの窓口で2人の郵便局員が交互に対応する状況となります。これにより、1人が手続きをしている間にもう1人が次の準備をすることができ、全体の処理速度が上がります。
実際のCPUの内部では、整数演算を扱う回路と小数(浮動小数点演算)を扱う回路が別々に存在します。そのため、ハイパースレッディングを利用することで、整数演算と小数(浮動小数点演算)を交互に実行するような処理内容だと、整数演算と小数(浮動小数点演算)の回路が両方稼働することになり、効率よく回路が稼働します。
ハイパースレッディングが有利な場面、不利な場面
ただ、ハイパースレッディングがすべての場合で有効かというと、そうでもありません。有利な場面、不利な場面をみていきます。
ハイパースレッディングが有効な場面としては、動画処理といったマルチメディア演算がそうです。というのも、整数演算と浮動小数点演算という異なる回路が交互に使われるため、全体の回路が効率良く利用されるためです。
一方、ハイパースレッディングが不利な場面としては、さまざまな処理が入れ替わり立ち替わり行われる場合、あとは、整数演算が延々と続くといった同様の処理が多い場面です。この場合、整数演算の回路に処理が集中してしまうため、全体の回路を効率良く利用するという目的がはたせず、ハイパースレッディングのメリットが活かされません。
EC2におけるCPUとハイパースレッディング
先ほど解説しましたが、vCPUはEC2インスタンスが認識しているCPU(仮想CPUコア)の数であり、その数は物理CPUコアと同じとは限りません。
それを前提にみていきましょう。*.largeは、すべて2 vCPUです。しかし、そのインスタンスで稼働している物理CPUコアの数は、異なります。そしてEC2の世代によっても異なります。
ここでは、以下の表を元に話をすすめていきます。
m6i.large | m7i.large | m6a.large | m7a.large | |
---|---|---|---|---|
プロセッサタイプ | Intel | Intel | AMD | AMD |
プロセッサ | Ice Lake 8375C | Sapphire Rapids 8488C | EPYC 7R13 | EPYC 9R14 |
vCPU(仮想CPUコア数) | 2 | 2 | 2 | 2 |
物理CPUコア数 | 1 | 1 | 1 | 2 |
単価 | $0.124 | $0.1302 | $0.1116 | $0.14973 |
第6世代のEC2
第6世代では、m6i.*(Intel製CPUを搭載)やm6a.*(AMD製CPUを搭載)のインスタンスでは、いずれもハイパースレッディングが有効化されています。
そのため、m6i.largeやm6a.largeは、vCPUは2ですが、インスタンスに割り当てられている物理CPUコアは1個のみです。
第7世代のEC2
第7世代では、m7i.*(Intel製CPUを搭載)とm7a.*(AMD製CPUを搭載)のインスタンスでは様相が異なります。m7i.*は、ハイパースレッディングがONとなっていますが、m7a.*は、ハイパースレッディングがOFFとなっています。
largeインスタンスで比較すると、m7i.largeとm7a.largeのいずれのインスタンスもvCPUは2ですが、割り当てられている物理CPUコアの数はm7i.largeは1個ですが、m7a.largeでは2個となります。
単価で比較すると、実際の価格差はm7i.largeと比較してm7a.largeは約15%増となっています。
m7i.large | m7a.large | |
---|---|---|
プロセッサタイプ | Intel | AMD |
プロセッサ | Sapphire Rapids 8488C | EPYC 9R14 |
vCPU(仮想CPUコア数) | 2 | 2 |
物理CPUコア数 | 1 | 2 |
単価 | $0.1302 | $0.14973 |
ベンチマーク
ここでベンチマークをみていきましょう。UnixBenchを利用したベンチマークとなります。
m6i.large | m7i.large | m6a.large | m7a.large | ||
---|---|---|---|---|---|
シングルスレッド | 整数演算 | 51402286.9 | 58576748.8 | 54104351.6 | 57476400.5 |
" | 浮動小数点演算 | 7636.4 | 8562.7 | 8734.4 | 9163.4 |
マルチスレッド | 整数演算 | 56014044.2 | 77970988.2 | 75836095.2 | 114193452.6 |
" | 浮動小数点演算 | 13643.7 | 15491.4 | 14966.7 | 18324.6 |
シングルスレッドでは、m6iからm7i、m6aからm7aへといった第六世代から第七世代へは順当に性能アップしています。
マルチスレッドでは、大きく違います。m6iからm7iであれば、順当に性能向上しているようにみえます。m6aからm7aでは、整数演算の性能が1.5倍程度と大きく向上しています。
この裏には、m7iはハイパースレッディングがON(=利用している物理CPUコアの数を1個のみ利用)、m7aはハイパースレッディングがOFF(=利用している物理CPUコアの数を2個利用)という物理CPUコアの数が影響しています。
まとめ
このように、Webサイトに掲載されている情報のみだと、大きな違いがあるように見受けられませんが、実際に試用してみるとその差が大きくでることがあります。
これを機会に、一度EC2インスタンスの構成などを見直すと、よりコスト効率がよい運用ができることでしょう。