= パフォーマンスをテストする
:toc:
:icons:
:linkattrs:
:imagesdir: ../resources/images


== 概要

世の中には多くのディスクパフォーマンス測定ツールが存在します。link:https://aka.ms/diskspd[DiskSpd] と link:https://bsdio.com/fio/[fio] が"FSx/W Workshop Windows Instance"にプリインストールされています。もし他に使い慣れたツールが有る場合はダウンロードして使って頂いても問題ありません。


== 所要時間

注意: この章の完了には40分程度の時間を要します。


== ステップバイステップガイド

重要: 以下の手順に従い、次のステップに進む前に用意された手順解説動画を視聴して下さい。

image::test-performance.gif[align="left", width=600]


=== DiskSpd Read テスト

. "FSx/W Workshop Windows Instance"のリモートデスクトップセッションで、"Start" >> "Windows PowerShell"の順にクリックして下さい。

+
重要: この章では"MAZ"ファイルシステムが"Z:/"ドライブとしてマップされている事を想定しています。もし"Z:/"ドライブにマップされていない場合、最初に"MAZ"を"Z:/"ドライブとしてマップして下さい。(手順は*デフォルトマップ共有をマップする*の章を参考にして下さい。)
+
. 100GBのスパース（Sparse）ファイル（テストファイル）を作成するため、PowerShellで以下のスクリプトを実行して下さい。
+
```sh
$random = $(Get-Random)
fsutil file createnew Z:\${env:computername}-$random.dat 100000000000
```
+
. マップした"Z:"ドライブへのリードパフォーマンスを測定するため、以下のDiskSpeedスクリプトを実行して下さい。
+
```sh
C:\Tools\DiskSpd-2.0.21a\amd64\DiskSpd.exe -d120 -w0 -r -t1 -o32 -b64K -Su -L Z:\${env:computername}-$random.dat
```
+
スクリプトが実行されている間に"Task Manager"を開き、ネットワークパフォーマンスをモニターして下さい。(例 Start >> Task Manager >> More details >> Performance (tab) >> Ethernet)
+
* ファイルシステムのベースラインスループットはいくつですか？ - この値はファイルシステム作成時に決定されます。詳細はlink:https://docs.aws.amazon.com/fsx/latest/WindowsGuide/performance.html[Amazon FSx for Windows File Server Performance] で確認して下さい。
* 最大どのくらいのリードスループットを達成出来ましたか？
* テスト結果のP99 (99th %-tile) の値はいくつですか？
* Total Read IO MiB/sはいくつですか？
* I/O per secondは幾つですか？
* AvgLatはいくつですか？
* 何故今のスループットはベースラインスループットよりも大きいのでしょうか？
+
. 異なるDiskSpdパラメータ設定も試してみます。以下のテーブルの値を参考にして下さい。ブロックサイズ (-b)、同時実行I/Oリクエスト数 (-o)、ファイル毎のスレッド数 (-t)、ソフトウェアキャッシュの有効化/無効化 (-Su)といったパラメータを変えてテストします。
+
[cols="3,10"]
|===
| Parameter | Description

| `-b<size>[K\|M\|G]`
a| ブロックサイズをbytes、KiB、MiB、GiBで指定 (default = 64K).

| `-o<count>`
a| ターゲット毎、スレッド毎の同時実行I/Oリクエスト数 (`-F`オプションを使って複数スレッドを使っていない場合、1はsynchronous I/Oを意味します) (default = 2)

| `-r<size>[K\|M\|G]`
a| 設定した容量またはブロックの容量に合わせて、Random I/Oを発生させます。同時に-sオプションを使った場合はこちらのオプションが優先されます。(default stride = block size)。

| `-s<size>[K\|M\|G]`
a| 設定した容量またはブロックの容量に合わせて、Sequencial I/Oを発生させます。同時に-rオプションを使った場合はこちらのオプションは無視されます。 (default access = sequential, default stride = block size)。

| `-t<count>`
a| ターゲット毎のスレッド数です。全体のスレッド数を指定する`-F`オプションと競合します。

| `-Su`
a| ソフトウェアキャッシュを無効化します。

|===
+

* どのような異なるパラメーターを試しましたか？
* パラメーターを変えて結果はどのように変わりましたか？


