ディスクのベンチマークソフト3つの比較とMicrosoft DiskSpdでの検証 IT関連 Twitter 2021.10.31 この記事は約19分で読めます。 このカテゴリーでは日常で生じたITに関係するトピックをアトランダムに書き留めています。 今回はSSDやHDDなどのディスクのパフォーマンスをテストする話題になります。 使用する3つのベンチマークソフトとバージョンは下記になります。 CrystalDiskMark 8.0.4ATTO Disk Benchmark 4.01.0f1MiniTool Partition Wizard 12.5 スポンサーリンク 目次 ベンチマークソフト3つの選定どのような条件でディスクのベンチマークテストをするか?それぞれのベンチマークソフトでの条件設定と実行の仕方CrystalDiskMarkATTO Disk BenchmarkMiniTool Partition Wizard3つのベンチマークソフトの結果をまとめて比較Micorosft DiskSpdでの検証Micorosft DiskSpdについてDiskSpadのパラメータ設定管理者コマンドプロンプトでの実行ログDiskSpdでの実行結果のまとめ-siパラメータは有った方が良いのか?まとめ ベンチマークソフト3つの選定 Googleで「ディスク ベンチマーク」で検索をした結果は左図のようになります。(2021年10月時点) 青色の下矢印の部分をご覧いただくと画面が下にスクロールしていますが、隠れている部分はすべてCrystalDiskMarkに関するサイトだったので省略を致しました。恐らく人気が高いソフトであると推察致します。 この結果から赤線を付けた3つのベンチマークソフトを使って比較して行きます。 なおこれらのベンチマークソフトは基本的に無料で使う事ができます。 ※ダウンロードサイトやインストール方法につきましてはGoogle検索していただくと該当するページが出て来ますので、ここでは省略致します。 どのような条件でディスクのベンチマークテストをするか? 今回は同一のパソコンのハードウェア環境で3つのベンチマークソフトを使ってディスク性能の結果がどのような値になるのか?を比較しようとしています。 なお弊社パソコンのハードウェア環境は下記のようになります。 CPUコアは4、論理プロセッサ数は8CドライブはSSDでインターフェースはNVM Express、DドライブはHDDでインターフェースはSerial ATA ※折角なのでCドライブ(SSD)とDドライブ(HDD)ともにテストします。 今回の性能比較で考慮すべきポイントを列挙いたします。 シーケンシャル処理 vs ランダム処理ATTO Disk Benchmarkはランダム処理の設定ができなかったので、シーケンシャル処理のみでテストします。同じパソコンでの比較になるので結果の煩雑化を避けるために一本に絞る事にします。読み込みテスト vs 書き込みテスト両方テストします。シングルスレッド vs マルチスレッド両方テストします。マルチスレッドでは対象データの別々の箇所を並行して処理する事ができる認識です。ただしシーケンシャル処理ではスレッドを分ける分だけ切替にかかる時間が発生するのでシングルスレッドよりも結果が悪くなる想定です。ATTO Disk Benchmarkはマルチスレッドの設定ができませんでした。そこでマルチスレッドの確認はATTO Disk Benchmarkを除いて実施します。スレッドの総数1スレッド(シングルスレッド)の場合と、CPUコア数に等しい4スレッド(マルチスレッド)の場合でテストします。ATTO Disk Benchmarkを除いて実施します。ブロックサイズ今回は同一パソコンでの比較なのでハードディスクのチャンクサイズ(データを読み書きする際の単位)を気にせずに適当なサイズである32KBにしています。ATTO Disk BenchmarkとMiniTool Partition WizardはブロックサイズをFrom Toで設定する事ができるため1回の操作でブロックサイズが異なる多くの結果を得る事ができます。それに対してCrystalDiskMarkはスレッドの総数や未処理のI/O要求の数と合わせて4パターンを設定すれば1クリックで4つの結果を得る事ができます。キュー(queue)に入る未処理のI/O要求の数スレッドが1つのファイルにだけアクセスしている場合にキューが1であればI/Oは同期的に行われます[1]。マルチスレッドのテストを考えると同期的な操作を超えた値にする必要があり取敢えず8に設定しています。処理するテストファイル(ターゲット)のサイズ根拠はありませんが1GBにしています。CrystalDiskMarkではデフォルトではランダムなのですが、すべて0x00(null文字)を選択する事ができます。まだ何もご説明できていませんがMicrosoftのDiskSpdでテストファイルを自動生成すると、読み込みではすべて0x00、書き込みではランダム文字列の繰り返しでテストファイルが作成されます。そのためCrystalDiskMarkではデフォルトを使用する事にします。キャッシュの制御CrystalDiskMarkとMiniTool Partition Wizardにキャッシュ制御の設定はありませんがATTO Disk BenchmarkではDirect I/OとBypass Write Cacheの設定が可能です。詳細は後述しますが、この設定はDirect I/Oは有効にして、Bypass Write Cacheは有効にしない設定が3つのソフトウェアの条件が揃うと推察されます。 [1]:GitHub microsoft/diskspd 「Customizing tests – Number of outstanding I/O requests」–https://github.com/Microsoft/diskspd/wiki/Customizing-tests それぞれのベンチマークソフトでの条件設定と実行の仕方 前章の条件をどのように設定するか?をご説明致します。 CrystalDiskMark CrystalDiskMarkにはインストーラ版もありますがZIP版をダウンロードした時は解凍してwindows10であればDiskMark64.exeを起動します。 ①②③④⑤⑥ ①メニューバーの設定のテストデータがデフォルト(ランダム)になっている事を確認します。 ②メニューバーの設定の設定をクリックします。 ③設定画面のプロファイル:デフォルトでテストパターンを4つ設定する事ができますが、今回は上から2行を使って設定値を変更します。 まずタイプはSEQにして、ブロックサイズを32KBに変更します。 次のキュー数とスレッド数は設定されている値のままにします。 ④2行目も同様に操作して、ブロック数32KB・キュー数8・スレッド数4に設定します。 最後に画面右下のOKボタンをクリックします。 ⑤メニューバーのプロファイルでRead&Writeが選ばれている事を確認します。 ⑥画面赤枠のテストサイズは1GBにします。テストドライブはCドライブにします。 これでCドライブをテストする準備が終わりましたので、続いて実行して行きます。 ①②③ ①画面赤枠のところSEQ32KQ8T1をクリックすると1行目に設定した条件で処理が開始されて、表示がStopに変わります。 途中で処理を止めたい時はStopボタンをクリックします。 ※ベンチマークテストはハードウェア環境に負荷を掛けますので、必要が無い処理は途中で中止してください。 ②処理が終わるとStopの表示が元に戻ります。 続いて画面赤枠のSEQ32KQ8T4をクリックします。 ③これでCドライブのベンチマークテストは終了になります。 左図の数値がReadとWriteそれぞれの得られた結果になります。 続いてDドライブを同様な操作で実行します。 ④Dドライブの結果が得られたので以上ですべてのテストが完了します。 なお全体の結果の比較は後述いたしますがDドライブでのマルチスレッドの場合の値がかなり悪くなっているのが気になります。 ATTO Disk Benchmark インストールされたプログラムをWindowsのスタートから起動します。 ①②③④ ①DriveはCドライブが選択されている事を確認します。 I/Oサイズがブロックサイズになります。指定はFrom Toになっているので、最初のプルダウンメニューを32KBに設定します。 ②つぎにToのブロックサイズを同様に32KBに設定します。 画面の右上にチェックボックスが3つ設定されていますが、Direct I/Oのみチェックマークが入り、その他は空白のままにします。 ③File Sizeは1GBに設定します。 ④最後のQueue Depthはキュー(queue)に入る未処理のI/O要求の数になる認識で、8に設定します。 これでCドライブをテストする準備が終わりましたので、続いてStartボタンを押して実行して行きます。 ①②③④ ①左図は実行を始めた時の状態になります。 StartボタンはCancelボタンに表示が変わります。 ※ベンチマークテストはハードウェア環境に負荷を掛けますので間違えてStartボタンを押してしまった時はCancelボタンを押して中止してください。 ②左図は書き込み・読み込みともに処理が終わった状態です。 結果の数値はデフォルトでは自動的に設定されるようになっていて、左図ではGB/s単位の表示になっていますのでご注意ください。 ③次にDドライブを選択し、同様な条件でテストをStartします。 ④Dドライブのテストを完了した状態になります。 結果はBM/s単位で表示されています。 MiniTool Partition Wizard インストールされたプログラムをWindowsのスタートまたはディスクトップのアイコンから起動します。 ① ②③④ ①起動時はパーティション総合管理の画面が開きます。メニューにあるディスクベンチマークのアイコンをクリックします。 ②転送サイズがブロックサイズになります。指定はFrom Toになっているので、最初のプルダウンメニューを32KBに設定します。 Toの方はデフォルトで32KBになっているのでそのままにします。 ③全長がファイルのサイズになります。その中から1GBにあたる1024MBを選択します。 ④キュー番号がキュー(queue)に入る未処理のI/O要求の数になる認識ですが、デフォルトが8になっているのでそのままにします。合わせて下記の条件も設定します。 スレッド番号がスレッド数になる認識で、ここでは1に設定します。テストモードはデフォルトが順番なのでそのままにします。 以上でCドライブでスレッド数が1の場合のテスト準備が終わりましたので、開始ボタンをクリックします。 ①②③④⑤⑥ ①処理が始まると左図のような画面になります。 ※ベンチマークテストはハードウェア環境に負荷を掛けますので処理を中止する時はキャンセルをクリックしてください。 ②処理が終了すると元の画面に戻ります。 これでCドライブのスレッド数1の処理は完了しました。 ③次にスレッド数を4に変更して、同様な操作を実行します。 これでCドライブのスレッド数4の処理は完了しました。 ④ここでCドライブからDドライブに設定を変更します。 ⑤Dドライブでスレッド数1の処理を実行します。 ⑥最後にDドライブのスレッド数4の処理を実行します。 以上ですべての処理が終わりました。 3つのベンチマークソフトの結果をまとめて比較 前章で画面キャプチャーした結果を一覧でまとめたのが次の図になりますが、先に項目をご説明いたします。 設定SEQ32KQ8T1はシングルスレッド、SEQ32KQ8T4はマルチスレッドになります。ATTO Disk Benchmarkにはマルチスレッドのテストがありません。T4/T1はマルチスレッドの値をシングルスレッドの値で割ったパーセント表示になります。シングルスレッドと比べてどのくらいマルチスレッドの値が下がっているかを表します。SSDとHDDにあるW/R書き込みの値を読み込みの値で割ったパーセント表示になります。読み込みと比べて書き込みの値がどのくらい下がっているか表します。 各ベンチマークソフトで結果にばらつきがあるように見えますが下記の事を考慮すると黒字の値は特段差があるとは言えない認識です。 windowsでは多くのサービス・バックグラウンドプロセスが動いてるためにクリアーな状態でベンチマークテストが実施されてる分けではない。ベンチマークソフト自体がCPU・メモリ・ディスクなどのリソースを使用している。 なおCrystalDiskMarkは5回テストを実施して、その中で一番値の大きい結果を最終的に残す仕様になっています。 その途中結果は画面に表示されるのですが、見ていると割と大きく値が変わって行くのが解ります。 他の2つのベンチマークソフトはそれぞれ1回しかテストを実施していないので、そういう意味では値が低く出ていてもやむを得ないところがあります。 ただし、Dドライブ(HDD)のマルチスレッドの値をシングルスレッドの値で割ったパーセンテージに関しては顕著な違いで現れています。(図で赤字表記している箇所になります) そこで後段ではMicrosoftが提供しているストレージベンチマーク用のコマンドラインツールを使って値を検証して見たいと思います。 Micorosft DiskSpdでの検証 検証という言葉が適切かどうかは議論のあるところですが、これまで見てきた3つのベンチマークソフトとMicrosoftが自社で使用しているストレージベンチマーク用のコマンドラインツールDiskSpdとの値の比較を致します。 Micorosft DiskSpdについて Microsoft DocsのAzureの中に下記の「DISKSPD を使用してワークロード ストレージのパフォーマンスをテストする」というドキュメントが置かれています。 DISKSPD を使用してワークロード ストレージのパフォーマンスをテストする - Azure Stack HCIこのトピックでは、DISKSPD を使用して、ワークロード ストレージのパフォーマンスをテストする方法に関するガイダンスを提供します。 このドキュメントの中の「クイック スタート: DISKSPD をインストールして実行する」という章の注意書きにDISKSPDツールのモジュールのZIPファイルの置き場所のリンク先が記載されています。 左図赤下線のリンク先のGitHub「microsoft/diskspd」リポジトリのページを開くと中段のReleasesセクションにZIPファイルの置き場所のリンクが設定されています。 なお英語にはなりますが、リポジトリの中にドキュメントが置かれていますので、詳細なパラメータの設定方法につきましては下記をご参照いただければ幸いです。 Command line and parametersCustomizing tests DiskSpadのパラメータ設定 前章でご紹介した「Command line and parameters」のドキュメントをご確認いただくと解るのですが、DiskSpdには数多くのパラメータが存在しています。 そのためパラメータ設定の仕方によって得られるベンチマークテストの結果が変わってくる事になります。 先の章で「3つのベンチマークテストの結果に大きな差があるとは言い切れない」と書きましたが、実はCrystalDiskMarkはDiskSpdをベンチマーク機能として使用している事が明記されています。[2] [2]:「CrystalDiskMark ベンチマーク機能」–https://crystalmark.info/ja/software/crystaldiskmark/ そうなりますとCrystalDiskMarkで使用しているDiskSpdのパラメータを流用して確認するのが今回は良さそうです。 有り難いことにCrystalDiskMarkはソースコードもプログラムと一緒に公開されています。[3] [3]:「ダウンロード」–https://crystalmark.info/ja/download/ そこで公開されているソースコードからDiskSpadのパラメータを参考にして検証する事にします。 CrystalDiskMarkで設定されているDiskSpdのパラメータ ソースコードCrystalDiskMark8_0_4Srcの中にDiskBench.cppというファイルがありますが、その中に下記図のようなコーディング部分があります。 どうやら825行目がシーケンシャル読み込み、848行目がシーケンシャル書き出しのパラメータ設定になっていると推察されます。 上記を参考にして今回検証に使用するパラメータは下記と致します。 ※出典:Command line and parametersの日本語訳 パラメータ説明-t<count>ターゲットごとのスレッド数-o<count> ターゲットごと、スレッドごとの未処理のI / O要求の数(1 =同期I /O。デフォルト= 2)-b<size>[K]ブロックサイズ KiB単位-w<percentage>発行する書き込み要求の割合(デフォルト= 0で100%読み取り。-w100は100%書き込み)-W<seconds>ウォームアップ時間–測定が開始されるまでのテストの期間(デフォルト= 5秒)-d<seconds>クールダウンまたはウォームアップ時間を含まない、秒単位の測定期間(デフォルト= 10秒)-S[bhmruw]テストターゲットのキャッシュモードとライトスルーモードを変更(デフォルトは、キャッシュはオンで、ライトスルーはオフ)-agアフィニティ–グループ0から開始して、プロセッサグループ間でラウンドロビン方式でスレッドをアフィニティ化します(デフォルト設定)-c<size>[G]指定されたサイズのファイルを作成 GiB単位 管理者コマンドプロンプトでの実行ログ 管理者として実行したコマンドプロンプトで実行した結果は下図のようになります。 上から順に下記のテストを実行しています。 Cドライブのシングルスレッドでの読み込み〃書き込みCドライブのマルチスレッドでの読み込み〃書き込みDドライブのシングルスレッドでの読み込み〃書き込みDドライブのマルチスレッドでの読み込み〃書き込み 赤色下線の4ヶ所はすべてマルチスレッドの場合になりますが、実行時にワーニングが表示されている事が解ります。 ワーニングに書かれている内容は「対象のアクセスパターンがシーケンシャルではないので、-siを検討」になる認識です。 -siパラメータの内容は次のように書かれています。※出典:Command line and parametersの日本語訳 パラメータ説明-s[i]<size>[K]シーケンシャルストライドサイズkiB単位の後続のI / O操作間のオフセットデフォルトでは、各スレッドは独自のシーケンシャルオフセットを追跡します。オプションのインターロック(i)修飾子を使用すると、特定のターゲットで動作するすべてのスレッド間で単一のインターロックオフセットが共有されるため、スレッドはターゲットへの単一のシーケンシャルパターンのアクセスを協調的に発行します。 書かれている内容はとても難解ではありますが、一般的にマルチスレッドで動くプログラムを作る時は各スレッド間で情報を共有していないと想定外の結果になる場合があります。 そう考えるとこの-siパラメータは情報を共有させるものであると理解できます。 実際に-siパラメータを追加してワーニングが表示されたテストを再度実行した結果は下図のようになります。(赤色枠線の部分) -siパラメータを追加するとワーニングが出力されずに実行できました。 なおこの-siパラメータが有るべきなのか?につきましては結果を見た後でご説明いたします。 DiskSpdでの実行結果のまとめ 前章で実行した結果を―siパラメータを追加したテストも含めて一覧にしたのが下図になります。 実際に出力された結果の一部をエビデンスとしてまとめて見ました。なお赤枠で囲んだところが結果の数値が表示されていますが、マルチスレッドの場合は各スレッドの値の合計が結果の値になります。 なかなか説明し難い結果になっていますが、特徴を列挙すると下記のようになります。 -siパラメータが無い場合 CドライブSSDの「読み込み」の結果はシングルスレッド・マルチスレッドともに他と比べて高い値になっている。DドライブHDDのマルチスレッドの場合の結果はCrystalDiskMarkとMiniTool Partition Wizardと近しくなっている。「書き込み」のマルチスレッドの値は他と比べて低い値になっている。 -siパラメータが有る場合 CドライブSSDの「読み込み」の値はシングルスレッドよりも高い値になっている。(背景薄緑色)DドライブHDDの値は-siパラメータが無い時よりも結果の数値は向上する。(背景薄赤色) -siパラメータは有った方が良いのか? CrystalDiskMarkとMiniTool Partition Wizardの値は-siパラメータを付けない時の値に近しい事は前章でご説明致しました。 なおMiniTool Partition WizardがDiskSpdを使用しているか?は公開されていませんがマルチスレッドの場合のスレッド間の情報共有はしていないのではないか?と推察いたします。 そうなると現状は「-siパラメータが無い」形が使われているベンチマークソフトが一般的であるということになります。 ところで「-siパラメータは有った方が良い」とする場合にこれまでの結果でひとつ気になっているのは「SSDのシーケンシャル処理の読み込みでシングルスレッドよりもマルチスレッドの方が数値が高い」という点です。 ただし、これは当初の条件設定において「キュー(queue)に入る未処理のI/O要求の数」を8にしたために、それがボトルネックになっているのではないか?と気付きました。 そこでSSDのSEQ32KQ8T1の条件を-o8から-o32に変更して追加テストをして見ました。ちなみに-o32にした理由は4スレッドなので8×4=32という計算からです。 diskspd -t1 -o32 -b32k -w0 -W0 -d10 -S -ag -c1G C:\IO.dat > seq-rd-C1-1.txt 上記の結果を見ると、マルチスレッドの時の値「3247.72」と比較して赤枠のシングルスレッドの値の方が若干上回っています。 以上の結果から、気になる点は解消されるので、「-siパラメータは有った方が良い」と判断いたします。 まとめ 3つのベンチマークソフトを使用したディスクのベンチマークテストについてご説明してきました。 また後段ではDiskSpdを使って、「どのような条件でハードディスクのベンチマークテストをするか?」によっても得られる結果が変わてくる事を見てきました。 今回のベンチマークテストをしながら思ったのは、パソコンで様々なプロセスが動いている状況ではテストで得られる結果にバラつきがあるために、「より良い値を追求する」のではなく「値の傾向を把握する」という風に捉えないとエンドレスにテストし続ける事になりそうです。 その上で今回の結果を踏まえるとベンチマークテストする際のパターンとしては下記のようにするのが良さそうです。 読み込みテストと書き込みテストは両方実施する。シーケンシャル処理はシングルスレッドで実施する。キュー(queue)に入る未処理のI/O要求の数はボトルネックにならないように大き目に設定する。一概に数値を断定することはできないので試行錯誤していただければと思います。マルチスレッドはランダム処理で実施する。CrystalDiskMarkまたはMiniTool Partition Wizardを使用する。スレッド数はハードウェア環境に合わせて決める。ブロックサイズハードディスクのチャンクサイズ(データを読み書きする際の単位)を考慮するか、From Toの範囲で複数回実施する。 以上最後までご一読いただき誠にありがとうございました。