動かざることバグの如し

近づきたいよ 君の理想に

LinuxでもCrystalDiskMarkぽいディスクベンチマークしたい

fioとは

fioと呼ばれるLinux用のディスクI/Oベンチマークツール(ディスク性能計測ツール)が有る。すげー適当に言うとCrystalDiskMarkLinuxである。

このツール、hdparmコマンドやddコマンドで性能を測定するのに比べてかなり高機能なのだが、いかんせん結果が非常に分かりづらい

あのインテルGUIビジュアライズツールを出しているぐらいといえばその辛さが伝わるはず。

でググってたら神シェルスクリプトを見つけてしまった。

fioでCrystalDiskMarkっぽい計測を行うコマンドを作った - ぶていのログでぶログ

が、悲しいことに↑のコマンドはfio 2.xにしか対応していない。3以降では出力のフォーマットが変わってしまい、うまく加工できなくなってしまったのである。。。

そこで自分でCrystalDiskMarkっぽい計測ができるように作った。

環境

  • fio バージョン 2.x or 3.x

やり方

まずはfioをインストールする必要がある。Ubuntuの場合は以下

apt install fio

で、適当なところに以下のようなテキストファイルを作成する ここでは/tmp/fio.txtで保存した

[global]
ioengine=libaio
iodepth=1
size=1g
direct=1
runtime=60
directory=${TARGET}
stonewall

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

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

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

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

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

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

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

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

あとはコマンドを叩くだけ

TARGET=/tmp fio -f fio.txt --output-format=terse | awk -F ';' '{print $3, ($7+$48) / 1000}'

環境変数TARGETではディスク性能を計測したいディスクの存在するディレクトリを指定すること。/dev/sdaのようなディスクドライブを指定するわけではないので注意

暫く待つと以下のような結果が表示される。

Seq-Read 421.284
Seq-Write 64.062
Rand-Read-512K 173.289
Rand-Write-512K 57.149
Rand-Read-4K 21.874
Rand-Write-4K 23.228
Rand-Read-4K-QD32 24.096
Rand-Write-4K-QD32 26.229

結果の見方は「CrystalDiskMark 見方」でググろう(投げやり

CrystalDiskMarkの使い方と結果の見方 SSD徹底解説!

オプションについて

/tmp/fio.txtではグローバルオプションとしていくつかオプションを指定している

  • ioengine=libaio とりあえずlibaioを指定
  • iodepth=1 I/Oの多重度 デフォルト1だし無指定でもいいかも
  • size=1g 各JobのI/Oサイズ
  • direct=1 Linuxのキャッシュを使わないように
  • runtime=60 各ジョブで性能測定をする時間
  • directory=${TARGET} 環境変数TARGETで計測先を指定できるように
  • stonewall 1ジョブがエラーで終了すると残りのジョブを実行せずに終了するように

蛇足

メモリ上(/dev/shm)でやったらめっちゃ速かった(当然)

Seq-Read 188.966
Seq-Write 959.355
Rand-Read-512K 1526.31
Rand-Write-512K 3167.9
Rand-Read-4K 1956.3
Rand-Write-4K 1792.44
Rand-Read-4K-QD32 1899.59
Rand-Write-4K-QD32 1753.47

参考リンク