Amazon EC2のインスタンスタイプを選ぶときに考慮しておきたいこと

# はじめに
最近AWSの東京リージョンでInsufficient Capacity Errorに当たることが増えてきました。
一時的なキャパシティの問題なので時間経過で解決したり、事前にオンデマンドキャパシティ予約を行ったりすることなどで回避できます。

こちらが起きる要因のうちの一つの仮説としては、EC2インスタンスの選択に偏りがあるのでは？ということもあります。特にm6,c6といった第3世代のIntel Xeon／AMD EPYCを使った、時間単金あたりのコストが比較的安いx86系のインスタンスで発生しやすいように感じます（あくまで個人の感想の範疇です）

本記事は一般的なInsufficient Capacity Errorエラーの回避策の解説ではなく、読んでる皆さんが適切なインスタンスタイプを選択して、キャパシティの平準化を図ろうという意図の記事となります。

一般的なInsufficient Capacity Errorエラーの回避策については、re:Postでよくまとめられているのでこちらをご覧ください。

https://repost.aws/ja/knowledge-center/ec2-insufficient-capacity-errors

# 一般的なインスタンスタイプの選択
一般的にインスタンスタイプを選択する際には、以下のような要素を検討します。
* CPUのアーキテクチャ（x86系なのか、ARM64系なのか）
* vCPU数
* メモリ(GiB)
* ネットワーク帯域幅
* EBS帯域幅
これらがアプリケーションを動かすうえで必要な動作条件を満たしたり、既存システム更改の場合は運用時のメトリクス（CPU利用率等）を参考にしながら決めていきます。
これらの条件が満たされたインスタンスタイプは多くの場合いくつかあるため、コストを比較します。
CPUバーストが許容されるのであればt系、許容されないのであればその他のインスタンスタイプのうち、時間当たりのコストが安いものを選択するのが一般的です。

しかしこういった比較だけでは、総合的なパフォーマンスとコストのバランスが取れているかどうかはわかりません。インスタンスタイプの比較表を見るとこのような特徴に記載してある違いがあります。
* vCPUのプロセッサのパフォーマンス比較（最大クロック数やプロセッサの世代）
* メモリ（RAM）の世代による速度比較

つまり、単純なCPU数やメモリ容量の比較だけでは難しく、インスタンスタイプの総合的なパフォーマンスを加味して行う必要があります。

:::note info
例えば、vCPUとメモリ数が同じインスタンスで、新世代のインスタンスが20％性能向上しているインスタンスがあるとします。
新世代のインスタンスと旧世代のインスタンスの1台当たりの時間単位コストは、新世代のインスタンスが1割高いと仮定します。
この時、旧世代のインスタンスの性能とコストをそれぞれ1としたときに、システムの要求性能が10とした場合、必要なコストは以下のようになります。
* 旧世代のインスタンス：10台必要なので、必要コストは10
* 新世代のインスタンス：10÷1.2=8.333なので9台必要、必要コストは9.9

この場合、新世代のインスタンスを9台使う方がコストを下げることができます。
:::

# 世代間のパフォーマンス比較の例
EC2インスタンスにはご存じの通り、同じCPUアーキテクチャ、vCPU数、メモリ容量のものがいくつかあります。ネーミングポリシーは下記のとおりです。

~~~
[ファミリー][世代](追加機能).[サイズ]
~~~

この世代が上がるとCPUのプロセッサの世代が変わったり、EC2内部の構成が変わります。
汎用インスタンスであるmタイプだと、おおむね世代が上がるごとに時間単位の料金も下がっているのですが、m6⇒m7では上がっています。詳しくは後述のコスト比較で行いたいと思います。

## m7,c7,r7のインスタンスは高い？
では、m7,c7といったインスタンスはコストの観点から避けるべき世代なのでしょうか？
ここは時間単位の料金だけではなく、費用対性能で見てみたいと思います。

## m7aとm6a,m7iとm6iインスタンスの比較
具体的には、汎用インスタンスであるmシリーズを見てみたいと思います。
m7aおよび、m7iインスタンスの説明には、このような説明があります。

#### m7aインスタンスの特徴
> 第4世代AMD EPYCプロセッサを搭載したAmazon EC2 M7aインスタンスは、M6aインスタンスと比較して最大 50% 高いパフォーマンスを発揮します。
> 
> 特徴:
> 
> 最大3.7GHzの第4世代AMD EPYCプロセッサ(AMD EPYC 9R14)
> DDR4に比べて広い帯域幅を提供する最新のDDR5メモリ

https://aws.amazon.com/jp/blogs/aws/new-amazon-ec2-m7a-general-purpose-instances-powered-by-4th-gen-amd-epyc-processors/


