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

ZFSの性能劣化が空き領域のパーセンテージによって起きるらしいので試してみる(snapshotを取らない場合)

はじめに

前回の ZFSの性能劣化について は、週に1度各パーティションでsnapshotを取ることを想定した手順を考えた。
今回は、そこからSnapshotを取得しない(したとしても、別のプールの)場合を考える。

少しファイル量を調整(定常CAP 94%、測定終了時CAP98%位)したので、厳密な比較ではないです。
本当は、性能の回復に向けたデータ取得がしたいのだけど、スクリプトが上手く表現できなさそうだったから、簡単な方からやりました。
しかし、ディスクの内外周性能差が直接グラフに出てるだけで、ZFSさんは何も悪くない感じですね、マジで。

試してみた結果

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

snapshot取得時に比べると、低下は若干緩やかになっている。
440GiB地点では、何故かReadが向上してWriteは低下している。

たまたまシーケンシャルに近い動きをしたのかもしれないけど、そもそもZFSさんはどの程度アロケートサイズの間隔を持たせるのかよく知らないので割愛。
しかし、概ねsnapshotを取得していた場合と傾向は似ており、snapshotを大量に取得することで、性能に大幅な影響を与える可能性は今のところ少ないように見える。
(データの削除やパーティションごとのデータ移動に伴って、snapshotの示すデータ位置のフラグメンテーションが激しくなる場合は性能が劣化して当然なので、実運用における結論とはならない)

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

概ね同様の傾向。

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

応答時間は徐々に増えているが、440GiB地点のぶれは、同様にディスクの内外周に起因するものに見える。
snapshot取得時はこのような傾向が見えていなかったが、若干ファイル数の調整を行ったのが裏目に出た感じかなぁ…。
再取得してくるます。

zpool iostatで見たほう。同様だね。

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

おまけ

使用したスクリプト

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#!/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
Hugo で構築されています。
テーマ StackJimmy によって設計されています。