ディスク性能調査(diskspd)

ディスクの性能調査について記載します。
一般艇にCPUやメモリより遅くボトルネックになりやすいため、HDDをSSDに交換しただけで、OS起動のスピードが劇的に高速になります。
実際はディスク単体の性能評価は他のパーツと同様にそれほど深刻であるとは個人的には考えていません。性能はマシン全体で評価される方が誤解は少ないと思っています。
サーバを選定する際にはSPECのサイトでサーバのスコアを見るようにしています。
SPECのサイト

上記の理由はありますが、処理速度を考えた場合ディスクのレスポンスは深刻な業務影響を及ぼす可能性があるため、特にストレージ(NAS・SAN)の選定では注意が必要です。
ディスクの性能でよく出てくるフレーズがレイテンシ、IOPS、スループットになります。表にしてみましたが、恐らくだからなに?と思われることと思います。

項目 概要
レイテンシ 転送要求を出してから実際にデータが送られてくるまでに生じる、通信の遅延時間のこと。
数値が小さい(低い)ほど優秀。
IOPS 1秒間に何回の読み取り/書き込みが可能かを表す数値
スループット 1秒間に取り扱えるデータ量(読み取り/書き込み)が可能かを示す数値

レイテンシ

レイテンシというとディスクよりネットワークの方が理解し易いと思います。例えば、pingコマンドを東京のサーバとアメリカのサーバに実行すると応答時間がアメリカのサーバの方がおおきくなります。
下図の感じで10倍~11倍位の応答速度に差があります。ディスクのレイテンシに10倍下がると、ディスクへの依存度が高い処理について差がでます。
また、レイテンシが低いことはいかなる場合でも歓迎されます。

pingの応答速度の比較

IOPS(Input Output per Second)

IOPSは以下のいずれかの計算式で算出できます。情報処理試験で出題されることもあるようですので、覚えておけば一問取れます。ちなみに私は捨てた記憶があります。
IOPS = 1/ 1回のIOにかかる平均時間(秒)
IOPS = 1/ ディスク読み出し時間(秒)
IOPS = 1/ (平均待ち時間(秒) + データ転送時間(秒))
OPS = 1/ (平均シーク時間(秒) + 平均回転待ち時間(秒) + データ転送時間(秒))
IOPSの数値が高い(優れている)処理は小さなファイルへの大量のアクセスやランダムアクセスを行う処理に向いているとされます。

スループット

スループットは扱えるデータ容量のことです。
スループットの値が高くなるのは大きなファイルを読み書きする処理、シーケンシャルアクセスになります。
SSDとHDDで比較するより、SSDとLTOテープで比較するとわかりやすいかと思います。Amazon EBS(gp2)のスループットは250MB/sです。バックアップに使われるLTO8のスループットは圧縮時で900MB/sとなりディスクのTB辺りの容量単価も考慮するとあえてLTOを選択するのも”あり”となります。

IOPSとスループットの性能は反比例の関係にあることが多く、どちらも高い性能を持つディスクは高額になります。
LTOでランダムアクセスを使用するのは現実的ではないので、LTOを例にしました。ちなみにLTOもLTFSに対応していればUSB接続でディスクとして使用できますが主にファイルアーカイブが用途になります。

diskspdの使用方法

diskapdはディスク性能を測定するマイクロソフト社のコマンドラインツールです。
マイクロソフト社のツールはGitHubに移行しているようです。
下記URLにアクセスし、右中の[Lastest]を選択します。
https://github.com/microsoft/diskspd

リンク先のページで[Diskspd.zip]のコンパイル済みモジュールがダウンロードできます。

ダウンロードしたzipを解凍すると下図になります。
32bit環境で実行するには、x86フォルダの下の[diskspd.exe]をコマンドプロンプトから実行します。64bitならamd64フォルダの [diskspd.exe] を使用します。armのCPUならarm64フォルダの [diskspd.exe] を使用します 。

diskspdはパラメータが豊富にあるため、環境に合わせたテストが可能です。例えば、データ移行する場合にファイルの数と容量がある程度把握できればその位の時間で完了するか確認することも可能です(計算は必要になります)。
パラメータはヘルプファイルをアップロードしますので、必要ならご覧ください。

今回使用したコマンドは以下の通りです。
環境はPC(Corei7-3770 3.4Ghz、、メモリ8G)にSSD(256GB)のシングル構成です。ディスクの冗長化はありません。

Diskspd.exe -b8K -d30 -L -o2 -t4 -w50 -c500K c:\tmp\diskspd.dat > c:\tmp\diskspd_500.txt

パラーメータの概要
-b,  block-size=[ブロックサイズ]
読書のブロックサイズを指定。単位には、K(キロバイト)、M(メガバイト)、G(ギガバイト)。
-d, duration=[秒数]
指定された時間だけ(単位:秒)ベンチマークを実行。
-L,  latency
レイテンシを計測。スレッド毎、対象ファイル/ディスク毎、Read/Write毎の平均レイテンシと、標準偏差が出力される。
-o, number of outstanding I/O requests per target perthread=[Count]
スレッドごとのターゲットあたりの未処理 I/O 要求の数を示す。指定しない場合には2
-t,  threads-per-target=[スレッド数]
読み書きを実行する際のスレッド数を指定
-w,  write=[書き込みの比率]
書き込みの比率(単位:%)を指定。0を指定すればRead Only、100を指定すればWrite onlyで実行。今回は50%を指定。
-c,  create-files=[ファイルサイズ]
指定サイズのファイルを作成。単位は、K(キロバイト)、M(メガバイト)、G(ギガバイト)、b(ブロック)が使用可能。
c:\tmp\diskspd.dat > c:\tmp\diskspd_500.txt はC:ドライブを対象にし、結果を diskspd_500.txt に書き込むパラメータです。ドライブは認識されていれば設定可能で、パスやファイル名も乱暴な言い方でですが、パスが通ればなんでも大丈夫です。

実行結果(一部抜粋)になります。

対象SSD  コマンド: Diskspd.exe -b8K -d30 -L -o2 -t4 -w50 -c500K c:\tmp\diskspd.dat > c:\tmp\diskspd_500.txt
対象USBメモリ コマンド: Diskspd.exe -b8K -d30 -L -o2 -t4 -w50 -c500K c:\tmp\diskspd.dat > c:\tmp\diskspd_500.txt

USBメモリでの結果は上図の通りでした。
3、4スレッドがひどく落ち込みました。

出力項目の説明
出力項目 説明
thread IOを生成しているスレッドの番号
bytes テストのために転送された合計バイト数
I/Os テストのために実行されたIOの総数
MiB/s 1秒あたりのMB単位のスループット
I/O per s 1秒あたりのIO数(IOPS)
AvgLat テストのすべてのIOの平均待機時間
LatStdDev テストで発生した遅延の標準偏差(標準レイテンシ)
File IOテストで使用されたファイルのパス

扱うデータ大きさや数量はもちろんのですが、マザーボード、BIOS、OS、アプリケーションのハードウェアからアプリケーションまでの結果になりますので、ご留意ください。

-shオプションを使いして、ハードウェアとソフトウェアのキャッシュを無効にした結果が下図です。

対象 SSD コマンド:Diskspd.exe -b8K -d30 -L -o2 -t4 -w50 -Sh -c500K c:\tmp\diskspd.dat


ご参考まで。

関連記事

TOP