ストレージパフォーマンスの計測方法

IPVのストレージパフォーマンスを測定する方法を記載します。
ストレージのパフォーマンス基準は主に"IOPS"、"スループット"および"レイテンシ"となります。


- IOPS
1秒当たりにディスクが処理できるI/Oアクセス(書き込み/読み込み)の数となります。
データベースシステムは、"IOPS"の影響を受けます。

- スループット
1秒間に正常に転送されるデータサイズとなります。
大規模な読み込みまたは書き込み操作を必要とするアプリケーションは、"スループット"の影響を受けます。

- レイテンシ
I/Oリクエストを完了させるために必要な時間となります。
"IOPS"に影響を受けるシステムは、"レイテンシ"の影響を受けます。
スループットの影響を受けるアプリケーションは、あまり"レイテンシ"の影響は受けません。

パフォーマンスはストレージ容量[KiB (Kibibyte)、MiB (Mebibyte)、GiB (Gibibyte) または TiB (Tebibyte)]等のバイナリ単位で測定されます。

注釈

1KiBは1,024 bytes、1MiBは1,024 KiB、1GiBは1,024 MiB、1TiBは1,024 GiBとなります。

ストレージパフォーマンスの計測

本ガイドでは、ストレージパフォーマンス測定にオープンソースツールの FIO を使用してベンチマークを測定し、さまざまなワークロードのシミュレートを行います。
FIOは、Linux/ Windows のどちらのオペレーティングシステムへも導入できます。

FIOの導入に関しては、前述のリンクをご参照下さい。
本ガイドでは、Linuxにて"FIO"ツールを使用したストレージパフォーマンスの測定方法を記載します。

前提条件

本ガイドでは、"Org Admin"での操作を想定しています。
IPVご利用開始時に標準で用意されているロール、ロールに紐づいている権限は以下を参照下さい。


作業手順

1. ストレージパフォーマンスを測定する仮想マシンの準備

他チュートリアルを参考に仮想ネットワーク、および仮想マシンを作成します。
FIOの導入にあたり、インターネット接続が必要となる為、インターネットと接続するOvDCネットワークと疎通ができるようにします。
本ガイドにおける、パフォーマンス測定用仮想マシンのスペックは下記の通りです。

パフォーマンス測定用仮想マシン
項目 設定内容
OS Ubuntu-21.0.4
ストレージのサイズ 80GB

2. ストレージパフォーマンスの計測

2.1. FIOの導入

FIOをインストールします。
Ubuntuは、OSにデフォルトで設定されているリポジトリでFIOが提供されています。

Linux
# パッケージの最新化を行います
apt update


# FIOを導入します
apt install -y fio


# apt処理完了後、導入確認を行います。
fio --version

2.2. ストレージパフォーマンス計測の為の環境設定

"FIO"によるストレージパフォーマンス測定の為の環境設定を行います。

Linux
# FIO実行用ディレクトリの生成
cd /
mkdir fio

# FIO実行用ディレクトリの確認
cd fio
pwd

## 出力結果
/fio

FIO計測に用いるジョブファイルを作成します。
ジョブファイルのパラメータは以下となります。

FIOジョブファイル[global]セクション
パラメータ 概要
ioengine I/O発行に使用するエンジンの指定
direct "true(1)"の場合、non-buffered I/Oで計測(Linuxキャッシュを使用しない)
invalidate "true(1)"の際、I/O計測前にキャッシュを使用しない様にする
group_reporting ジョブ事に纏まったレポート生成
directory FIOで使用するファイルプレフィックス
filename I/Oをかけるファイル、デバイスを指定(:にて複数指定が可能)
runtime I/O性能測定時間
kb_base キロバイト(KB)サイズを"1000" or "1024"かを指定

FIOジョブファイル[ジョブ名]セクション
パラメータ 概要
[ジョブ名] ジョブ名
rw I/O種別
size I/O測定にて利用する合計サイズ
bs 1回のI/O転送長
iodepth I/O多重度
numjobs I/O実行プロセス数の指定(thread=xの場合はforkではなくpthreadを使用)

ジョブファイルを設定行います。
本ガイドでは、ブロックサイズ4KBとします。

