みなさん。こんばんは。初登場のフレンチブルドッグDXです。略してフレブルDXと申します。これから、どうぞよろしくお願いします。

誰でもよく使うEC2とEBSについて何を選んでどうチューニングすれば良いのか?困ることが多いので調べてみました。調べて分かったことをお伝えしていこうと思います。

EC2のパフォーマンス(CPU編)

EC2上でのパフォーマンスに影響を与える要因は色々あるかと思いますが、
まず一つ目としてCPUの違いによるパフォーマンスのばらつきが挙げられます。同じインスタンスタイプでもインスタンスによってCPUが違うことがある・・・?

こちら、lscpuコマンドで真偽を確かめてみました。
お手軽ベンチマークは以下です。
$ curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash
$ sudo yum -y install sysbench
$ sysbench cpu run

赤枠で囲った“events per second” の値に着目してみます。値が大きいほど速いんです。そしてなんと、スコアに差が出ましたよ。CPUはインスタンスを再起動すると変わることがあります。
逆に言えば、インスタンスを再起動するだけでCPUを別のものにできるので、希望のCPUになるまで何度か再起動を繰り返す、といったことも可能です。

EC2のパフォーマンス(ネットワーク帯域幅編)

DBとかAP系のミドル全部盛りじゃないと、あまりEC2のCPU/メモリそんな消費しないよね。
いつもスカスカじゃない、なのにお客様から処理が遅い、何とか速く改善できないのといわれるあなた!そんな時はNW帯域幅を疑ってみよう!

例えば 1秒間に合計で100MbyteのデータをEC2に対して送信していれば、その帯域の計算は
100[Mbyte] * 8[bit/byte] = 800[Mbit]
帯域としては800Mbpsとなります。この計算値がEC2のネットワーク帯域幅以下であることが推奨されます。

以下はLinuxのメトリクス名で記載をしております。Windowsだとメトリクス名が異なるので注意が必要です。

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/CloudWatch-Agent-network-performance.htmlより引用

ネットワーク帯域がボトルネックになっている場合は上記のカスタムメトリクスで顕著にでます。
パラメータストアで下記な感じで登録します。

“ethtool”: { “interface_include”: [ “eth0” ], “metrics_include”: [ “rx_packets”, “tx_packets”, “bw_in_allowance_exceeded”, “bw_out_allowance_exceeded”, “conntrack_allowance_exceeded”, “linklocal_allowance_exceeded”, “pps_allowance_exceeded”

EC2ネットワーク帯域幅がボトルネックになっているのがわかったら??⇒N系インスタンスに変更すべき?
ここはネットワーク帯域幅の課題とイコールではなく、各環境に依存することはもちろんですが、M5系に変更することで改善した経験があります。(※あくまでフレブルDXの経験です。。。)

EBS編

Amazon EBS では複数のボリュームタイプが提供されておりパフォーマンス特性と料金が異なります。ここでは、みなさんも利用される機会の多いgp2、gp3について紹介します。

gp2 の I/O 性能はボリュームの割当サイズにより変動します。ベースラインパフォーマンスは 1 GiB あたり 3 IOPS で、最小値は 100 IOPS、最大値は 16000 IOPS です。例えば 100 GiB のボリュームでは 300 IOPS がベースライン (最低保障) 性能となります。

gp3 は最新世代の汎用 SSD ボリュームです。gp3 には I/O クレジットおよびバーストパフォーマンスの概念はありません。割当サイズによらず、ベースライン性能は 3,000 IOPS と 125 MiB/秒のスループットです。追加料金を支払うことで 最大 16,000 IOPS および 1,000 MiBps に拡張できます。 また、 既存の gp2 ボリュームよりも GB あたり最大 20% 低い料金で利用することができます。

そもそもIOPSとは?IOPSの「IO」とは、インプットとアウトプットの頭文字を取ったものでデータの「書き込み」と「読み込み」を示しています。
1秒あたりの入出力操作数を表す測定単位のことを意味します。操作はKiB単位で計測することができます。

汎用 SSD ( gp3) についての更なるおすすめ

gp3 はチューニングの自由度が高く、I/O クレジットのような複雑な概念がありません。1 GB あたりの利用料金も gp3 のほうが 20% 安く利用できです。また割当容量が少ないボリュームの場合は、gp2 と比較して高いベースライン性能の恩恵を受けることが可能です。

※EC2 インスタンスタイプによる上限があります。EC2 のインスタンスタイプごとに Amazon EBS 専用の帯域幅が定められており、IOPS、スループットの上限が決まります。 gp3 や io2 ボリュームで高い性能を確保たとしても、インスタンスタイプごとの上限がネックとなり、性能を確保できないケースがあります 。

gp2からgp3への変更(オンライン)はどうやればできる?

現行リリースされているEC2インスタンスでこちらなら対応OK!

加えて、制約事項のうち「 gp2 から gp3 への変更」という操作に関係しそうな部分として以下があります。
・マルチアタッチが有効な EBS ボリュームでは不可
・ボリュームが 2016 年 11 月 3 日 23:40 (UTC) 以前にアタッチされていた場合は、Elastic Volumes サポートを初期化する必要がある
・ボリュームサイズを小さくすることはできない

実際のパフォーマンスはどうでしょうか。CloudWatch を使用して、EBS ボリュームのステータスをモニタリングできます。また、モニタリングで得られたデータを使用して、ボリュームが提供する IOPS の平均数と平均スループットを求めることができます。

次の数式を使用して、EBS ボリュームが提供する IOPS の平均数を計算します。
実際の平均 IOPS (I/O 操作数/秒) = (Sum(VolumeReadOps) + Sum(VolumeWriteOps) ) ÷ ( Period – Sum(VolumeIdleTime) )

以上、フレブルDXがお届けしました。