#### m7iインスタンスの特徴
> Amazon EC2 M7iインスタンスは、第4世代インテルXeonスケーラブルプロセッサを搭載しており、M6i インスタンスより15%優れた料金パフォーマンスを実現します。
>
> 特徴:
>
> 最大3.2GHzの第4世代インテルXeonスケーラブルプロセッサ (Sapphire Rapids 8488C)
> 新しいAdvance Matrix Extensions (AMX) がマトリックス乗法演算を高速化
> DDR4に比べて広い帯域幅を提供する最新のDDR5メモリ

https://aws.amazon.com/jp/blogs/news/new-seventh-generation-general-purpose-amazon-ec2-instances-m7i-flex-and-m7i/

リリース文だけではわかりづらいので、実際に東京リージョンにおけるm7a.largeとm6a.largeの比較をしてみたいと思います。

### コスト比較
東京リージョンにおけるm7a.largeとm6a.largeのオンデマンド料金比較は下記です。
|インスタンスタイプ|料金|
|---|---|
|m7a.large|USD 0.14973|
|m6a.large|USD 0.1116|

料金差としては、m7aのほうが34％高いことになります。

### ベンチマークソフトでの比較
ベンチマークについては、下記の条件で行います。
* 東京リージョンの同一VPC内の同一AZであること
* 外部通信からの影響を避けるため、プライベートサブネットで使用
* Amazon Linux 2023を使用
* ベンチマークツールはPhoronix Test Suiteの7-Zip Compressionを使用

構成イメージ
![ec2.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308706/474f9172-8c05-4ea1-94db-a4e4597042b1.png)

#### 実行結果

