EC2のEBSボリュームのパフォーマンスをテストする

Amazon EC2

AWS で EC2 インスタンスを運用するとき、EC2 インスタンスとディスク I/O が適切な値に設定されているかどうか確認したいことがありました。Benchmark EBS volumes - Amazon EBS を参考に試したときの備忘録です。

目次

  1. 検証用の EC2 インスタンスと EBS ボリュームをセットアップする
  2. fio をインストール
  3. C ステートの無効化
  4. ベンチマークテストを実行する
  5. オプションのポイント
  6. 実行結果の確認

検証用の EC2 インスタンスと EBS ボリュームをセットアップする

検証用として以下を設定しました。実際に稼働させる環境と合わせるのが良いと思います。

  • Amazon Linux 2023 (EBS 最適化インスタンスとして起動)
  • m7i.large
  • gp3 (30 GiB, 3000 IOPS, 125 Throughput)

fio をインストール

fio がインストールされていない場合はインストールします。

sudo dnf update -y
sudo dnf install -y fio

C ステートの無効化

Benchmark EBS volumes | Disable C-states - Amazon EBS によると、CPU が省電力モードに切り替わった場合、その状態から復帰するときにパフォーマンスが悪化する可能性があるとのことです。ベンチマークテストのときは無効にしておくのがよいとのこと。

cpupower idle-info | grep "Number of idle states:"
for i in `seq 1 $((N-1))`; do cpupower idle-set -d $i; done

元に戻す場合は以下のコマンドで

cpupower idle-info | grep "Number of idle states:"
for i in `seq 1 $((N-1))`; do cpupower idle-set -e $i; done

ベンチマークテストを実行する

fio コマンドのオプションは、Benchmark EBS volumes | Perform benchmarking - Amazon EBS の Benchmark Provisioned IOPS SSD and General Purpose SSD volumes にかかれているコマンド参考に、EC2 インスタンスタイプと EBS の IOPS の数値によって、少し手を加えたものになります。オプションのポイントは後述します。

書き込み

sudo fio --directory=/home/ec2-user/ --ioengine=psync --name fio_write_test_file --direct=1 --rw=randwrite --bs=16k --size=1G --numjobs=2 --time_based --iodepth=3 --runtime=180 --group_reporting --norandommap

読み取り

sudo fio --directory=/home/ec2-user/ --name fio_read_test_file --direct=1 --rw=randread --bs=16k --size=1G --numjobs=2 --time_based --iodepth=3 --runtime=180 --group_reporting --norandommap

オプションのポイント

上記コマンドのオプションのポイントです。オプションの詳細については man fio コマンドを参照。

--directory=/home/ec2-user/
テストファイルを作成するディレクトリを指定します。本番環境で実際にファイルが書き込まれるディレクトリで行うことが望ましいです。

--direct=1
キャッシュなしで直接 I/O 性能を評価します。詳細は man flo コマンドの後 direct=bool を検索。

--rw=randwrite
実際のアプリケーションの動作をシミュレートするために、ランダム書き込みを使用します。

--bs=16k
I/O 操作のブロックサイズを16KBに設定します。

--size=1G
テストファイルのサイズを 1GB に設定します。

--numjobs=2
fio コマンドのプロセス数を設定します。実際のアプリケーションの並列数に応じて調整します。

--iodepth=3
1000 IOPS あたり 1 を設定することが推奨されています。今回は EBS ボリュームの IOPS が 3000 なので 3 に設定します。

--runtime=180
180秒間(3分間)のテストを実行します。ある程度の期間で一定のパフォーマンスが出るかを測ることができます。

実行結果の確認

read のベンチマークに対する結果の読み方です。重点的に確認する場所は以下の通り。

IOPS

IOPS はシステムが 1 秒間に処理できる I/O 操作の回数を示します。

read: IOPS=3015, BW=47.1MiB/s (49.4MB/s)(8481MiB/180001msec)

スループット (Bandwidth, BW)

スループットは単位時間あたりに転送されるデータの量を示します。EBS で指定するスループットは MB/s です。

bw (  KiB/s): min=32800, max=74368, per=100.00%, avg=48253.77, stdev=1654.06, samples=718

レイテンの最大値と最小値、平均

レイテンシは I/O 操作が完了するまでの時間 (マイクロ秒)を表します。

clat (usec): min=254, max=17513, avg=662.93, stdev=336.70
  • clat は completion latency の略。
  • usec は マイクロ秒のこと (u がマイクロ、sec は秒)。

レイテンシのパーセンタイル

パーセンタイルは結果を 100 分割したときの、それぞれの位置を示す値のことです。

clat percentiles (usec):
 |  1.00th=[  302],  5.00th=[  326], 10.00th=[  355], 20.00th=[  433],
 | 30.00th=[  515], 40.00th=[  578], 50.00th=[  635], 60.00th=[  668],
 | 70.00th=[  709], 80.00th=[  799], 90.00th=[  988], 95.00th=[ 1188],
 | 99.00th=[ 1680], 99.50th=[ 1876], 99.90th=[ 2704], 99.95th=[ 5997],
 | 99.99th=[ 9896]
  • 中央値(50パーセンタイル)や高いパーセンタイル(90パーセンタイル、99パーセンタイル)に注目すると、通常の I/O 操作と負荷がかかったときの性能を把握しやすいです。
  • 今回は 99% の I/O 操作は 1680 マイクロ秒以下で完了しており、安定した性能が期待できます。

CPU

cpu          : usr=0.16%, sys=0.39%, ctx=542828, majf=0, minf=33
  • I/O 操作中にどれだけCPUが使用されているかを確認します。
  • 今回は非常に低いです。

-技術ブログ
-