ベンチマーク fioでストレージの性能評価をためしてみた② ～評価編～



[①](https://qiita.com/mihomiporin1110/items/341b634e41ec321e5477)でLinuxのディスクIO計測ベンチマークとして有名なfioをインすt－るできましたので、ストレージの性能評価をためしてみようとおもいます。

**:heart:関連記事:heart:**
[ベンチマーク fioでストレージの性能評価をためしてみた① ～fioインストール編～](https://qiita.com/mihomiporin1110/items/341b634e41ec321e5477)


## 参考
参考文献はこちらです。
[fioを使ってストレージの性能を計測してみた](https://qiita.com/toshihirock/items/fa4d310115e6921ab0ac)
[[Linux] ディスク性能テストにfioを使ってみる](https://ameblo.jp/itboy/entry-12347291623.html)
[FIOコマンドで利用できるパラメータ](http://tasuku.hatenablog.jp/entry/2016/02/20/174537)
[fioを使ったベンチマーク](https://www.hitsumabushi.org/blog/2015/02/09/2227.html)
[man fio](https://linux.die.net/man/1/fio) やっぱりmanですね
[fio document](https://fio.readthedocs.io/en/latest/fio_doc.html)
## 検証内容
- LinuxVM上にマウントしたSDDに5MBのファイルを読み書きして書き込みしてIO特性をみてみる

 
## 検証内容詳細・前提条件
- 5MBのファイルを5分間ランダムに読み書きし値を計測する
- ブロックサイズ4KB、jobの数は1つで計測する 
- 読み込み書き込の比率は書き込み80%、読み込み20%



## 検証環境
**今回の検証環境**
[OS] CentOS7.5
[対象] /var/dataにマウントした/dev/sdc1 32G

```
$ cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)

$ df
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/sda2       30929148 2958060  27971088  10% /
devtmpfs         4066508       0   4066508   0% /dev
tmpfs            4078652       0   4078652   0% /dev/shm
tmpfs            4078652   25680   4052972   1% /run
tmpfs            4078652       0   4078652   0% /sys/fs/cgroup
/dev/sda1         508580   82188    426392  17% /boot
/dev/sdb1       16381756   45084  15481484   1% /mnt/resource
tmpfs             815732       0    815732   0% /run/user/1000
/dev/sdc1        30929148 2958060  27971088  10% /var/data

$ free -m
              total        used        free      shared  buff/cache   available
Mem:           7966         306        5515          25        2144        7224
Swap:             0           0           0

## fioベンチマークオプションの設定
fioの計測のための設定オプションはたくさんあるのですが、今回利用したコマンド、オプションは下記です。

その他レイテンシーの状況を保存するオプション(write_lat_log)などがあります。
詳細は[こちらのページ](https://fio.readthedocs.io/en/latest/fio_doc.html)の1.12. Job file parametersに記載されていますので測定方法に合わせて変更してください。


```fio -filename=/var/data/fuse/fio -direct=0 -rw=randrw -rwmixread=20 -bs=4k -filesize=5M -numjobs=1 -runtime=300 -group_reporting -name=test --ioengine=libaio -t
ime_based```


|オプション名                     |    内容                                                                    |
|:------------------------------|:--------------------------------------------------------------------------------------|
|**-direct=0　　　         　　** | direct=1の場合は直接書き込み、0はバッファしての測定です。バッファも含めての試験をしたかったので0に設定しました　　　　　　　　　　　　　　|
|**-rw=randrw　　　　        　　**| ランダムの読み書きなのでrandrw、その他にシーケンシャルや読み込みのみ、書き込みのみなどのオプションがあります|
|**-bs=4k　　         　　　　　　**| ブロックサイズ。今回はデフォルトで設定しました                           
                             |
|**-filesize=5M　　　　    　　　**| I/Oで利用するファイルサイズ今回は5Mで設定しています。                                                                                       |
|**--ioengine=libaio　　　　            　　　　　　　　　　　**|今回非同期書き込みとなるのでfsyncではなくlibaioを選択しました          |
|**-time_based　　　　　　　       　　**| runtimeの間ずっと実行する設定。I/O全体のサイズを設定することもできるのですが今回は5分間ながして特性をみたいと思ったのでtime_basedにしています|
|**-runtime=300　　　　　　     　　　**|実行時間|
|**- numjobs=1　　　　　　     　　　**|並行処理するジョブの数。多くしすぎるとulimitに引っかかって怒られます。今回は単発で実行して動作をみたかったので1にしています。|
|**-group_reporting 　　　　　　     　　　**|複数のjobを実行した場合に結果をまとめる設定。今回は必要なしなオプションです。|



## 実行

実行が開始すると下記のように表示されます。
今回タイムベースなのでeta XXm:XXsに記載の時間が終わるまで待ちます。

```
$fio -filename=/var/data/fio -direct=0 -rw=randrw -rwmixread=20 -bs=4k -filesize=5M -numjobs=1 -runtime=300 -group_reporting -name=test --ioengine=libaio -t
ime_based
test: (g=0): rw=randrw, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=1
fio-3.1
Starting 1 process
Jobs: 1 (f=1)
Jobs: 1 (f=1): [m(1)][9.7%][r=14.4MiB/s,w=57.6MiB/s][r=3688,w=14.7k IOPS][eta 04m:31s]
```


## 結果

### 画面表示

実行が完了すると下記のような結果が表示されます。

```
$ date; sudo fio -filename=/var/data -direct=0 -rw=randrw -rwmixread=20 -bs=4k -filesize=5M -numjobs=1 -runtime=300 -group_reporting -name=test --ioengine=libaio -t
ime_based ;date
Wed Dec 12 02:24:15 UTC 2018
test: (g=0): rw=randrw, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=1
fio-3.1
Starting 1 process
test: Laying out IO file (1 file / 5MiB)
fio: native_fallocate call failed: Operation not supported
Jobs: 1 (f=1): [m(1)][100.0%][r=14.9MiB/s,w=58.9MiB/s][r=3806,w=15.1k IOPS][eta 00m:00s]
test: (groupid=0, jobs=1): err= 0: pid=22333: Wed Dec 12 02:29:17 2018
   read: IOPS=3795, BW=14.8MiB/s (15.5MB/s)(4448MiB/300001msec)
    slat (nsec): min=1800, max=4786.5k, avg=3775.71, stdev=8091.60
    clat (nsec): min=1100, max=2140.2k, avg=1785.89, stdev=3655.80
     lat (usec): min=3, max=4790, avg= 6.49, stdev= 9.23
    clat percentiles (nsec):
     |  1.00th=[ 1208],  5.00th=[ 1304], 10.00th=[ 1304], 20.00th=[ 1400],
     | 30.00th=[ 1400], 40.00th=[ 1496], 50.00th=[ 1496], 60.00th=[ 1608],
     | 70.00th=[ 1608], 80.00th=[ 1608], 90.00th=[ 1704], 95.00th=[ 1800],
     | 99.00th=[17024], 99.50th=[18816], 99.90th=[29056], 99.95th=[41728],
     | 99.99th=[77312]
   bw (  KiB/s): min=13270, max=17857, per=100.00%, avg=15419.33, stdev=774.51, samples=600
   iops        : min= 3317, max= 4464, avg=3854.45, stdev=193.62, samples=600
  write: IOPS=15.2k, BW=59.2MiB/s (62.1MB/s)(17.4GiB/300001msec)
    slat (usec): min=13, max=16955, avg=54.85, stdev=49.80
    clat (nsec): min=1200, max=6330.9k, avg=2366.94, stdev=5245.85
     lat (usec): min=15, max=16959, avg=59.42, stdev=50.37
    clat percentiles (nsec):
     |  1.00th=[ 1400],  5.00th=[ 1496], 10.00th=[ 1608], 20.00th=[ 1608],
     | 30.00th=[ 1704], 40.00th=[ 1800], 50.00th=[ 1800], 60.00th=[ 1896],
     | 70.00th=[ 1896], 80.00th=[ 2008], 90.00th=[ 2192], 95.00th=[ 6176],
     | 99.00th=[18048], 99.50th=[21120], 99.90th=[41728], 99.95th=[55552],
     | 99.99th=[92672]
   bw (  KiB/s): min=53336, max=71504, per=100.00%, avg=61610.90, stdev=2882.08, samples=600
   iops        : min=13334, max=17876, avg=15402.35, stdev=720.51, samples=600
  lat (usec)   : 2=79.03%, 4=16.06%, 10=3.28%, 20=1.13%, 50=0.45%
  lat (usec)   : 100=0.05%, 250=0.01%, 500=0.01%, 750=0.01%, 1000=0.01%
  lat (msec)   : 2=0.01%, 4=0.01%, 10=0.01%
  cpu          : usr=19.06%, sys=44.89%, ctx=4549539, majf=0, minf=26
  IO depths    : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     issued rwt: total=1138569,4549244,0, short=0,0,0, dropped=0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=1

Run status group 0 (all jobs):
   READ: bw=14.8MiB/s (15.5MB/s), 14.8MiB/s-14.8MiB/s (15.5MB/s-15.5MB/s), io=4448MiB (4664MB), run=300001-300001msec
  WRITE: bw=59.2MiB/s (62.1MB/s), 59.2MiB/s-59.2MiB/s (62.1MB/s-62.1MB/s), io=17.4GiB (18.6GB), run=300001-300001msec
Wed Dec 12 02:29:17 UTC 2018
```
### I/O、スループットの確認の仕方

計測結果で今回確認した部分はreadとwriteになります。
それぞれの値は下記に記載します。

途中のlatが3行並んでいる部分はそれぞれの値の出現確立です。
この値をみるとIO全体の処理時間が代替どの程度なのかざっくりとつかめます。

|||
|:---|:--|
|**BW**|帯域幅、スループット|
|**IOPS**|IOPS|
|**slat**|ベンチマークツールがI/O発行後Linuxがコマンド発行までの時間|
|**clat**|コマンド発行から応答を受け取るまでの時間|
|**lat**|slatとclatを足した全体のIO処理時間|