fioその1、ストレージのベンチマーク測定
以前windowsのCrystalDiskMarkを使って
ストレージのベンチマークを測定した
今回は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_
測定結果は次に。