=== DiskSpd Write テスト

. PowerShellウィンドウで、マップした"Z:"ドライブへのライトパフォーマンスを測定するため、以下のDiskSpeedスクリプトを実行して下さい。
+
```sh
$random = $(Get-Random)
C:\Tools\DiskSpd-2.0.21a\amd64\DiskSpd.exe -d120 -c2G -s64K -w100 -t1 -o32 -b64K -Sh -L Z:\${env:computername}-$random.dat
```
+
スクリプトが実行されている間に"Task Manager"を開き、ネットワークパフォーマンスをモニターして下さい。(例 Start >> Task Manager >> More details >> Performance (tab) >> Ethernet)
+
* ファイルシステムのベースラインスループットはいくつですか？ - この値はファイルシステム作成時に決定されます。詳細はlink:https://docs.aws.amazon.com/fsx/latest/WindowsGuide/performance.html[Amazon FSx for Windows File Server Performance] で確認して下さい。
* 最大どのくらいのライトスループットを達成出来ましたか？
* テスト結果のP99 (99th %-tile) の値はいくつですか？
* Total Write IO MiB/sはいくつですか？
* I/O per secondは幾つですか？
* AvgLatはいくつですか？
* 何故今のスループットはベースラインスループットよりも大きいのでしょうか？
+
. 異なるDiskSpdパラメータ設定も試してみます。以下のテーブルの値を参考にして下さい。ファイルサイズ (-c)、ブロックサイズ (-b)、同時実行I/Oリクエスト数 (-o)、ファイル毎のスレッド数 (-t)、ランダムI/O (-r)又はシーケンシャルI/O (-s)、ソフトウェアキャッシュの有効化/無効化 (-Su)といったパラメータを変えてテストします。
+
[cols="3,10"]
|===
| Parameter | Description

| `-d<seconds>`
a| 秒単位で期間を設定。

| `-b<size>[K\|M\|G]`
a| ブロックサイズをbytes、KiB、MiB、GiBで指定 (default = 64K)。

| `-c<size>[K\|M\|G]`
a| 指定したサイズのファイルを作成します。サイズは指定したbytes、KiB、MiB、GiB又はブロックサイズになります。

| `-r<size>[K\|M\|G]`
a| 設定した容量またはブロックの容量に合わせて、Random I/Oを発生させます。同時に-sオプションを使った場合はこちらのオプションが優先されます。

| `-s<size>[K\|M\|G]`
a| 設定した容量またはブロックの容量に合わせて、Sequencial I/Oを発生させます。同時に-rオプションを使った場合はこちらのオプションは無視されます。 (default access = sequential, default stride = block size)。

| `-o<count>`
a| ターゲット毎、スレッド毎の同時実行I/Oリクエスト数 (`-F`オプションを使って複数スレッドを使っていない場合、1はsynchronous I/Oを意味します) (default = 2)

| `-t<count>`
a| ターゲット毎のスレッド数です。全体のスレッド数を指定する`-F`オプションと競合します。

| `-Su`
a| ソフトウェアキャッシュを無効化します。

|===
+

* どのような異なるパラメーターを試しましたか？
* パラメーターを変えて結果はどのように変わりましたか？

=== fio read テスト

. PowerShellウィンドウで、マップした**Z:**ドライブへのリードパフォーマンスを測定するため、以下のfioスクリプトを実行して下さい。

+
```sh
$random = $(Get-Random)
C:\Tools\fio-3.16-x64\fio --randrepeat=1 --direct=1 --name="Z:\${env:computername}-$random.dat" --numjobs=1 --bs=64K --iodepth=32 --size=1024M --readwrite=read --rwmixread=100 --thread --time_based --runtime=120
```
+
スクリプトが実行されている間に"Task Manager"を開き、ネットワークパフォーマンスをモニターして下さい。(例 Start >> Task Manager >> More details >> Performance (tab) >> Ethernet)
+
* 最大どのくらいのリードスループットを達成出来ましたか？
* 平均リードスループットはどの程度でしたか？
* 平均IOPSはどの程度でしたか？
* 120秒で何GBリードしましたか？
+
. 異なるfioパラメータ設定も試してみます。以下のテーブルの値を参考にして下さい。ダイレクトI/Oの有効化、無効化 (--direct)、ブロックサイズ (--bs)、 同時I/Oリクエスト数 (--iodepth)、 ジョブ数 (--numjobs)、 ランダムリード、 ランダムライト、 シーケンシャルリード、 シーケンシャルライト (--readwrite)、 リードとライトの混在(--rwmixread)といったパラメータを変えてテストします。

