mecobalamin’s diary

人間万事塞翁が馬

https://help.hatenablog.com/entry/developer-option

fioその1、ストレージのベンチマーク測定

以前windowsCrystalDiskMarkを使って
ストレージのベンチマークを測定した

今回はwslのコマンドのfioを使って測定する

以前書いた記事
mecobalamin.hatenablog.com
fioのについてもちょっと書いてある
mecobalamin.hatenablog.com

fioのバージョンは3.1

こちらのラッパーを利用しようとしたが
fioバージョン?の違いか出力フォーマットが変わっているっぽい
fioでCrystalDiskMarkっぽい計測を行うコマンドを作った - ぶていのログでぶログ

とはいえawk正規表現の両方、殆ど触ったことがない。。。
調べながら書き換え

正規表現はここを見ながら書き換えた
正規表現の基礎
正規表現で整数と実数にマッチさせる
正の整数と小数にマッチする正規表現
ただしwslのawkでは\dが働いていない様子
[0-9]に変えるとマッチしたのでこっちを使う

splitとgensubはawkの組み込み関数
The GNU Awk User's Guide - 組み込み関数
gawkで正規表現の後方参照 - ちぎっては投げるブログ


さて本題

fioの出力はこうなっている

Seq-Read: (g=0): rw=read, bs=(R) 1024KiB-1024KiB, (W) 1024KiB-1024KiB, (T) 1024KiB-1024KiB, ioengine=sync, iodepth=1
Seq-Write: (g=1): rw=write, bs=(R) 1024KiB-1024KiB, (W) 1024KiB-1024KiB, (T) 1024KiB-1024KiB, ioengine=sync, iodepth=1
Rand-Read-512K: (g=2): rw=randread, bs=(R) 512KiB-512KiB, (W) 512KiB-512KiB, (T) 512KiB-512KiB, ioengine=sync, iodepth=1
Rand-Write-512K: (g=3): rw=randwrite, bs=(R) 512KiB-512KiB, (W) 512KiB-512KiB, (T) 512KiB-512KiB, ioengine=sync, iodepth=
1
Rand-Read-4K: (g=4): rw=randread, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=sync, iodepth=1
Rand-Write-4K: (g=5): rw=randwrite, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=sync, iodepth=1
Rand-Read-4K-QD32: (g=6): rw=randread, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=sync, iodepth=32
Rand-Write-4K-QD32: (g=7): rw=randwrite, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=sync, iodepth=32
fio-3.1
Starting 8 processes
Seq-Read: Laying out IO file (1 file / 1024MiB)

Seq-Read: (groupid=0, jobs=1): err= 0: pid=27737: Fri May 17 17:33:21 2019
   read: IOPS=3908, BW=3908MiB/s (4098MB/s)(1024MiB/262msec)
    clat (usec): min=205, max=4123, avg=253.44, stdev=139.86
     lat (usec): min=206, max=4125, avg=253.55, stdev=139.93
    clat percentiles (usec):
     |  1.00th=[  208],  5.00th=[  212], 10.00th=[  215], 20.00th=[  221],
     | 30.00th=[  231], 40.00th=[  233], 50.00th=[  235], 60.00th=[  237],
     | 70.00th=[  247], 80.00th=[  255], 90.00th=[  273], 95.00th=[  322],
     | 99.00th=[  725], 99.50th=[  799], 99.90th=[  832], 99.95th=[ 4113],
     | 99.99th=[ 4113]
  lat (usec)   : 250=73.93%, 500=23.93%, 750=1.27%, 1000=0.78%
  lat (msec)   : 10=0.10%
  cpu          : usr=0.00%, sys=101.53%, ctx=0, majf=0, minf=289
  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=1024,0,0, short=0,0,0, dropped=0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=1
以下省略

見方がよくわかってないけど

Seq-Read: (groupid=0, jobs=1): err= 0: pid=27737: Fri May 17 17:33:21 2019
   read: IOPS=3908, BW=3908MiB/s (4098MB/s)(1024MiB/262msec)

この部分から(4098MB/s)を読み取れればいいかと思う

オリジナルではこうなっている

split(gensub(/bw=([0-9.]+)(([KM]?)B\/s,)?/,"\\1 \\3", "g", i), a);

書き換えた結果がこれ

split(gensub(/\((([1-9]+[0-9]*|0)(\.[0-9]+)?)([KM]?[^i]?B\/s)?\)/,"\\1 \\2", "g", i), a);

あと他にも書き換えたところがある
ioengineでlibaioを指定すると初期化に失敗してるみたい
syncを指定している

スクリプト全体はこうなる
gitでforkするのがいいんだろうけど
やり方が調べてなくてわからないので。。。

ファイル名をfio-cdm_190518.shで保存
コード全体はこんな感じ

#! /bin/bash

TARGET="$1"
FileName=".fio-diskmark"

fio -version
echo ${TARGET}

fio2cdm() {
    awk '
    /^Seq-Read:/          {getline;if($1~/^read/) {seqread =$4}}
    /^Seq-Write:/         {getline;if($1~/^write/){seqwrite=$4}}
    /^Rand-Read-512K:/    {getline;if($1~/^read/) {rread512 =$4}}
    /^Rand-Write-512K:/   {getline;if($1~/^write/){rwrite512=$4}}
    /^Rand-Read-4K:/      {getline;if($1~/^read/) {rread4 =$4}}
    /^Rand-Write-4K:/     {getline;if($1~/^write/){rwrite4=$4}}
    /^Rand-Read-4K-QD32:/ {getline;if($1~/^read/) {rread4qd32 =$4}}
    /^Rand-Write-4K-QD32:/{getline;if($1~/^write/){rwrite4qd32=$4}}

    function n(i) {
      split(gensub(/\((([1-9]+[0-9]*|0)(\.[0-9]+)?)([KM]?[^i]?B\/s)?\)/,"\\1 \\2", "g", i), a);
      s = a[1]; u = a[2];
      if(u == "K") {s /= 1024}
      if(u == "")  {s /= 1024 * 1024}
      return s;
    }
    END {
      print ("|      | Read(MB/s)|Write(MB/s)|");
      print ("|------|-----------|-----------|");
      printf("|  Seq |%11.3f|%11.3f|\n", n(seqread),   n(seqwrite));
      printf("| 512K |%11.3f|%11.3f|\n", n(rread512),  n(rwrite512));
      printf("|   4K |%11.3f|%11.3f|\n", n(rread4),    n(rwrite4));
      printf("|4KQD32|%11.3f|%11.3f|\n", n(rread4qd32),n(rwrite4qd32));
    }
    '
}

trap "rm -f ${TARGET}/${FileName}" 0 1 2 3 9 15

# see. http://www.winkey.jp/article.php/20110310142828679
cat <<_EOL_ | fio - | fio2cdm
[global]
ioengine=sync
iodepth=1
size=1g
direct=1
runtime=60
directory=${TARGET}
filename=${FileName}

[Seq-Read]
bs=1m
rw=read
stonewall

[Seq-Write]
bs=1m
rw=write
stonewall

[Rand-Read-512K]
bs=512k
rw=randread
stonewall

[Rand-Write-512K]
bs=512k
rw=randwrite
stonewall

[Rand-Read-4K]
bs=4k
rw=randread
stonewall

[Rand-Write-4K]
bs=4k
rw=randwrite
stonewall

[Rand-Read-4K-QD32]
iodepth=32
bs=4k
rw=randread
stonewall

[Rand-Write-4K-QD32]
iodepth=32
bs=4k
rw=randwrite
stonewall
_EOL_

測定結果は次に。