AWS で EC2 インスタンスを運用するとき、EC2 インスタンスとディスク I/O が適切な値に設定されているかどうか確認したいことがありました。Benchmark EBS volumes - Amazon EBS を参考に試したときの備忘録です。
目次
検証用の EC2 インスタンスと EBS ボリュームをセットアップする
検証用として以下を設定しました。実際に稼働させる環境と合わせるのが良いと思います。
- Amazon Linux 2023 (EBS 最適化インスタンスとして起動)
- t3.nano
- 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/ --name fio_write_test_file --ioengine=psync --direct=1 --rw=randwrite --bs=16k --size=1G --numjobs=1 --time_based --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=1 --time_based --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=1
fio コマンドのプロセス数を設定します。実際のアプリケーションの並列数に応じて調整します。
--runtime=180
180秒間(3分間)のテストを実行します。ある程度の期間で一定のパフォーマンスが出るかを測ることができます。
実行結果の確認
read のベンチマークに対する結果の読み方です。重点的に確認する場所は以下の通り。
IOPS
IOPS はシステムが 1 秒間に処理できる I/O 操作の回数を示します。今回は IOPS 1093 です。インスタンスタイプが小さいためか、EBS で設定されているパフォーマンスを出し切れていないように見えます。
write: IOPS=1093, BW=17.1MiB/s (17.9MB/s)(3076MiB/180001msec); 0 zone resets
スループット (Bandwidth, BW)
スループットは単位時間あたりに転送されるデータの量を示します。EBS で指定するスループットは MB/s です。
bw ( KiB/s): min=14304, max=20800, per=100.00%, avg=17511.61, stdev=522.79, samples=359
レイテンシの最大値と最小値、平均
レイテンシは I/O 操作が完了するまでの時間 (マイクロ秒)を表します。
clat (usec): min=285, max=11384, avg=912.01, stdev=244.54
- clat は completion latency の略。
- usec は マイクロ秒のこと (u がマイクロ、sec は秒)。
レイテンシのパーセンタイル
パーセンタイルは結果を 100 分割したときの、それぞれの位置を示す値のことです。
clat percentiles (usec):
| 1.00th=[ 490], 5.00th=[ 783], 10.00th=[ 816], 20.00th=[ 840],
| 30.00th=[ 857], 40.00th=[ 873], 50.00th=[ 881], 60.00th=[ 898],
| 70.00th=[ 922], 80.00th=[ 947], 90.00th=[ 1004], 95.00th=[ 1074],
| 99.00th=[ 1762], 99.50th=[ 2278], 99.90th=[ 4146], 99.95th=[ 4817],
| 99.99th=[ 7308]
- 中央値(50パーセンタイル)や高いパーセンタイル(90パーセンタイル、99パーセンタイル)に注目すると、通常の I/O 操作と負荷がかかったときの性能を把握しやすいです。
- 今回は 99% の I/O 操作は 1762 マイクロ秒以下で完了しており、安定した性能が期待できます。
CPU
cpu : usr=0.56%, sys=1.42%, ctx=197093, majf=1, minf=11
- I/O 操作中にどれだけCPUが使用されているかを確認します。
- 今回は非常に低いです。