+
[cols="3,10"]
|===
| Parameter | Description

| `--direct=[0\|1]`
a| バッファ有り (0) 又は バッファ無し (1) I/O。

| `--bs=<size>[K\|M\|G]`
a| ブロックサイズをbytes、KiB、MiB、GiBで指定 (default = 64K)。

| `--numjobs=<count>`
a| ジョブを実行するクローン(ワークロードを複製実行するプロセス、スレッド)の数。 Default: 1。

| `--readwrite=[read\|write\|randread\|randwrite]`
a| I/Oパターンのタイプ (read = シーケンシャルリード; write = シーケンシャルライト; randread = ランダムリード; randwrite = ランダムライト)。

| `--iodepth=<count>`
a| ファイル毎に維持するI/O数。

| `--rwmixread=<percent>`
a| リードIOの割合。指定した残りの％はライトになる。

|===
+

* どのような異なるパラメーターを試しましたか？
* パラメーターを変えて結果はどのように変わりましたか？

=== fio write テスト

. PowerShellウィンドウで、マップした"Z:"ドライブへのライトパフォーマンスを測定するため、以下のfioスクリプトを実行して下さい。

+
```sh
$random = $(Get-Random)
C:\Tools\fio-3.16-x64\fio --randrepeat=1 --direct=1 --name="Z:\${env:computername}-$random.dat" --numjobs=1 --bs=64K --iodepth=32 --size=1024M --readwrite=write --rwmixwrite=100 --thread --time_based --runtime=120
```
+
スクリプトが実行されている間に"Task Manager"を開き、ネットワークパフォーマンスをモニターして下さい。(例 Start >> Task Manager >> More details >> Performance (tab) >> Ethernet)
+
* 最大どのくらいのライトスループットを達成出来ましたか？
* 平均ライトスループットはどの程度でしたか？
* 平均IOPSはどの程度でしたか？
* 120秒で何GBライトしましたか？
+
. 異なるfioパラメータ設定も試してみます。以下のテーブルの値を参考にして下さい。ダイレクトI/Oの有効化、無効化 (--direct)、ブロックサイズ (--bs)、 同時I/Oリクエスト数 (--iodepth)、 ジョブ数 (--numjobs)、 ランダムリード、 ランダムライト、 シーケンシャルリード、 シーケンシャルライト (--readwrite)、 リードとライトの混在(--rwmixread)といったパラメータを変えてテストします。

+
[cols="3,10"]
|===
| Parameter | Description

| `--direct=[0\|1]`
a| バッファ有り (0) 又は バッファ無し (1) I/O。

| `--bs=<size>[K\|M\|G]`
a| ブロックサイズをbytes、KiB、MiB、GiBで指定 (default = 64K)。

| `--numjobs=<count>`
a| ジョブを実行するクローン(ワークロードを複製実行するプロセス、スレッド)の数。 Default: 1。

| `--readwrite=[read\|write\|randread\|randwrite]`
a| I/Oパターンのタイプ (read = シーケンシャルリード; write = シーケンシャルライト; randread = ランダムリード; randwrite = ランダムライト)。

| `--iodepth=<count>`
a| ファイル毎に維持するI/O数。

| `--rwmixread=<percent>`
a| リードIOの割合。指定した残りの％はライトになる。

|===
+

* どのような異なるパラメーターを試しましたか？
* パラメーターを変えて結果はどのように変わりましたか？

. 全てのPowerShellウィンドウを閉じます。"exit"を実行して下さい。 

. ファイルエクスプローラーウィンドウを閉じて下さい。

. Task Managerウィンドウを閉じて下さい。

== 次の章

以下のリンクをクリックして次の章に進んで下さい。

image::scale-throughput-capacity.png[link=../08-scale-throughput-capacity/, align="left",width=420]




