ZFSの性能劣化について - snapshot無し版

Posted on 2011/02/11(Fri) 14:00 in technical

前回は、テストケースに合わせた測定をしたので、そこからSnapshotを取得しない(したとしても、別のプールの)場合を考える。

少しファイル量を調整(定常CAP 94%、測定終了時CAP98%位)したので、厳密な比較ではないです。

本当は、性能の回復に向けたデータ取得がしたいのだけど、スクリプトが上手く表現できなさそうだったから、簡単な方からやりました。

しかし、ディスクの内外周性能差が直接グラフに出てるだけで、ZFSさんは何も悪くない感じですね、マジで。

以下特に面白くないグラフぺたぺた。

image0

snapshot取得時に比べると、低下は若干緩やかになっている。

440GiB地点では、何故かReadが向上してWriteは低下している。

たまたまシーケンシャルに近い動きをしたのかもしれない けど、そもそもZFSさんはどの程度アロケートサイズの間隔を持たせるのかよく知らないので割愛。

しかし、概ねsnapshotを取得していた場合と傾向は似ており、snapshotを大量に取得することで、性能に大幅な影響を与える可能性は今のところ少ないように見える。

(データの削除やパーティションごとのデータ移動に伴って、snapshotの示すデータ位置のフラグメンテーションが激しくなる場合は性能が劣化して当然なので、実運用における結論とはならない)

性能劣化はファイルシステムじゃなくて、ディスクの内外周の速度差に起因するものだと見ても良いレベル。

image1

概ね同様の傾向。

image2

2枚目と同様の傾向。

352GiB地点における安定感から、440GiB地点のぶれは、微妙に余った外周部分にも読み書きが発生しているだけのように見える。

image3

応答時間は徐々に増えているが、440GiB地点のぶれは、同様にディスクの内外周に起因するものに見える。

snapshot取得時はこのような傾向が見えていなかったが、若干ファイル数の調整を行ったのが裏目に出た感じかなぁ…。

再取得してくるます。

image4

zpool iostatで見たほう。

同様だね。

image5

CPU使用率の傾向は前回と一緒。

スクリプト。

#!/bin/sh
init_log()
{
date
cat /etc/release
psrinfo -v
prtconf \grep Mem
zfs upgrade -v
zpool upgrade -v
}

zpool_log()
{
df -h
zpool status p-test
zpool list
zpool get all p-test
zfs list -o space
zfs list -t snapshot
zfs get all p-test
}

dd15g()
{
num=0
while [ ${num} -ne 10 ] ; do
dd if=/dev/zero of=./dir${num}/${num}.dd bs=512k count=30720
dd of=/dev/null if=./dir${num}/${num}.dd bs=512k count=30720
rm ./dir${num}/${num}.dd
num=\`expr ${num} + 1\`
done
}

get_ss()
{
num=0
while [ ${num} -ne 10 ] ; do
zfs snapshot p-test/dir${num}@$1
num=\`expr ${num} + 1\`
done
}

#--------------------------
# 0.Init log
#--------------------------
init_log

#--------------------------
# 1.Create zpool
#--------------------------
zpool create p-test $1
iostat -ndcxM 60 > p-test_02_iostat.txt &
vmstat 60 > p-test_02_vmstat.txt &
zpool iostat p-test 60 > p-test_02_zpool.txt &
cd /p-test

#--------------------------
# 2.Create ZFS Partition
#--------------------------
num=0
while [ ${num} -ne 10 ] ; do
echo "zfs create p-test/dir${num}"
zfs create p-test/dir${num}
num=\`expr ${num} + 1\`
done
zpool_log
sleep 30

#--------------------------
# 3.Performance Check with dd
#--------------------------
dd15g

#--------------------------
# 4.Get Snapshot
#--------------------------
#get_ss init

#--------------------------
# 8.Loop for step 4,5,6,7
#--------------------------
loop=0
while [ ${loop} -ne 5 ] ; do
echo "loop ${loop} start."
zpool_log
sleep 30

#--------------------------
# 4.Make Rundom Files
#--------------------------
num=0
while [ ${num} -ne 10 ] ; do
files=0
while [ ${files} -ne 1000 ] ; do
dd if=/dev/urandom of=./dir${num}/temp-${loop}-${num}-${files}.dd
bs=512k count=18
files=\`expr ${files} + 1\`
done
num=\`expr ${num} + 1\`
done

#--------------------------
# 5.Get Snapshot
#--------------------------
# get_ss ${loop}

#--------------------------
# 6.Delete Rundom Files
#--------------------------
: <<'#__COMMENT_OUT__'
num=0
while [ ${num} -ne 10 ] ; do
files=256
while [ ${files} -ne 512 ] ; do
rm ./dir${num}/temp-${loop}-${num}-${files}.dd
files=\`expr ${files} + 1\`
done
num=\`expr ${num} + 1\`
done
#__COMMENT_OUT__

#--------------------------
# 7.Performance Check with dd
#--------------------------
dd15g

loop=\`expr ${loop} + 1\`
done

#--------------------------
# 9.Destroy zpool
#--------------------------
sleep 30
zpool_log
sleep 30
zpool destroy p-test
pkill iostat
pkill vmstat
pkill -f "zpool iostat p-test 60"

#--------------------------
# 10.Init log
#--------------------------
init_log