国内では、CrystalDiskMark で使用されていることで有名かと思いますが、Microsoft から DiskSpd というストレージのベンチマーク用のプログラムが公開されています。
◇CrystalDiskMark 4 リリースにあたって
英語にはなりますが、いくつか公開されていますのでメモを残しておきたいと思います。
日本語ですと以下の情報でしょうか。
DiskSpd が凄い!!
Re:NVMe SSD使用時のCrystalDiskMark 4.0.3の不具合
DISKSPDでリポジトリディスクの性能をシミュレート【Veeam Backup & Replication】
海外の情報ですと、以下になるかと。
Automating Storage Benchmarking with DiskSpd and PowerShell
DiskSpd, PowerShell and storage performance: measuring IOPs, throughput and latency for both local disks and SMB file shares
DiskSpd は SQL Server 向けの I/O 測定にも使用することができます。
計測時に、FILE_FLAG_NO_BUFFERING / FILE_FLAG_WRITE_THROUGH のフラグ設定をすることができますので、このオプションを設定することで、SQL Server を想定した I/O 測定を実施することができます。。
NoBuffering
true
FILE_FLAG_NO_BUFFERING オプションを使用します。
FILE_FLAG_NO_BUFFERING を使用して SQL Server がデータベース ・ ファイルを開きます = true です。FILE_FLAG_NO_BUFFERING を使用して、いくつかのユーティリティとサービス、分析サービスの場合は、false を = =。サーバーを十分にテストするには、設定ごとに 1 つのテストを実行します。
ライトスルー
true
せずに FILE_FLAG_WRITE_THROUGH オプションを使用します。
せずに FILE_FLAG_WRITE_THROUGH を使用して SQL Server がデータベース ・ ファイルを開きます = true です。ただし、いくつかのユーティリティとサービス、データベースでファイルを開くせずに FILE_FLAG_WRITE_THROUGH を使用して false を = =。SQL Server Analysis Services がせずに FILE_FLAG_WRITE_THROUGH を使用してデータベース ファイルを開き、false を = =。サーバーを十分にテストするには、設定ごとに 1 つのテストを実行します。
SQLIOSim を使用した場合、これらのフラグは Ture になっていることが記載されています。
SQL Server では、中間キャッシュをスルーしてディスクに書き込みを行うため、FILE_FLAG_WRITE_THROUGH が有効になっていることが INF: SQL Server でディスク ドライブのキャッシュを使う。 に記載されています。
# 古い SQL Server の情報ですが、最新の SQL Server についても同様の動作です。
基本的なコマンドとしては以下のような形でしょうか。
シーケンシャルリード Diskspd.exe -c1G -b256K -F1 -o1 -L -h -s -d60 E:\test.dat シーケンシャルライト Diskspd.exe -c1G -b256K -F1 -o1 -L -h -s -w100 -d60 E:\test.dat ランダムリード Diskspd.exe -c1G -b256K -F1 -o1 -L -h -r -d60 E:\test.dat ランダムライト Diskspd.exe -c1G -b256K -F1 -o1 -h -L -r -w100 -d60 E:\test.dat 複数ファイル Diskspd.exe -c1G -b256K -F1 -o1 -h -L -s -d60 E:\test.dat F:\test.dat 環境によってはシーケンシャルは -s ではなく-si で設定する必要がある。
SQL Server 向けの設定としては、 -h オプションを使用して、上述のフラグを有効にした状態で測定します。
複数ファイルに対して負荷を発生させる場合、「-F」「-t」のどちらを使用するかでスレッド数が異なってきます。
-F の場合はトータルで指定したスレッド数になるように I/O を発生させますが、-t については各ファイルについて指定したスレッド数で I/O を発生させますので、4 スレッドと設定し、2 ファイルに対して I/O を発生させた場合は、
- -F : ファイル A : スレッド 0,1,2,3 / ファイル B : スレッド 0,1,2,3 = 合計 4 スレッド
- -t : ファイルA : スレッド 0,1,2,3 / ファイル B :スレッド4,5,6,7 = 合計 8 スレッド
となります。
設定については XML に記載することができます。
Diskspd は添付のドキュメントが充実しており、その中に XSD が入っていますが、そこから XML を生成するのは大変ですので、「-Rxml」のオプションを設定して実行し、実行結果に出力される XML を使用したほうが楽かと。
Diskspd.exe -c1G -b256K -t4 -o1 -h -s -Rxml -d1 E:\test.dat
<Profile> <Progress>0</Progress> <ResultFormat>xml</ResultFormat> <Verbose>false</Verbose> <TimeSpans> <TimeSpan> <CompletionRoutines>false</CompletionRoutines> <MeasureLatency>false</MeasureLatency> <CalculateIopsStdDev>false</CalculateIopsStdDev> <DisableAffinity>false</DisableAffinity> <GroupAffinity>false</GroupAffinity> <Duration>1</Duration> <Warmup>5</Warmup> <Cooldown>0</Cooldown> <ThreadCount>0</ThreadCount> <IoBucketDuration>1000</IoBucketDuration> <RandSeed>0</RandSeed> <Targets> <Target> <Path>E:\test.dat</Path> <BlockSize>262144</BlockSize> <BaseFileOffset>0</BaseFileOffset> <SequentialScan>false</SequentialScan> <RandomAccess>false</RandomAccess> <UseLargePages>false</UseLargePages> <DisableAllCache>true</DisableAllCache> <WriteBufferContent> <Pattern>sequential</Pattern> </WriteBufferContent> <ParallelAsyncIO>false</ParallelAsyncIO> <FileSize>1073741824</FileSize> <StrideSize>262144</StrideSize> <InterlockedSequential>false</InterlockedSequential> <ThreadStride>0</ThreadStride> <MaxFileSize>0</MaxFileSize> <RequestCount>1</RequestCount> <WriteRatio>0</WriteRatio> <Throughput>0</Throughput> <ThreadsPerFile>4</ThreadsPerFile> <IOPriority>3</IOPriority> </Target> </Targets> </TimeSpan> </TimeSpans> </Profile>
近々使う予定があるのでメモとして。