注釈

ブロックサイズは、お客様が導入するアプリケーション要件等に適した値を設定して下さい。

Linux
vi Rand_Read_Testing.fio
# ランダムRead用ジョブファイル
[global]
ioengine=libaio
direct=1
invalidate=1
directory=/fio
filename=fio-test
runtime=1000
kb_base=1024
[Rand_Read_Testing_4k]
rw=randread
size=1GB
bs=4k
iodepth=128

Linux
vi Rand_Write_Testing.fio
# ランダムWrite用ジョブファイル
[global]
ioengine=libaio
direct=1
invalidate=1
directory=/fio
filename=fio-test
runtime=1000
kb_base=1024
[Rand_Write_Testing_4k]
rw=randwrite
size=1GB
bs=4k
iodepth=128

Linux
vi Rand_ReadWrite_Testing.fio
# ランダムRead/Write用ジョブファイル
[global]
ioengine=libaio
direct=1
invalidate=1
directory=/fio
filename=fio-test
runtime=1000
kb_base=1024
[Rand_ReadWrite_Testing_4k]
rw=randrw
size=1GB
bs=4k
iodepth=128

2.3. ストレージパフォーマンスの計測

"FIO"を実行しストレージパフォーマンスを計測します。
本ガイドでは、CSV(Terse)形式にて測定結果をファイル出力させます。

Linux
# ランダムRead用ジョブの実行
fio Rand_Read_Testing.fio --output {LOGファイル名} --output-format=terse --status-interval=1


# ランダムWrite用ジョブの実行
fio Rand_Write_Testing.fio --output {LOGファイル名} --output-format=terse --status-interval=1


# ランダムRead/Write用ジョブの実行
fio Rand_ReadWrite_Testing.fio --output {LOGファイル名} --output-format=terse --status-interval=1

Terse形式の出力例を以下に示します。

Linux
# Terse出力例
3;fio-3.25;Rand_Write_Testing_4k;0;0;0;0;0;0;0;0;0.000000;0.000000;0;0;0.000000;0.000000;1.000000%=0;5.000000%=0;10.000000%=0;20.000000%=0;30.000000%=0;40.000000%=0;50.000000%=0;60.000000%=0;70.000000%=0;80.000000%=0;90.000000%=0;95.000000%=0;99.000000%=0;99.500000%=0;99.900000%=0;99.950000%=0;99.990000%=0;0%=0;0%=0;0%=0;0;0;0.000000;0.000000;0;0;0.000000%;0.000000;0.000000;1048576;105980;26495;9894;1;54146;4.153152;105.822707;2261;66653;4810.555974;2388.224064;1.000000%=3391;5.000000%=3653;10.000000%=3817;20.000000%=4014;30.000000%=4177;40.000000%=4358;50.000000%=4489;60.000000%=4685;70.000000%=4882;80.000000%=5144;90.000000%=5734;95.000000%=6651;99.000000%=9109;99.500000%=11862;99.900000%=49020;99.950000%=60030;99.990000%=65798;0%=0;0%=0;0%=0;2264;66655;4814.801801;2390.321016;88632;120304;100.000000%;106047.578947;10144.941938;4.366724%;10.381078%;17278;0;10;0.1%;0.1%;0.1%;0.1%;0.1%;0.1%;100.0%;0.00%;0.00%;0.00%;0.00%;0.00%;0.00%;0.00%;0.00%;0.00%;0.00%;0.00%;18.81%;80.48%;0.49%;0.12%;0.10%;0.00%;0.00%;0.00%;0.00%;0.00%;0.00%;sda;8;256099;0;121;2;1216259;1216261;98.50%
3;fio-3.25;Rand_Write_Testing_4k;0;0;0;0;0;0;0;0;0.000000;0.000000;0;0;0.000000;0.000000;1.000000%=0;5.000000%=0;10.000000%=0;20.000000%=0;30.000000%=0;40.000000%=0;50.000000%=0;60.000000%=0;70.000000%=0;80.000000%=0;90.000000%=0;95.000000%=0;99.000000%=0;99.500000%=0;99.900000%=0;99.950000%=0;99.990000%=0;0%=0;0%=0;0%=0;0;0;0.000000;0.000000;0;0;0.000000%;0.000000;0.000000;1048576;106314;26578;9863;1;54146;4.153152;105.822707;2261;66653;4810.555974;2388.224064;1.000000%=3391;5.000000%=3653;10.000000%=3817;20.000000%=4014;30.000000%=4177;40.000000%=4358;50.000000%=4489;60.000000%=4685;70.000000%=4882;80.000000%=5144;90.000000%=5734;95.000000%=6651;99.000000%=9109;99.500000%=11862;99.900000%=49020;99.950000%=60030;99.990000%=65798;0%=0;0%=0;0%=0;2264;66655;4814.801801;2390.321016;88632;120304;99.749402%;106047.578947;10144.941938;4.366724%;10.381078%;17278;0;10;0.1%;0.1%;0.1%;0.1%;0.1%;0.1%;100.0%;0.00%;0.00%;0.00%;0.00%;0.00%;0.00%;0.00%;0.00%;0.00%;0.00%;0.00%;18.81%;80.48%;0.49%;0.12%;0.10%;0.00%;0.00%;0.00%;0.00%;0.00%;0.00%;sda;8;256099;0;121;2;1216259;1216261;98.50%