m7a.large
~~~
7-Zip Compression 24.05:
    pts/compress-7zip-1.11.0
    Test 1 of 1
    Estimated Trial Run Count:    3                      
    Estimated Time To Completion: 18 Minutes [XX:XX UTC] 
        Started Run 1 @ XX:XX:XX
        Started Run 2 @ XX:XX:XX
        Started Run 3 @ XX:XX:XX

    Test: Compression Rating:
        16070
        16081
        16222

    Average: 16124 MIPS
    Deviation: 0.53%

    Comparison of 2,081 OpenBenchmarking.org samples since 10 May 2024; median result: 96425 MIPS. Box plot of samples:
    [|-*-----##########!###*####*######*####*-----------------------------*-----------------*-*-*--------*------------------------------------*-------------------------*-*-*--*------------------------------*-*---------------*-*----|               *                ]
       ^ This Result (10th Percentile): 16124
                  2 x AMD EPYC 7303: 200698 ^   2 x AMD EPYC 9224: 353836 ^   2 x AMD EPYC 9275F: 507917 ^          2 x AMD EPYC 9534: 695946 ^          AMD EPYC 9845: 857791 ^  2 x AMD EPYC 9575F: 1016830 ^             2 x AMD EPYC 9655: 1219921 ^
               AMD EPYC 4584PX: 177235 ^                               Intel Xeon 6780E: 464546 ^                                                 2 x AMD EPYC 9535: 846712 ^                          2 x AMD EPYC 9755: 1116706 ^
                                ^ AMD EPYC 4464P: 140358            2 x AMD EPYC 9255: 452653 ^                                              2 x Intel Xeon 6980P: 833643 ^                          2 x AMD EPYC 9645: 1104212 ^
                           ^ AMD EPYC 7551: 115838                 Intel Xeon 6766E: 443674 ^                                                     AMD EPYC 9655: 826143 ^                AMD EPYC 9965: 1023541 ^


    Test: Decompression Rating:
        10061
        10020
        10064

    Average: 10048 MIPS
    Deviation: 0.24%

    Comparison of 2,044 OpenBenchmarking.org samples since 10 May 2024; median result: 78009 MIPS. Box plot of samples:
    [|*--########!###*##*#*######------------*----------------------------*--------*---*----*--------------*--------------------------------*------*------------*-------*--*-------------------------------------------------*------*|           *           *      *   ]
      ^ This Result (7th Percentile): 10048
                  2 x AMD EPYC 7373X: 252271 ^   Intel Xeon 6766E: 425440 ^      2 x AMD EPYC 9455: 625591 ^   2 x Intel Xeon 6780E: 831788 ^   2 x AMD EPYC 9565: 1021036 ^                      2 x AMD EPYC 9754: 1325673 ^           2 x AMD EPYC 9825: 1557636 ^
                          ^ AMD EPYC 7551: 133753                2 x AMD EPYC 9374F: 538475 ^                                                     AMD EPYC 9965: 998566 ^                                                         2 x AMD EPYC 9745: 1514954 ^
                        ^ AMD EPYC 4464P: 120192                AMD EPYC 9575F: 508509 ^                                              2 x AMD EPYC 9534: 949019 ^                                                     2 x AMD EPYC 9755: 1445744 ^
                     ^ 2 x Intel Xeon E5-2690 v3: 105080 2 x AMD EPYC 9365: 484433 ^                                         AMD EPYC 9755: 874231 ^                                                  2 x Intel Xeon 6980P: 1367428 ^

~~~

m6a.large
~~~
7-Zip Compression 24.05:
    pts/compress-7zip-1.11.0
    Test 1 of 1
    Estimated Trial Run Count:    3                      
    Estimated Time To Completion: 18 Minutes [XX:XX UTC] 
        Started Run 1 @ XX:XX:XX
        Started Run 2 @ XX:XX:XX
        Started Run 3 @ XX:XX:XX

    Test: Compression Rating:
        10275
        10294
        10319

    Average: 10296 MIPS
    Deviation: 0.21%

    Comparison of 2,081 OpenBenchmarking.org samples since 10 May 2024; median result: 96425 MIPS. Box plot of samples:
    [|*------##########!###*####*######*####*-----------------------------*-----------------*-*-*--------*------------------------------------*-------------------------*-*-*--*------------------------------*-*---------------*-*----|               *                ]
      ^ This Result (6th Percentile): 10296
                  2 x AMD EPYC 7303: 200698 ^   2 x AMD EPYC 9224: 353836 ^   2 x AMD EPYC 9275F: 507917 ^          2 x AMD EPYC 9534: 695946 ^          AMD EPYC 9845: 857791 ^  2 x AMD EPYC 9575F: 1016830 ^             2 x AMD EPYC 9655: 1219921 ^
               AMD EPYC 4584PX: 177235 ^                               Intel Xeon 6780E: 464546 ^                                                 2 x AMD EPYC 9535: 846712 ^                          2 x AMD EPYC 9755: 1116706 ^
                                ^ AMD EPYC 4464P: 140358            2 x AMD EPYC 9255: 452653 ^                                              2 x Intel Xeon 6980P: 833643 ^                          2 x AMD EPYC 9645: 1104212 ^
                           ^ AMD EPYC 7551: 115838                 Intel Xeon 6766E: 443674 ^                                                     AMD EPYC 9655: 826143 ^                AMD EPYC 9965: 1023541 ^


    Test: Decompression Rating:
        7619
        7658
        7618

    Average: 7632 MIPS
    Deviation: 0.30%

    Comparison of 2,044 OpenBenchmarking.org samples since 10 May 2024; median result: 78009 MIPS. Box plot of samples:
    [|---########!###############---------------------------*--------------------*-*---*----*------------------------------------*-*--------*------*------------*---------------------------------*--*------------*----------*------*|                              *   ]
                                    AMD EPYC 8534PN: 343190 ^    2 x AMD EPYC 9374F: 538475 ^         2 x AMD EPYC 9475F: 762580 ^    2 x AMD EPYC 9534: 949019 ^      2 x AMD EPYC 9645: 1160147 ^   2 x Intel Xeon 6980P: 1367428 ^    2 x AMD EPYC 9825: 1557636 ^
                                                                AMD EPYC 9575F: 508509 ^                                     AMD EPYC 9755: 874231 ^                                              2 x AMD EPYC 9754: 1325673 ^
                                                         2 x AMD EPYC 9365: 484433 ^                           2 x Intel Xeon 6780E: 831788 ^                                          2 x AMD EPYC 9655: 1255886 ^
                                                        Intel Xeon 6780E: 469169 ^                    2 x Intel Xeon 6766E: 776612 ^                                      2 x AMD EPYC 9654: 1178644 ^
~~~

本テストでは下記のような結果になりました。
|インスタンスタイプ|スコア(圧縮)|スコア(解凍)|
|---|---|---|
|m7a.large|16,124|10,048|
|m6a.large|10,296|7,632|

使用するアプリケーションや環境によって結果は異なりますが、本テストにおいては
m7a.largeのパフォーマンスがm6a.largeと比較して圧縮時に56％、解凍時に31％改善しているということになります。単純計算ですが、43.5％改善しているとします。

### コストパフォーマンスの比較
m6a.largeのコストと性能を1とすると、m7a.largeのコストと性能は下記になります。
|項目|m7a.large|m6a.large|
|---|---|---|
|コスト|1.34|1|
|性能|1.44|1|

:::note info
この結果からすると、冒頭の例に挙げたようなm6a.largeで性能10を要求するシステムの場合、必要なm7a.largeのインスタンスは7台となり、コストは9.38になります。
単純計算では、3台のケース、5台以上でm7aのほうがコストパフォーマンスを上回ることになります。
要求性能ごとに必要な台数のイメージは下記のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308706/935afb3a-5fad-40e3-9b53-c27a6a1ea079.png)
ただ、この結果は利用するアプリケーションによって異なるため、実際のケースにおいて検証やパフォーマンス評価を行ってください。
:::
# まとめ
このように、単純なvCPU数やメモリ容量を見るだけではなく費用対性能を加味してインスタンスタイプを選択することで、最適なインスタンスを使うことができるようになります。
本結果は一例ですが、ほかにもc7iとr7iのテストをした結果などもありましたので、併せてご覧ください。

https://www.seeds-std.co.jp/blog/creators/2023-12-22-4a51410f-bc22-404d-8e02-dbe2d8d09293/