Windowsで負荷テスト（ストレージ負荷）

microsoft / diskspd 
https://github.com/microsoft/diskspd

DISKSPD はストレージ負荷ジェネレーターです。
Windows / Windows Server および Cloud Server インフラストラクチャエンジニアリングチームのパフォーマンステストツール

コマンドラインツールですね。
C:\Users\hoge\Downloads\DiskSpd\amd64>diskspd

~~~text:Usage
Usage: diskspd [options] target1 [ target2 [ target3 ...] ]
version 2.1.0-dev (2021/7/1)

Valid targets:
       file_path
       #<physical drive number>
       <drive_letter>:

Available options:
  -?                    display usage information
  -ag                   group affinity - affinitize threads round-robin to cores in Processor Groups 0 - n.
                          Group 0 is filled before Group 1, and so forth.
                          [default; use -n to disable default affinity]
  -ag#,#[,#,...]>       advanced CPU affinity - affinitize threads round-robin to the CPUs provided. The g# notation
                          specifies Processor Groups for the following CPU core #s. Multiple Processor Groups
                          may be specified, and groups/cores may be repeated. If no group is specified, 0 is assumed.
                          Additional groups/processors may be added, comma separated, or on separate parameters.
                          Examples: -a0,1,2 and -ag0,0,1,2 are equivalent.
                                    -ag0,0,1,2,g1,0,1,2 specifies the first three cores in groups 0 and 1.
                                    -ag0,0,1,2 -ag1,0,1,2 is equivalent.
  -b<size>[KMGT]        block size in bytes or KiB/MiB/GiB/TiB [default=64K]
  -B<offs>[KMGTb]       base target offset in bytes or KiB/MiB/GiB/TiB/blocks [default=0]
                          (offset from the beginning of the file)
  -c<size>[KMGTb]       create files of the given size.
                          Size can be stated in bytes or KiB/MiB/GiB/TiB/blocks
  -C<seconds>           cool down time - duration of the test after measurements finished [default=0s].
  -D<milliseconds>      Capture IOPs statistics in intervals of <milliseconds>; these are per-thread
                          per-target: text output provides IOPs standard deviation, XML provides the full
                          IOPs time series in addition. [default=1000, 1 second].
  -d<seconds>           duration (in seconds) to run test [default=10s]
  -f<size>[KMGTb]       target size - use only the first <size> bytes or KiB/MiB/GiB/TiB/blocks of the file/disk/partition,
                          for example to test only the first sectors of a disk
  -f<rst>               open file with one or more additional access hints
                          r : the FILE_FLAG_RANDOM_ACCESS hint
                          s : the FILE_FLAG_SEQUENTIAL_SCAN hint
                          t : the FILE_ATTRIBUTE_TEMPORARY hint
                          [default: none]
  -F<count>             total number of threads (conflicts with -t)
  -g<value>[i]          throughput per-thread per-target throttled to given value; defaults to bytes per millisecond
                          With the optional i qualifier the value is IOPS of the specified block size (-b).
                          Throughput limits cannot be specified when using completion routines (-x)
                          [default: no limit]
  -h                    deprecated, see -Sh
  -i<count>             number of IOs per burst; see -j [default: inactive]
  -j<milliseconds>      interval in <milliseconds> between issuing IO bursts; see -i [default: inactive]
  -I<priority>          Set IO priority to <priority>. Available values are: 1-very low, 2-low, 3-normal (default)
  -l                    Use large pages for IO buffers
  -L                    measure latency statistics
  -n                    disable default affinity (-a)
  -N<vni>               specify the flush mode for memory mapped I/O
                          v : uses the FlushViewOfFile API
                          n : uses the RtlFlushNonVolatileMemory API
                          i : uses RtlFlushNonVolatileMemory without waiting for the flush to drain
                          [default: none]
  -o<count>             number of outstanding I/O requests per target per thread
                          (1=synchronous I/O, unless more than 1 thread is specified with -F)
                          [default=2]
  -O<count>             number of outstanding I/O requests per thread - for use with -F
                          (1=synchronous I/O)
  -p                    start parallel sequential I/O operations with the same offset
                          (ignored if -r is specified, makes sense only with -o2 or greater)
  -P<count>             enable printing a progress dot after each <count> [default=65536]
                          completed I/O operations, counted separately by each thread
  -r[align[KMGTb]]      random I/O aligned to <align> in bytes/KiB/MiB/GiB/TiB/blocks (overrides -s)
                          [default alignment=block size (-b)]
  -rd<dist>[params]     specify an non-uniform distribution for random IO in the target
                          [default uniformly random]
                           distributions: pct, abs
                           all:  IO% and %Target/Size are cumulative. If the sum of IO% is less than 100% the
                                 remainder is applied to the remainder of the target. An IO% of 0 indicates a gap -
                                 no IO will be issued to that range of the target.
                           pct : parameter is a combination of IO%/%Target separated by : (colon)
                                 Example: -rdpct90/10:0/10:5/20 specifies 90% of IO in 10% of the target, no IO
                                   next 10%, 5% IO in the next 20% and the remaining 5% of IO in the last 60%
                           abs : parameter is a combination of IO/Target Size separated by : (colon)
                                 If the actual target size is smaller than the distribution, the relative values of IO%
                                 for the valid elements define the effective distribution.
                                 Example: -rdabs90/10G:0/10G:5/20G specifies 90% of IO in 10GiB of the target, no IO
                                   next 10GiB, 5% IO in the next 20GiB and the remaining 5% of IO in the remaining
                                   capacity of the target. If the target is only 20G, the distribution truncates at
                                   90/10G:0:10G and all IO is directed to the first 10G (equivalent to -f10G).
  -rs<percentage>       percentage of requests which should be issued randomly. When used, -r may be used to
                          specify IO alignment (applies to both the random and sequential portions of the load).
                          Sequential IO runs will be homogeneous if a mixed ratio is specified (-w), and run
                          lengths will follow a geometric distribution based on the percentage split.
  -R[p]<text|xml>       output format. With the p prefix, the input profile (command line or XML) is validated and
                          re-output in the specified format without running load, useful for checking or building
                          complex profiles.
                          [default: text]
  -s[i][align[KMGTb]]   stride size of <align> in bytes/KiB/MiB/GiB/TiB/blocks, alignment/offset between operations
                          [default=non-interlocked, default alignment=block size (-b)]
                          By default threads track independent sequential IO offsets starting at offset 0 of the target.
                          With multiple threads this results in threads overlapping their IOs - see -T to divide
                          them into multiple separate sequential streams on the target.
                          With the optional i qualifier (-si) threads interlock on a shared sequential offset.
                          Interlocked operations may introduce overhead but make it possible to issue a single
                          sequential stream to a target which responds faster than a one thread can drive.
                          (ignored if -r specified, -si conflicts with -p, -rs and -T)
  -S[bhmruw]            control caching behavior [default: caching is enabled, no writethrough]
                          non-conflicting flags may be combined in any order; ex: -Sbw, -Suw, -Swu
  -S                    equivalent to -Su
  -Sb                   enable caching (default, explicitly stated)
  -Sh                   equivalent -Suw
  -Sm                   enable memory mapped I/O
  -Su                   disable software caching, equivalent to FILE_FLAG_NO_BUFFERING
  -Sr                   disable local caching, with remote sw caching enabled; only valid for remote filesystems
  -Sw                   enable writethrough (no hardware write caching), equivalent to FILE_FLAG_WRITE_THROUGH or
                          non-temporal writes for memory mapped I/O (-Sm)
  -t<count>             number of threads per target (conflicts with -F)
  -T<offs>[KMGTb]       starting stride between I/O operations performed on the same target by different threads
                          [default=0] (starting offset = base file offset + (thread number * <offs>)
                          only applies with #threads > 1
  -v                    verbose mode
  -w<percentage>        percentage of write requests (-w and -w0 are equivalent and result in a read-only workload).
                        absence of this switch indicates 100% reads
                          IMPORTANT: a write test will destroy existing data without a warning
  -W<seconds>           warm up time - duration of the test before measurements start [default=5s]
  -x                    use completion routines instead of I/O Completion Ports
  -X<filepath>          use an XML file to configure the workload. Combine with -R, -v and -z to override profile defaults.
                          Targets can be defined in XML profiles as template paths of the form *<integer> (*1, *2, ...).
                          When run, specify the paths to substitute for the template paths in order on the command line.
                          The first specified target is *1, second is *2, and so on.
                          Example: diskspd -Xprof.xml first.bin second.bin (prof.xml using *1 and *2)
  -z[seed]              set random seed [with no -z, seed=0; with plain -z, seed is based on system run time]

Write buffers:
  -Z                    zero buffers used for write tests
  -Zr                   per IO random buffers used for write tests - this incurrs additional run-time
                         overhead to create random content and shouln't be compared to results run
                         without -Zr
  -Z<size>[KMGb]        use a <size> buffer filled with random data as a source for write operations.
  -Z<size>[KMGb],<file> use a <size> buffer filled with data from <file> as a source for write operations.

  By default, the write buffers are filled with a repeating pattern (0, 1, 2, ..., 255, 0, 1, ...)

Synchronization:
  -ys<eventname>     signals event <eventname> before starting the actual run (no warmup)
                       (creates a notification event if <eventname> does not exist)
  -yf<eventname>     signals event <eventname> after the actual run finishes (no cooldown)
                       (creates a notification event if <eventname> does not exist)
  -yr<eventname>     waits on event <eventname> before starting the run (including warmup)
                       (creates a notification event if <eventname> does not exist)
  -yp<eventname>     stops the run when event <eventname> is set; CTRL+C is bound to this event
                       (creates a notification event if <eventname> does not exist)
  -ye<eventname>     sets event <eventname> and quits

Event Tracing:
  -e<q|c|s>             Use query perf timer (qpc), cycle count, or system timer respectively.
                          [default = q, query perf timer (qpc)]
  -ep                   use paged memory for the NT Kernel Logger [default=non-paged memory]
  -ePROCESS             process start & end
  -eTHREAD              thread start & end
  -eIMAGE_LOAD          image load
  -eDISK_IO             physical disk IO
  -eMEMORY_PAGE_FAULTS  all page faults
  -eMEMORY_HARD_FAULTS  hard faults only
  -eNETWORK             TCP/IP, UDP/IP send & receive
  -eREGISTRY            registry calls


Examples:

Create 8192KB file and run read test on it for 1 second:

  diskspd -c8192K -d1 testfile.dat

Set block size to 4KB, create 2 threads per file, 32 overlapped (outstanding)
I/O operations per thread, disable all caching mechanisms and run block-aligned random
access read test lasting 10 seconds:

  diskspd -b4K -t2 -r -o32 -d10 -Sh testfile.dat

Create two 1GB files, set block size to 4KB, create 2 threads per file, affinitize threads
to CPUs 0 and 1 (each file will have threads affinitized to both CPUs) and run read test
lasting 10 seconds:

  diskspd -c1G -b4K -t2 -d10 -a0,1 testfile1.dat testfile2.dat
~~~

パラメータが多いですね。
こんなときは、Examples で試してみましょう。

~~~text:コマンド プロンプト
C:\Users\Hoge\Downloads\DiskSpd\amd64>diskspd -c10g -d20 hogehoge.dat

Command Line: diskspd -c10g -d20 hogehoge.dat

Input parameters:

        timespan:   1
        -------------
        duration: 20s
        warm up time: 5s
        cool down time: 0s
        random seed: 0
        path: 'hogehoge.dat'
                think time: 0ms
                burst size: 0
                using software cache
                using hardware write cache, writethrough off
                performing read test
                block size: 64KiB
                using sequential I/O (stride: 64KiB)
                number of outstanding I/O operations per thread: 2
                threads per file: 1
                using I/O Completion Ports
                IO priority: normal

System information:

        computer name: HOGE-PC
        start time: 2022/06/20 00:29:58 UTC

Results for timespan 1:
*******************************************************************************

actual test time:       20.00s
thread count:           1
proc count:             8

CPU |  Usage |  User  |  Kernel |  Idle
-------------------------------------------
   0|  71.48%|  10.63%|   60.86%|  28.52%
   1|  54.45%|  14.61%|   39.84%|  45.55%
   2|  72.89%|  19.69%|   53.20%|  27.11%
   3|  66.17%|  18.75%|   47.42%|  33.83%
   4|  71.48%|  16.17%|   55.31%|  28.52%
   5|  67.66%|  18.52%|   49.14%|  32.34%
   6|  83.05%|  18.36%|   64.69%|  16.95%
   7|  83.59%|  20.63%|   62.97%|  16.41%
-------------------------------------------
avg.|  71.35%|  17.17%|   54.18%|  28.65%

Total IO
thread |       bytes     |     I/Os     |    MiB/s   |  I/O per s |  file
------------------------------------------------------------------------------
     0 |      9749725184 |       148769 |     464.87 |    7437.86 | hogehoge.dat (10GiB)
------------------------------------------------------------------------------
total:        9749725184 |       148769 |     464.87 |    7437.86

Read IO
thread |       bytes     |     I/Os     |    MiB/s   |  I/O per s |  file
------------------------------------------------------------------------------
     0 |      9749725184 |       148769 |     464.87 |    7437.86 | hogehoge.dat (10GiB)
------------------------------------------------------------------------------
total:        9749725184 |       148769 |     464.87 |    7437.86

Write IO
thread |       bytes     |     I/Os     |    MiB/s   |  I/O per s |  file
------------------------------------------------------------------------------
     0 |               0 |            0 |       0.00 |       0.00 | hogehoge.dat (10GiB)
------------------------------------------------------------------------------
total:                 0 |            0 |       0.00 |       0.00

~~~
10GB の hogehoge.dat を作成して、20秒間読み込むコマンドです。
C:\Users\Hoge\Downloads\DiskSpd\amd64>diskspd -c10g -d20 hogehoge.dat

タスクマネージャーで見ると負荷は上がっていますね。
~~~
C:\Users\Hoge\Downloads\DiskSpd\amd64>dir
 ドライブ C のボリューム ラベルは Windows です
 ボリューム シリアル番号は E4FE-1FBF です

 C:\Users\Hoge\Downloads\DiskSpd\amd64 のディレクトリ

2022/06/20  09:29    <DIR>          .
2022/06/20  09:29    <DIR>          ..
2021/09/17  13:44           282,872 diskspd.exe
2021/09/16  06:24         3,960,832 diskspd.pdb
2022/06/20  09:33    10,737,418,240 hogehoge.dat
               3 個のファイル      10,741,661,944 バイト
               2 個のディレクトリ  64,278,204,416 バイトの空き領域
~~~
作成したファイル（ここでは、hogehoge.dat）は、残っていますので削除してください。