Terse出力の各項目は以下となります。

Linux
# Terse出力項目
"terse_version_3","fio_version","jobname","groupid","error","read_kb","read_bandwidth_kb","read_iops","read_runtime_ms","read_slat_min_us","read_slat_max_us","read_slat_mean_us","read_slat_dev_us","read_clat_min_us","read_clat_max_us","read_clat_mean_us","read_clat_dev_us","read_clat_pct01","read_clat_pct02","read_clat_pct03","read_clat_pct04","read_clat_pct05","read_clat_pct06","read_clat_pct07","read_clat_pct08","read_clat_pct09","read_clat_pct10","read_clat_pct11","read_clat_pct12","read_clat_pct13","read_clat_pct14","read_clat_pct15","read_clat_pct16","read_clat_pct17","read_clat_pct18","read_clat_pct19","read_clat_pct20","read_tlat_min_us","read_lat_max_us","read_lat_mean_us","read_lat_dev_us","read_bw_min_kb","read_bw_max_kb","read_bw_agg_pct","read_bw_mean_kb","read_bw_dev_kb","write_kb","write_bandwidth_kb","write_iops","write_runtime_ms","write_slat_min_us","write_slat_max_us","write_slat_mean_us","write_slat_dev_us","write_clat_min_us","write_clat_max_us","write_clat_mean_us","write_clat_dev_us","write_clat_pct01","write_clat_pct02","write_clat_pct03","write_clat_pct04","write_clat_pct05","write_clat_pct06","write_clat_pct07","write_clat_pct08","write_clat_pct09","write_clat_pct10","write_clat_pct11","write_clat_pct12","write_clat_pct13","write_clat_pct14","write_clat_pct15","write_clat_pct16","write_clat_pct17","write_clat_pct18","write_clat_pct19","write_clat_pct20","write_tlat_min_us","write_lat_max_us","write_lat_mean_us","write_lat_dev_us","write_bw_min_kb","write_bw_max_kb","write_bw_agg_pct","write_bw_mean_kb","write_bw_dev_kb","cpu_user","cpu_sys","cpu_csw","cpu_mjf","cpu_minf","iodepth_1","iodepth_2","iodepth_4","iodepth_8","iodepth_16","iodepth_32","iodepth_64","lat_2us","lat_4us","lat_10us","lat_20us","lat_50us","lat_100us","lat_250us","lat_500us","lat_750us","lat_1000us","lat_2ms","lat_4ms","lat_10ms","lat_20ms","lat_50ms","lat_100ms","lat_250ms","lat_500ms","lat_750ms","lat_1000ms","lat_2000ms","lat_over_2000ms","disk_name","disk_read_iops","disk_write_iops","disk_read_merges","disk_write_merges","disk_read_ticks","write_ticks","disk_queue_time","disk_util"

以上が、ストレージパフォーマンス計測手順となります。