はじめに
Synology の DS218plus の HDD を 4TB -> 8TB に更新した際に、内蔵2基 + Hyper Backup 用1基の合計3基 (SG, WD1, WD2) の 4TB HDD が遊休となりました。これらの HDD を使用して、Linux の様々なファイルシステムの違いや Software RAID を組んだ場合のディスクのアクセス速度を測定しようと考えています。
前回の記事「その1」では、Linux でディスクのアクセス速度を測定する 5 種類の方法を Ext4 ファイルシステムで試してみました。
その結果、
- hdparm と dd は Sequential Read / Write のアクセス速度を手軽に測定できるが、Random Read / Write のアクセス速度は測定できない。
- Gnome Disks はディスク全体のアクセス速度の平均値を測定できる。GUI での測定のみ。
- diskspd for linux と fio はアクセス速度を測定した結果のバラツキが大きい。
という事が分かりました。
これらの測定方法の中で、個人的には diskspd for linux に期待していました。というのも、Windows 版の CrystalDiskMark (以下CDMと略称) のバックエンドで動作している、Microsoft 製の diskspd の linux 版ですので、OS やファイルシステムが異なるとはいえ、実際の使用環境に応じた測定値が安定して得られるのではないかと考えていました。
しかし、diskspd for linux のアクセス速度は、様々な影響を受けてバラツキが大きい状態でした。アクセス速度のバラツキが大きいと、測定値を比較した際に、バラツキの範囲内なのか、有意な差があるのか判断できません。
前回は試行回数が少ない場合の結果でしたのでアクセス速度の傾向が掴めませんでした。今回は diskspd for linux の試行回数を増やし、機種の違いや各種パラメータ、データサイズの影響について調べてみました。(14,000回程度試行した結果です)
結論としては、
diskspd for linux はディスクのアクセス速度の評価には使用できない
と私は判断します。
以下、色々と試した結果を記載しますが、どちらかといえば diskspd for linux のアクセス速度の「信頼性がどの位低いか」を示す情報である事を理解の上でご覧ください。
20231119 追記 : その3として fio の測定結果をまとめました。
2023年12月26日追記:
その4です。fio で filesystem 4種類 (Ext4, XFS, Btrfs, JFS) のアクセス速度を比較しました。
2024年1月19日追記:
その5です。mdadm で RAID 0 (2, 3基) / RAID 1 / RAID 5 の RAID array を作成し、3種類 (Ext4, XFS, Btrfs) の filesystem のアクセス速度を比較しました。
DiskMark-linux による測定結果のバラツキの原因
前回の記事では、diskspd for linux を DiskMark-linux の script で実行しました。
DiskMark-linux は 4種類の測定条件 (SEQ1MQ8T1、SEQ1MQ1T1、RND4KQ32T1, RND4KQ1T1) の Read / Write を一度に測定できるので便利ですが、この script で繰り返し測定するとアクセス速度のバラツキが大きくなります。
- 最初の測定 (SEQ1MQ8T1) の際に、測定用のデータファイルを作成する事 (DiskMark-linux の script 内にも記載があります)
- スクリプトを使用して複数回測定する場合に、前に測定した条件の影響を受ける事
1 については、事前にデータファイルを作成しておく事で回避できます。
2 については、例えば、SEQ1MQ1T1 の Read を10回測定する場合に、
- SEQ1MQ1T1 Read を 1回測定し、他の測定が一巡してから再び測定
- SEQ1MQ1T1 Read を 10回連続で測定
の 2つの方法では、前者のバラツキが大きくなります。
他にも、アクセス速度の測定を繰り返すうちに、データサイズや diskspd for linux の Waiting time (-W option) や Measuring time (-d option)、I/O depth (CDM の Q パラメータ、-o option)、Threads (CDM の T パラメータ、-t option) の影響を大きく受けている事が分かってきました。
測定方法の変更
そこで、DiskMark-linux を参考にして、diskspd for linux の各種パラメータを変更しながらディスクのアクセス速度を測定するスクリプトを作成しました。仮に 'diskspd_measure.sh' と名前を付けました。
#! /bin/bash
# diskspd は ~/.local/bin/ に入れておく。Ubuntu Bash なら PATH 通っている
DISKSPD="diskspd"
# 引数の数チェック : 7
if [ "$#" != 7 ]
then
echo "ERROR!"
echo "You must provice seven args."
echo " 1: Measurement Type : SEQ1MQ8T1, ..."
echo " 2: Data Size : 0.25G, 0.5G, 1G, 3G, 5G, 8G, 10G."
echo " 3: Target file : /media/user/target/DiskMark_data1G etc."
echo " 4: Counts : Repeat Measuring times."
echo " 5: Read or Write : Measurement Type."
echo " 6: -d option parameter (Measuring Time). Default : 10"
echo " 7: -W option parameter (Waiting Time). Default : 5"
exit 1
fi
# CrystalDiskMark 同等の測定方法の指定
# パラメータを変更したい場合には case ... esac をコメント
TYPE=$1
case ${TYPE} in
"SEQ1MQ8T1" )
;;
"SEQ1MQ1T1" )
;;
"RND4KQ32T1" )
;;
"RND4KQ1T1" )
;;
*)
echo "ERROR!"
echo "Type Miss match. Do not use Type ${TYPE}"
exit 1
esac
# Data size の指定
# CSV で区別するために使用。測定には使用しない。
D_SIZE=$2
case ${D_SIZE} in
"0.25G" )
;;
"0.5G" )
;;
"1G" )
;;
"3G" )
;;
"5G" )
;;
"8G" )
;;
"10G" )
;;
*)
echo "ERROR!"
echo "Data Size Miss match. Do not use Data Size ${D_SIZE}"
exit 1
esac
# Target の指定
TGT=$3
TEST_FILE=$3
# File の存在確認
if [ ! -e ${TEST_FILE} ]
then
echo "ERROR!"
echo "Data File not exists."
exit 1
fi
# 測定回数の指定
COUNTS=$4
if [ ${COUNTS} -lt 1 ] # 1以上を指定
then
echo "ERROR!"
echo "Measure counts >=1."
exit 1
fi
# Read / Write の指定
R_W=$5
if [ ${R_W} = "Read" ] # 0 : Read only 100 : Write only
then
w_OP="0"
else
w_OP="100"
fi
# CrystalDiskMark の文字列から測定条件を抜き出す
b_OP=`echo ${TYPE:3:2}` # 4〜5文字が Block size
case ${b_OP} in
"1M" )
;;
"4K" )
;;
*)
echo "ERROR!"
echo "Type Miss matcch. Set 1M or 4K."
exit 1
esac
d_OP=$6 # d : Measuring time
if [ ${d_OP} -lt 1 ] # 1以上を指定
then
echo "ERROR!"
echo "d parameter must d>=1."
exit 1
fi
TEMP_OP=`echo ${TYPE##*Q}` # Q は2桁もあるので、Qから前とTから後を消去
o_OP=`echo ${TEMP_OP%T*}`
if [ ${o_OP} -lt 1 ] # 1以上を指定
then
echo "ERROR!"
echo "Q parameter must Q>=1."
exit 1
fi
t_OP=`echo ${TYPE#*T}` # Tから前を消去
if [ ${t_OP} -lt 1 ] # 1以上を指定
then
echo "ERROR!"
echo "t parameter must t>=1."
exit 1
fi
W_OP=$7 # W : Waiting time
if [ ${W_OP} -lt 0 ]
then
echo "ERROR!"
echo "W parameter must W>=0."
exit 1
fi
M_TYPE=`echo ${TYPE:0:3}` # 最初の3文字が SEQ or RND
if [ ${M_TYPE} = "SEQ" ] # -r : Random none : Sequential
then
r_OP=""
else
r_OP="-r"
fi
INTERVAL_TIME=5
# CSV で出力
# title line
echo "No.,Type,Target,Data_size,BlockSize(b),MeasTime(d),IO_depth(o),Threads(t),WaitTime(W),Read_Write(w),SEQorRND(r),result"
for i in `seq ${COUNTS}`; do
sleep ${INTERVAL_TIME}
# measure
echo -n "${i},${TYPE},${TGT},${D_SIZE},${b_OP},${d_OP},${o_OP},${t_OP},${W_OP},${w_OP},${M_TYPE},"
${DISKSPD} -Zr -b${b_OP} -d${d_OP} -o${o_OP} -t${t_OP} -W${W_OP} -Sd -w${w_OP} ${r_OP} ${TEST_FILE} | awk '/^Total IO$/ {while(1) {getline; if ($0 ~ /^total/) {print $6; break}} }'
done
同じ条件を指定回数だけ繰り返して実行する script です。
diskspd for linux の結果を awk で処理してアクセス速度のみを抜き出し、他の条件と合わせて CSV で出力するようにしています。-Sd オプションを付けていますので、キャッシュなしで Read / Write するはずです。簡単ですが入力値のエラーチェックも行っています。
実行結果の一例です。
$ ./diskspd_measure.sh
ERROR!
You must provice seven args.
1: Measurement Type : SEQ1MQ8T1, ...
2: Data Size : 0.25G, 0.5G, 1G, 3G, 5G, 8G, 10G.
3: Target file : /media/user/target/DiskMark_data1G etc.
4: Counts : Repeat Measuring times.
5: Read or Write : Measurement Type.
6: -d option parameter (Measuring Time). Default : 10
7: -W option parameter (Waiting Time). Default : 5
$ ./diskspd_measure.sh SEQ1MQ1T1 1G /media/hiro/SG/DiskMark_data1G 2 Read 10 5
No.,Type,Target,Data_size,BlockSize(b),MeasTime(d),IO_depth(o),Threads(t),WaitTime(W),Read_Write(w),SEQorRND(r),result
1,SEQ1MQ1T1,/media/hiro/SG/DiskMark_data1G,1G,1M,10,1,1,5,0,SEQ,173.50
2,SEQ1MQ1T1,/media/hiro/SG/DiskMark_data1G,1G,1M,10,1,1,5,0,SEQ,176.60
測定用のデータファイルは事前に dd で作成しました。
$ dd if=/dev/random of=./DiskMark_data0.25G bs=1024k count=256
$ dd if=/dev/random of=./DiskMark_data0.5G bs=1024k count=512
$ dd if=/dev/random of=./DiskMark_data1G bs=1024k count=1024
$ dd if=/dev/random of=./DiskMark_data3G bs=1024k count=3072
$ dd if=/dev/random of=./DiskMark_data5G bs=1024k count=5120
$ dd if=/dev/random of=./DiskMark_data8G bs=1024k count=8192
$ dd if=/dev/random of=./DiskMark_data10G bs=1024k count=10240
3基 (SG, WD1, WD2 ) の HDD を /media/hiro/ 以下に mount して、その中で実行しデータファイルを作成します。
測定結果 (n=20)
条件を変えて diskspd for linux を実行し、結果を集計しました。記載の無い場合は n=20 の結果です。(実際には21回測定して1回目のデータを除外しています)
Waiting time (-W option) と Measuring time (-d option) の影響
始めに Waiting time (-W option) と Measuring time (-d option) の影響を調べました。
- Waiting time は 0, 5, 10
- Measuring time は 5, 10, 20
の範囲で変更し、それぞれ平均値 (Avg.) とバラツキ (R / Avg. %) を比較しました。データサイズは 1GB です。
SEQ1MQ8T1 (Read / Write)
SEQ1MQ8T1 (Sequential, 1MB, I/O depth 8、Threads 1) の結果です。結論としては、SEQ1MQ8T1 は機種間の差とバラツキが大きく、ディスクのアクセス速度の評価には使用できないと思います。
後半で Q パラメータと T パラメータの影響も調査していますので、そちらの結果も参照ください。
Read :
Write :
SEQ1MQ8T1 の結果は以下の通りです。
- Waiting time (-W) や Measuring time (-d) の影響は見られない。(他の影響が大きい)
- WD1、WD2 は 300 ~ 400 MB/sec と SATA HDD の結果としては高すぎる結果だった (ここまで出るとは考えにくい。キャッシュが効いてる?)。
- また、バラツキがどの条件でも 20 ~ 40% と大きく、再現性が低かった。
- Write は WD1 と WD2 は安定していて R / Avg. も 5% 前後と再現性が高かった。
- しかし、SG はアクセス速度の変動も大きくバラツキも大きかった。
SG の Write のバラツキが大きいのが気になったので、n 数を増やして分布を調べました。
160 ~ 175 MB/sec の結果が多いですが、150 MB/sec 以下の結果もそれなりに出ているために、平均も下がりバラツキも大きくなっています。21 回ずつ5回測定し、150 MB/sec 以下の結果が満遍なく発生していました。
以上の結果から、SEQ1MQ8T1 Read / Write のアクセス速度はバラツキが大きく、アクセス速度の評価に使用する事は出来ないと考えます。
SEQ1MQ1T1 (Read / Write)
SEQ1MQ1T1 (Sequential, 1MB, I/O depth 1、Threads 1) の結果です。結論としては、SEQ1MQ1T1 はバラツキが小さく、今回の条件であればディスクのアクセス速度の評価に使用できると思います。
Read :
Write :
SEQ1MQ1T1 の結果は以下の通りです。
- Waiting time (-W) と Measuring time (-d) の影響は、Write に見られる。Waiting time が増えるとアクセス速度は低下し、Measuring time が増えると Waiting time の影響が少なくなる。Read にこれらの影響は見られない。
- Read、Write 共に R / Avg. は 5%未満が殆どであり、アクセス速度のバラツキが少ない。
- Read は 3基 の HDD 共に、どの測定条件でも 175 ~ 180 MB/sec とほぼ同じ速度である。
- Write は SG が 165 MB/sec 前後と若干遅く、WD1 と WD2 が 170 MB/sec 前後と若干速い。
HDD 間の差も少なく、R / Avg. も 5%未満が殆どでバラツキも少ないので、SEQ1MQ1T1 の測定結果は再現性が高く、今回の条件であればディスクのアクセス速度の比較に使用できると思います。
RND4KQ32T1 (Read / Write)
RND4KQ32T1 (Random, 4kB, I/O depth 32、Threads 1) の結果です。結論としては、RND4KQ32T1 は機種間の差がある事とバラツキが若干多めなので、ディスクのアクセス速度の評価に使用できますが注意が必要かと思います。
後半で Q パラメータと T パラメータの影響も調査していますので、そちらの結果も参照ください。
Read :
Write :
RND4KQ32T1 の結果は以下の通りです。
- Waiting time (-W) と Measuring time (-d) の影響は、WD1 と WD2 の Write に明確に見られる。Waiting time が増えるとアクセス速度は低下し、Measuring time が増えると Waiting time の影響が少なくなる。Read と SG の Write にはこれらの影響は見られない。
- SG と WD1 & WD2 のアクセス速度は、Read も Write も明確に異なっていた。SG と比べて WD1 & WD2 の方が約1.4倍速い結果だが、HDD の違いなのか SEQ1MQ8T1 と同様に異常値なのかどうかはわからず。(Windows 版の CDM では Read 1.65 ~ 1.66、Write 1.51 ~ 1.52 なので、どちらかといえば WD1 & WD2 の方が高く出ているのではないかと推測する)
- Read の R / Avg. はほぼ 5% 以内でバラツキは小さいが、Write の R / Avg. は 5 ~ 10%、一部のデータは 15% を超えていた。Measuring time (-d) を増やすと R / Avg. は少なくなる傾向が見えるので、Measuring time (-d) は 10 以上を指定した方が安定した結果が得られると考える。
Read / Write 共に SG に対して WD1 & WD2 の結果が 1.4倍程度高い事、及び Write の R / Avg. が10% 程度ありバラツキが少し大きい事から、RND4KQ32T1 の測定結果は再現性はある程度あるものの、ディスクのアクセス速度の比較に使用するには注意が必要だと思います。
RND4KQ1T1 (Read / Write)
RND4KQ1T1 (Random, 4kB, I/O depth 1、Threads 1) の結果です。結論としては、RND4KQ1T1 は RND4KQ32T1 の結果と同様に、機種間の差がある事とバラツキが若干多めなので、ディスクのアクセス速度の評価に使用できますが注意が必要かと思います。
Read :
Write :
RND4KQ1T1 の結果は以下の通りです。
- Waiting time (-W) と Measuring time (-d) の影響は、Write に明確に見られる。Waiting time が増えるとアクセス速度は低下し、Measuring time が増えると Waiting time の影響が少なくなる。Read にはこれらの影響は見られない。
- SG と WD1 & WD2 のアクセス速度は、Read は大きな差はないが、Write は RND4KQ32T1 同様に明確に異なっていた。SG と比べて WD1 & WD2 のアクセス速度は、Read はほぼ同等だが、Write は約1.4倍速い。HDD の違いなのか SEQ1MQ8T1 と同様に異常値なのかどうかはわからず。(Windows 版の CDM では Read 0.59 ~ 0.60、Write 1.59 なので、どちらかといえば WD1 & WD2 の方が高く出ているのではないかと推測する)
- Read の R / Avg. はほぼ 5% 以内でバラツキは小さいが、Write の R / Avg. は 5 ~ 10%、一部のデータは 10% を超えていた。Waiting time (-W) や Measuring time (-d) の影響は明確には見られない。
Read はほぼ同等も Write は SG に対して WD1 & WD2 の結果が 1.4倍程度高い事、及び Write の R / Avg. が 5 ~ 10% 程度ありバラツキが少し大きい事から、RND4KQ1T1 の測定結果は再現性はある程度あるものの、ディスクのアクセス速度の比較に使用するには注意が必要だと思います。
データサイズの影響
diskspd for linux は読み書きする対象のデータサイズの影響を受けます。Waiting time を 5 (-W5)、Measuring time を 10 (-o10) として、比較的再現性の高い条件である SEQ1MQ1T1 と RND4KQ1T1 について、データサイズを変更してアクセス速度を測定してみました。
SEQ1MQ1T1 (Read / Write)
Read / Write 共に 5GB 以上のデータサイズでアクセス速度の大きな変動はなくなるようです。ただし、どの条件でも R / Avg. はほぼ 5% 以内ですので、バラツキは小さいです。
Read :
Write :
RND4KQ1T1 (Read / Write)
Read / Write 共に、データサイズが増加するに従ってアクセス速度は低下します。5GB 以上のデータサイズで影響は少なくなるように見えます。ただし、Read は R / Avg. が 5%以下でバラツキは小さいですが、Write は 10 ~ 15% ですのでバラツキは少し大きめです。
Read :
Write :
Q パラメータの影響
SEQ1MQ8T1 のアクセス速度は、SEQ1MQ1T1 と比較して Read / Write 共にバラツキが大きく、WD1 & WD2 のアクセス速度が 300 ~ 400 MB/sec と HDD では考えられない程高くなっていました。
その原因を調べる為に、Q パラメータ (-o option) を 1 ~ 32 まで変化させてアクセス速度を測定してみました。Waiting time は 5 (-W5)、Measuring time は 10 (-d10)、Threads は 1 (-t1)、データサイズは 1GB です。
SEQ1M T1 : Q=1~32
Read は SG は横這い、WD1 & WD2 は上下に変動しながら右肩上がりの傾向はありますが、R / Avg. が大きく、WD2では100 % 以上に達している箇所もあります。Q = 1 の条件以外のバラツキが極端に大きくなっています。
Write は Q >= 10 で R / Avg. が 5% 前後に落ち着いていますので、この領域のアクセス速度は信頼できそうです。ただし、Q = 2 ~ 8 の間では SG の R / Avg. が 20 ~ 30% となっており、Read 同様に Q = 1 の条件以外はバラツキが大きい状態です。
以上の結果から、SEQ1M の場合は Q >= 2 の条件ではアクセス速度を評価するには不十分だと考えます。
Read :
Write :
RND4K T1 : Q=1~32
Read は右肩上がり、Write は横這いという結果でした。R / Avg. も概ね 10% 未満で再現性も問題ありません。
RND4K の場合は、Read / Write 共に、機種の違いによるアクセス速度の差に注意すれば、Q1 ~ Q32 のどの条件でもアクセス速度の評価には使用できると考えます。
Read :
Write :
T パラメータの影響
Windows 版 CDM では T パラメータ (-t option, Threads) は 1 で固定ですが、Q パラメータと同様に並列でアクセスする方法ですので、比較の為に 1 ~ 32 まで変化させてアクセス速度の傾向を確認しました。
Waiting time は 5 (-W5)、Measuring time は 10 (-d10)、Q パラメータは 1 (-o1, I/O depth)、データサイズは 1GB です。
SEQ1MQ1 : T=1~32
Read は SG は横這い、WD1 & WD2 は右肩上がりの傾向はありますが、特に T < 14 で R / Avg. が大きく、WD1 と WD2では100 % 以上に達している箇所もあります。T = 1 の条件以外のバラツキが極端に大きくなっています。
Write は並列化によりトータルの書き込み速度が上昇する傾向は見られますが、R / Avg. が 20 ~ 40% 前後であり、T = 1 の条件以外のバラツキが大きくなっています。
以上の結果から、SEQ1M の場合は T >= 2 の条件ではアクセス速度を評価するには不十分だと考えます。
Read :
Write :
RND4KQ1 : T=1~32
Read は 全て右肩上がりの傾向ですが、SG は緩やか、WD1 & WD2 は急激に上昇しています。RND4K で並列化したとしても、流石に 12 MB/sec を超えるアクセス速度は HDD では出ないと思いますので、並列化に伴いキャッシュされている可能性があると感じます。R / Avg. は SG が最大 96 %と大きく、WD1 & WD2 は 20% から T の増加と共に徐々に減少しています。アクセス速度とバラツキの状態から、T = 1 以外の結果の信頼性は低いと考えます。
Write は、SG に対して WD1 & WD2 は約1.4倍のアクセス速度でした。ただし、3基の HDD 何れも R / Avg. が大きく、T32 では 40 ~ 50 % ありました。Read と同様に、T = 1 以外の結果の信頼性は低いと考えます。
Read :
Write :
diskspd for linux の測定値がばらつく原因 (推測)
今回、diskspd for linux の条件を色々と変更して測定しました。その中で、アクセス速度が Windows 版の CDM の結果と大きく異なったり、測定値がばらついたりする項目は以下の3つです。
- Sequential Read / Write で Q パラメータ (I/O depth、-o option) が 1以外
- Sequential Read / Write で T パラメータ (Threads, -t option) が 1以外
- 機種によるアクセス速度の違い (特に RND Read / Write)
測定値がばらつく原因は、1 と 2 については並列化、3 については機種の特性の違いが考えられますが、それ以外の理由による影響も考えられます。
この先は推測になりますが、OS のキャッシュを無効にする O_DIRECT (-Sd option) が正常に機能していないのではないでしょうか。並列化に伴いキャッシュが効いてしまっている事ように見えます。source code が読み切れていないので断言はできませんが、何となく特定条件でキャッシュが効いてしまい、アクセス速度が上昇しているように感じます。
ZFS と Btrfs で diskspd for linux を使用する方法
私がディスクのアクセス速度を測定しようと考えている5種類のファイルシステム (Ext4、Btrfs、XFS、ZFS、JFS) のうち、Btrfs 及び ZFS については diskspd for linux で測定しようとしてもエラーが表示されます。
# Btrfs
$ diskspd -Zr -b1M -d10 -o1 -t1 -W5 -Sd -w0 /media/hiro/btrfs/DiskMark_data1G
Tried to lookup nonexistent device 0,50 in sys_info!
# ZFS
$ diskspd -Zr -b1M -d10 -o1 -t1 -W5 -Sd -w0 /media/hiro/zfs/DiskMark_data1G
Tried to lookup nonexistent device 0,36 in sys_info!
原因は、Ext4、XFS、JFS の3種類と異なり、Btrfs と ZFS は複数のパーティションを使用できる為です。単一のパーティションの場合は /dev/sda1 等の Block device と一対一の対応が出来るのに対して、Btrfs と ZFS は RAID 等の機能をファイルシステムとして持っている為に、一つの Block device に限定できません。
このメッセージを表示している部分から辿って source を確認すると、src/job.cc 内で device name と scheduler を stat 関数で調べていました。結果に表示しているだけで測定には使用していないので、Btrfs と ZFS の場合に Bypass するように修正しました。
--- job.cc.orig 2023-08-31 14:05:29.842818918 +0900
+++ job.cc 2023-10-08 22:26:41.625785494 +0900
@@ -12,6 +12,9 @@
#include <time.h>
#include <sys/stat.h>
+#include <sys/statfs.h> // statfs() to get f_type
+#include <linux/magic.h> // FileSystem Magic No. (BTRFS_SUPER_MAGIC)
+#define ZFS_SUPER_MAGIC 0x2fc12fc1 // FileSystem Magic No. (ZFS_SUPER_MAGIC)
// TODO dynamic sector size discovery
//#include <sys/ioctl.h>
//#include <linux/fs.h>
@@ -173,9 +176,20 @@
struct stat buf = {0};
int err = stat(target->path.c_str(), &buf);
- // use appropriate device id (st_dev != st_rdev if target is a device)
- target->device = options->sys_info->device_from_id(buf.st_rdev ? buf.st_rdev : buf.st_dev);
- target->scheduler = options->sys_info->scheduler_from_device(target->device);
+ // Check btrfs and zfs
+ struct statfs buf_fs;
+ int err_fs = statfs(target->path.c_str(),&buf_fs);
+ if (buf_fs.f_type == BTRFS_SUPER_MAGIC ) { // for btrfs
+ target->device = "btrfs (undefined)";
+ target->scheduler = "btrfs (undefined)";
+ } else if (buf_fs.f_type == ZFS_SUPER_MAGIC ) { // for zfs
+ target->device = "zfs (undefined)";
+ target->scheduler = "zfs (undefined)";
+ } else { // other Filesystem
+ // use appropriate device id (st_dev != st_rdev if target is a device)
+ target->device = options->sys_info->device_from_id(buf.st_rdev ? buf.st_rdev : buf.st_dev);
+ target->scheduler = options->sys_info->scheduler_from_device(target->device);
+ }
}
/***********************
これで Btrfs 及び ZFS でも diskspd for linux を実行する事が出来ます...が、どちらもキャッシュが効いているようで、アクセス速度が非常に高く表示されます。O_DIRECT は有効 (-Sd) なのですが...
# Btrfs
$ diskspd -Zr -b1M -d10 -o1 -t1 -W5 -Sd -w0 /media/hiro/btrfs/DiskMark_data1G \
| awk '/^Total IO$/ {while(1) {getline; if ($0 ~ /^total/) {print $6; break}} }'
11642.90
# ZFS
$ diskspd -Zr -b1M -d10 -o1 -t1 -W5 -Sd -w0 /media/hiro/zfs/DiskMark_data1G \
| awk '/^Total IO$/ {while(1) {getline; if ($0 ~ /^total/) {print $6; break}} }'
4737.80
Sequential Read を dd で測定した結果です。Btrfs は dd では O_DIRECT が効いています。ZFS は無視されてキャッシュが使用されているようです。
# Btrfs
$ for i in {1..5} ; do sleep 5 ; \
dd if=/media/hiro/btrfs/DiskMark_data1G of=/dev/null bs=1M count=1000 iflag=direct 2>&1 \
| grep 'B/s' ; done
1048576000 bytes (1.0 GB, 1000 MiB) copied, 7.22987 s, 145 MB/s
1048576000 bytes (1.0 GB, 1000 MiB) copied, 7.08132 s, 148 MB/s
1048576000 bytes (1.0 GB, 1000 MiB) copied, 7.26189 s, 144 MB/s
1048576000 bytes (1.0 GB, 1000 MiB) copied, 7.27544 s, 144 MB/s
1048576000 bytes (1.0 GB, 1000 MiB) copied, 7.19563 s, 146 MB/s
# ZFS
$ sudo -i
# sync
# echo 3 > /proc/sys/vm/drop_caches
# exit
$ for i in {1..5} ; do sleep 5 ; \
dd if=/media/hiro/SG/DiskMark_data1G of=/dev/null bs=1M count=1000 iflag=direct 2>&1 \
| grep 'B/s' ; done
1048576000 bytes (1.0 GB, 1000 MiB) copied, 6.50103 s, 161 MB/s
1048576000 bytes (1.0 GB, 1000 MiB) copied, 0.208785 s, 5.0 GB/s
1048576000 bytes (1.0 GB, 1000 MiB) copied, 0.210098 s, 5.0 GB/s
1048576000 bytes (1.0 GB, 1000 MiB) copied, 0.208531 s, 5.0 GB/s
1048576000 bytes (1.0 GB, 1000 MiB) copied, 0.208662 s, 5.0 GB/s
ZFS については Database 向けにキャッシュを使用しない方法を見つけましたが、Btrfs ではそのような方法が調べきれていません。
diskspd for linux の source を修正する事で Btrfs と ZFS のアクセス速度を測定する事は出来ますが、キャッシュの影響を除外して測定する方法を確立する事が出来ませんでした。
まとめ
今回は、diskspd for linux を使用して Ext4 ファイルシステムのアクセス速度を測定してみました。
- Windows 版の CDM の条件に合わせて、SEQ1MQ8T1、SEQ1MQ1T1、RND4KQ32T1、RND4KQ1T1 の Read と Write、8種類についてアクセス速度を測定
- Waiting time (-W option) と Measuring time (-d option) の影響
- データサイズの影響 (SEQ1MQ1T1、RND4KQ1T1 のみ)
- Q パラメータ (-o option, I/O depth) の影響
- T パラメータ (-t option, Threads) の影響
また、Btrfs と ZFS では diskspd for linux を使用できませんでしたので、patch を当てて測定できるように修正しました。
結果としては、
- SEQ1MQ1T1 と RND4KQ1T1 (Q = 1, T = 1) の条件のみ、バラツキが少なめ
- 他の条件はバラツキが多い
- 機種間のバラツキが目立つ
- Wating time と Measuring time の影響は SEQ は少なく、RND は顕著に見られる
- データサイズの影響は 5GB 以上で少なくなる。1GB 未満では顕著に見られる。
- Q パラメータ (-o option)、T パラメータ (-t option) は共に1以外のデータはバラツキが大きい
- Btrfs と ZFS でも diskspd for linux を使用できるように修正したが、キャッシュの影響を diskspd for linux のみでは除外できない
という事が分かりました。
以上の結果から、最初にも書きましたが
diskspd for linux はディスクのアクセス速度の評価には使用できない
と私は判断しました。
- 並列測定時 (Q > 1 or T > 1) のバラツキが大きい
- 機種間のバラツキが大きい
- O_DIRECT でキャッシュの影響を除外できない
等、条件を変えて測定するには再現性に乏しく、測定した結果の信頼性に欠けると感じます。
diskspd for linux で安定したアクセス速度の測定が出来る条件を探してみましたが、私には見つける事が出来ませんでした。
シーケンシャルアクセスであれば、Q=1、T=1 の条件であれば dd で代用が出来ますので、こちらを使用する事にします。ランダムアクセスについては、fio が使用できるかどうかをこれから確認してみようと考えています。
今回のアイキャッチ画像
十五夜を目標にまとめようと考えていましたが間に合わず。満月と黒兎で生成しました。今回もトリミングした画像です。
コメント