下記の続き

スナップショットを取得している間、元のファイルシステムに対する書き込み性能がガタ落ちするか?

 

【お題5~6】 LVMスナップショットの静止点でレガシースナップショット取得中、ソースボリュームへのcpコマンドやddコマンドによる書き込み時間がかなり劣化した(6倍とか)。

シンスナップショットの場合でもレガシースナップショットの場合と同様、ソースボリュームへの書き込み時間が劣化するか確認する。

【お題5~6】 LVMスナップショットの静止点で行ったことと同じように下記を行った場合のソースボリュームの書き込み時間を計測する。

 

0.シンソースボリュームにddコマンドで10GBのファイルの書き込み時間を計測する。

1.シンソースボリュームにddコマンドで10GBのファイルを書き込み始めてから3秒後にシンソースボリュームに対するシンスナップショットを取得した際の上記ddコマンドの書き込み時間を計測する。

 ※ついでにレガシースナップショット同様シンスナップショット取得の瞬間に書き込み中

  だったファイルが破損することを確認する

2.シンソースボリューム上でcpコマンドによる10GBのファイルコピーを始めてから10秒後にシンソースボリュームに対するスナップショットを取得した際の上記cpコマンドの書き込み時間を計測する。

 ※ついでにレガシースナップショット同様シンスナップショット取得の瞬間に書き込み中

  だったファイルが破損することを確認する

 ※ついでにレガシースナップショット同様シンスナップショット取得の瞬間はsyncが発行

  されてDirtyキャッシュがディスクに反映されてからスナップショットが取得されること

  を確認する

 

【準備】

# lvs
  LV              VG  Attr          LSize   Pool     Origin     Data%  Meta%  Move Log Cpy%Sync Convert
  home            cl  -wi-ao---- 173.87g
  root             cl  -wi-ao----  50.00g
  swap             cl  -wi-ao----   7.81g
  1TBthin_snap1dst Vwi---tz-k 2.00t big_thinpool dst_thinlv
  big_thinpool    dst twi-aotz--   2.44t                           40.30  20.04
  dst_thinlv       dst Vwi-a-tz--   2.00t big_thinpool            49.20
  testlv_bk        dst -wi-a----- 200.00g
  legacy_snap    src swi-aos---  20.00g               testlv   38.86
  src_2TB_linerlv src -wi-a-----   2.00t
  test_thinpool   src twi-aotz-- 200.00g                          26.83  19.05
  testlv           src owi-aos--- 200.00g
  thinlv_1        src Vwi-aotz-- 200.00g test_thinpool          26.04   ←これをソースボリュームにしてシンスナップショットをつくる

# df -h | grep thinlv_1
/dev/mapper/src-thinlv_1      200G   43G  158G   22% /thinlv_1

 

・試し打ち

# time dd if=/dev/zero of=/thinlv_1/hoge count=10000 bs=1024k

10000+0 レコード入力
10000+0 レコード出力
10485760000 バイト (10 GB) コピーされました、 74.958 秒、 140 MB/秒
real    1m15.037s                          ←レガシーボリュームより約1.5倍くらい書き込みに時間がかかった
user    0m0.003s
sys     0m4.603s

# dd if=/dev/zero of=/thinlv_1/hoge count=10000 bs=1024k &   \

 { sleep 3;time lvcreate -s -n thin_snap1 src/thinlv_1; }
[1] 2636
  Using default stripesize 64.00 KiB.
  WARNING: Sum of all thin volume sizes (400.00 GiB) exceeds the size of thin pool src/test_thinpool and the amount of free space in volume group (326.37 GiB)!
  For thin pool auto extension activation/thin_pool_autoextend_threshold should be below 100.
  Logical volume "thin_snap1" created.
real    0m19.614s    ←ddで流し込み始めてから3秒スリープしてそのあと19秒後にスナップショットの作成が完了
user    0m0.018s
sys     0m0.075s
# 10000+0 レコード入力
10000+0 レコード出力
10485760000 バイト (10 GB) コピーされました、 76.9588 秒、 136 MB/秒  ←シンスナップショットがないときととあまりかわらない!

 

[1]+  終了                  dd if=/dev/zero of=/thinlv_1/hoge count=10000 bs=1024k

 

# ls -l /thinlv_1/
合計 10240004
drwxr-xr-x. 25 root root        4096  9月 14 20:41 1
-rw-r--r--.  1 root root 10485760000  9月 16 05:23 hoge

# lvs
  LV              VG  Attr          LSize   Pool          Origin     Data%  Meta%  Move Log Cpy%Sync Convert
  home            cl  -wi-ao---- 173.87g
  root            cl  -wi-ao----  50.00g
  swap            cl  -wi-ao----   7.81g
  1TBthin_snap1 dst Vwi---tz-k 2.00t big_thinpool  dst_thinlv
  big_thinpool    dst twi-aotz--   2.44t                             40.30  20.04
  dst_thinlv      dst Vwi-a-tz--   2.00t big_thinpool               49.20
  testlv_bk       dst -wi-a----- 200.00g
  legacy_snap     src swi-a-s---  20.00g               testlv      38.86
  src_2TB_linerlv src -wi-a-----   2.00t
  test_thinpool   src twi-aotz-- 200.00g                            35.55  25.47
  testlv          src owi-aos--- 200.00g
  thin_snap1    src Vwi---tz-k 200.00g test_thinpool thinlv_1
  thinlv_1        src Vwi-aotz-- 200.00g test_thinpool             31.18

 

・dd書き込み中に取得したスナップショットをマウントして中身を見る

# mkdir /thin_snap1

# lvchange -ay -K src/thin_snap1
# lvs src/thin_snap1

  LV         VG   Attr        LSize    Pool          Origin   Data%  Meta%  Move Log Cpy%Sync Convert
  thin_snap1 src Vwi-a-tz-k 200.00g test_thinpool thinlv_1 31.18

# mount -o nouuid /dev/src/thin_snap1 /thin_snap1
# ls -lh /thin_snap1

合計 3.1G
drwxr-xr-x. 25 root root 4.0K  9月 14 20:41 1
-rw-r--r--.  1 root root 2.7G  9月 16 05:22 hoge

# wc -c /thin_snap1/hoge
2800746496 /thin_snap1/hoge

→レガシースナップショットと同様、ファイル書き込み中に作成したシンスナップショットは、書き込み途中のファイルを断面としたスナップショットを取得する。

 

■LVMシンスナップショットは直前にdirtyキャッシュをsyncはしてくれるのか?

# ll /thinlv_1/
合計 10240004
drwxr-xr-x. 25 root root        4096  9月 14 20:41 1
-rw-r--r--.  1 root root 10485760000  9月 16 05:23 hoge

 

・試し打ち

10GBのファイルをコピーした場合、Dirtyキャッシュは何秒でディスクに全部書き込まれるか?

 ※7200回転キャッシュ256MBのSATAディスク

# umount /thin_snap1
# lvremove src/thin_snap1

Do you really want to remove active logical volume src/thin_snap1? [y/n]: y
  Logical volume "thin_snap1" successfully removed

# { time cp /thinlv_1/hoge /thinlv_1/hoge2; };for ((i=1;i<=40;i++));do printf "${i}秒 ";grep Dirty /proc/meminfo;sleep 1;done

real    2m44.273s            ←リニアボリュームより約1.7倍遅かった
user    0m0.063s
sys     0m13.173s
1秒 Dirty:            220752 kB
2秒 Dirty:            220928 kB
3秒 Dirty:            220928 kB
4秒 Dirty:            220928 kB
5秒 Dirty:            220928 kB
6秒 Dirty:            220928 kB
7秒 Dirty:            220928 kB
8秒 Dirty:            220928 kB
9秒 Dirty:            220928 kB
10秒 Dirty:            220928 kB
11秒 Dirty:            220928 kB
12秒 Dirty:            220928 kB
13秒 Dirty:            220928 kB
14秒 Dirty:            220928 kB
15秒 Dirty:            220928 kB
16秒 Dirty:            220928 kB
17秒 Dirty:                 8 kB
18秒 Dirty:                 0 kB
19秒 Dirty:                 0 kB
^C

→約16秒前後

※リニアボリュームのときよりIOが遅いのでキャッシュ書き込みがそれだけ進行してるからと思われる。

 

# ll /thinlv_1/
合計 10240008
drwxr-xr-x. 25 root root        4096  9月 14 20:41 1
-rw-r--r--.  1 root root 10485760000  9月 16 05:57 hoge

# { time cp /thinlv_1/hoge /thinlv_1/hoge2; } & { for ((i=1;i<=600;i++));do printf "${i}秒 ";grep Dirty /proc/meminfo;sleep 1;done; } & { sleep 10;lvcreate -s -n thin_snap1 src/thinlv_1; }

[1] 2906
[2] 2907
1秒 Dirty:                 0 kB
2秒 Dirty:             89136 kB
3秒 Dirty:            191948 kB
4秒 Dirty:            290948 kB
5秒 Dirty:            389864 kB
6秒 Dirty:            489720 kB
7秒 Dirty:            587836 kB
8秒 Dirty:            685164 kB
9秒 Dirty:            779164 kB
10秒 Dirty:            867908 kB
  Using default stripesize 64.00 KiB.
           ←レガシースナップショット取得開始
  WARNING: Sum of all thin volume sizes (400.00 GiB) exceeds the size of thin pool src/test_thinpool and the amount of free space in volume group (326.37 GiB)!
  For thin pool auto extension activation/thin_pool_autoextend_threshold should be below 100.

11秒 Dirty:            970760 kB
12秒 Dirty:                 0 kB                     ←syncは発行された臭い
13秒 Dirty:                12 kB
14秒 Dirty:                12 kB
15秒 Dirty:                12 kB
16秒 Dirty:                12 kB
17秒 Dirty:                12 kB
18秒 Dirty:                12 kB
  Logical volume "thin_snap1" created.         ←レガシースナップショット取得完了

# 19秒 Dirty:             26896 kB
20秒 Dirty:            109448 kB
21秒 Dirty:            213480 kB
22秒 Dirty:            319012 kB
23秒 Dirty:            413420 kB
24秒 Dirty:            515892 kB
25秒 Dirty:            613304 kB
26秒 Dirty:            713884 kB
27秒 Dirty:            815200 kB
28秒 Dirty:            917592 kB
29秒 Dirty:           1019376 kB
30秒 Dirty:           1119464 kB

31秒 Dirty:           1224972 kB
32秒 Dirty:           1331304 kB
33秒 Dirty:           1430540 kB
34秒 Dirty:           1530160 kB
35秒 Dirty:           1538804 kB
36秒 Dirty:           1537452 kB
37秒 Dirty:           1534072 kB
38秒 Dirty:           1536752 kB
39秒 Dirty:            964788 kB
40秒 Dirty:            964748 kB
41秒 Dirty:            964748 kB
42秒 Dirty:            964740 kB
43秒 Dirty:            964740 kB
44秒 Dirty:            964740 kB
45秒 Dirty:           1012808 kB
46秒 Dirty:           1097648 kB
47秒 Dirty:           1204200 kB
48秒 Dirty:           1306904 kB
49秒 Dirty:           1404232 kB
50秒 Dirty:            788672 kB
51秒 Dirty:            788672 kB
52秒 Dirty:            788668 kB
53秒 Dirty:            788668 kB
54秒 Dirty:            788668 kB
55秒 Dirty:            788668 kB
56秒 Dirty:            788668 kB
57秒 Dirty:            425588 kB
58秒 Dirty:            425588 kB
59秒 Dirty:            425588 kB
60秒 Dirty:            425588 kB
61秒 Dirty:            464532 kB
62秒 Dirty:            503176 kB
63秒 Dirty:            568980 kB
64秒 Dirty:            680684 kB
65秒 Dirty:            778708 kB
66秒 Dirty:                 0 kB
67秒 Dirty:                 0 kB
68秒 Dirty:                 0 kB
69秒 Dirty:                 0 kB
70秒 Dirty:                 0 kB
71秒 Dirty:               512 kB
72秒 Dirty:               512 kB
73秒 Dirty:               512 kB
74秒 Dirty:             91436 kB
75秒 Dirty:            198848 kB
76秒 Dirty:            303724 kB
77秒 Dirty:            404544 kB
78秒 Dirty:            504848 kB
79秒 Dirty:            586776 kB
80秒 Dirty:            677616 kB
81秒 Dirty:            782340 kB
82秒 Dirty:            898328 kB
83秒 Dirty:           1007292 kB
84秒 Dirty:           1111632 kB
85秒 Dirty:           1214144 kB
86秒 Dirty:           1319056 kB
87秒 Dirty:           1419036 kB
88秒 Dirty:           1524700 kB
89秒 Dirty:           1514080 kB
90秒 Dirty:           1495548 kB
91秒 Dirty:           1523028 kB
92秒 Dirty:           1493608 kB
93秒 Dirty:           1476120 kB
94秒 Dirty:           1526068 kB
95秒 Dirty:           1510896 kB
96秒 Dirty:           1520716 kB
97秒 Dirty:           1480424 kB
98秒 Dirty:           1216276 kB
99秒 Dirty:           1216452 kB
100秒 Dirty:           1216452 kB
101秒 Dirty:           1192924 kB
102秒 Dirty:            728932 kB
103秒 Dirty:            728932 kB
104秒 Dirty:            728932 kB
105秒 Dirty:            728932 kB
106秒 Dirty:            423144 kB
107秒 Dirty:            394240 kB
108秒 Dirty:            394752 kB
109秒 Dirty:            394752 kB
110秒 Dirty:            453148 kB
111秒 Dirty:            539044 kB
112秒 Dirty:             70908 kB
113秒 Dirty:             70908 kB
114秒 Dirty:             70908 kB
115秒 Dirty:             70908 kB
116秒 Dirty:             55096 kB
117秒 Dirty:             86368 kB
118秒 Dirty:            179868 kB
119秒 Dirty:            288472 kB
120秒 Dirty:            388376 kB
121秒 Dirty:            475428 kB
122秒 Dirty:            576608 kB
123秒 Dirty:            683904 kB
124秒 Dirty:            792164 kB
125秒 Dirty:            898216 kB
126秒 Dirty:            995564 kB
127秒 Dirty:           1097088 kB
128秒 Dirty:           1192552 kB
129秒 Dirty:           1299360 kB
130秒 Dirty:           1406584 kB
131秒 Dirty:           1509636 kB
132秒 Dirty:           1524896 kB
133秒 Dirty:           1507836 kB
134秒 Dirty:           1504428 kB
135秒 Dirty:           1522984 kB
136秒 Dirty:           1533636 kB
137秒 Dirty:           1022332 kB
138秒 Dirty:           1022332 kB
139秒 Dirty:           1022332 kB
140秒 Dirty:           1022332 kB
141秒 Dirty:           1022332 kB
142秒 Dirty:           1076568 kB
143秒 Dirty:           1164348 kB
144秒 Dirty:           1269120 kB
145秒 Dirty:           1377404 kB
146秒 Dirty:           1479716 kB
147秒 Dirty:            866684 kB
148秒 Dirty:            866684 kB
149秒 Dirty:            866684 kB
150秒 Dirty:            866684 kB
151秒 Dirty:            866684 kB
152秒 Dirty:            866684 kB
153秒 Dirty:            866684 kB
154秒 Dirty:            555060 kB
155秒 Dirty:            555060 kB
156秒 Dirty:            555060 kB
157秒 Dirty:            554784 kB
158秒 Dirty:            561032 kB
159秒 Dirty:            664164 kB
160秒 Dirty:            765824 kB
161秒 Dirty:            872884 kB
162秒 Dirty:             68628 kB
163秒 Dirty:               512 kB
164秒 Dirty:               512 kB
165秒 Dirty:               512 kB
166秒 Dirty:               512 kB
167秒 Dirty:               512 kB
168秒 Dirty:               512 kB
169秒 Dirty:              1024 kB
170秒 Dirty:              1024 kB
171秒 Dirty:              1024 kB
172秒 Dirty:              1024 kB
173秒 Dirty:             26204 kB
174秒 Dirty:            113056 kB
175秒 Dirty:            224912 kB
176秒 Dirty:            326892 kB
177秒 Dirty:            427164 kB
178秒 Dirty:            537120 kB
179秒 Dirty:            648792 kB
180秒 Dirty:            749784 kB
181秒 Dirty:            830616 kB
182秒 Dirty:            929560 kB
183秒 Dirty:           1034288 kB
184秒 Dirty:           1142732 kB
185秒 Dirty:           1246524 kB
186秒 Dirty:           1352532 kB
187秒 Dirty:           1454024 kB
188秒 Dirty:           1534388 kB
189秒 Dirty:           1537108 kB
190秒 Dirty:           1534560 kB
191秒 Dirty:           1534380 kB
192秒 Dirty:           1532464 kB
193秒 Dirty:           1039688 kB
194秒 Dirty:           1039688 kB
195秒 Dirty:           1039688 kB
196秒 Dirty:           1039688 kB
197秒 Dirty:           1039688 kB
198秒 Dirty:            757692 kB
199秒 Dirty:            757852 kB
200秒 Dirty:            757852 kB
201秒 Dirty:            757852 kB
202秒 Dirty:            473300 kB
203秒 Dirty:            473196 kB
204秒 Dirty:            493288 kB
205秒 Dirty:            516460 kB
206秒 Dirty:            581548 kB
207秒 Dirty:            333596 kB
208秒 Dirty:               512 kB
209秒 Dirty:               512 kB
210秒 Dirty:               512 kB
211秒 Dirty:               512 kB
212秒 Dirty:               512 kB
213秒 Dirty:              7672 kB
214秒 Dirty:             29592 kB

real    3m33.887s            ←レガシースナップショットのときより約半分の時間でコピーが完了した!
user    0m0.106s
sys     0m15.413s

215秒 Dirty:             58496 kB
216秒 Dirty:             58496 kB
217秒 Dirty:             58496 kB
218秒 Dirty:             58496 kB
219秒 Dirty:             58496 kB
220秒 Dirty:             58496 kB

221秒 Dirty:             58496 kB
222秒 Dirty:             58496 kB
223秒 Dirty:             58496 kB
224秒 Dirty:             58496 kB
225秒 Dirty:             58496 kB
226秒 Dirty:             58496 kB
227秒 Dirty:             58496 kB
228秒 Dirty:             58496 kB
229秒 Dirty:             58496 kB
230秒 Dirty:             58496 kB
231秒 Dirty:             58496 kB
232秒 Dirty:             58496 kB
233秒 Dirty:             58496 kB
234秒 Dirty:             58496 kB
235秒 Dirty:             58496 kB
236秒 Dirty:             58496 kB
237秒 Dirty:             58496 kB
238秒 Dirty:                48 kB
239秒 Dirty:                 0 kB
240秒 Dirty:                 0 kB
241秒 Dirty:                 0 kB
242秒 Dirty:                 0 kB

----(略)----

597秒 Dirty:                 0 kB
598秒 Dirty:                 0 kB
599秒 Dirty:                 0 kB
600秒 Dirty:                 0 kB

[1]-  終了                  { time cp -i /thinlv_1/hoge /thinlv_1/hoge2; }
[2]+  終了                  { for ((i=1; i<=600; i++))
do
    printf "${i}秒 "; grep --color=auto Dirty /proc/meminfo; sleep 1;
done; }

# lvchange -ay -K src/thin_snap1
# mount -o nouuid /dev/src/thin_snap1 /thin_snap1
# ls -l /thinlv_1/

合計 20480012
drwxr-xr-x. 25 root root        4096  9月 14 20:41 1
-rw-r--r--.  1 root root 10485760000  9月 16 05:57 hoge
-rw-r--r--.  1 root root 10485760000  9月 16 06:10 hoge2

# ls -l /thin_snap1
合計 11288520
drwxr-xr-x. 25 root root        4096  9月 14 20:41 1
-rw-r--r--.  1 root root 10485760000  9月 16 05:57 hoge
-rw-r--r--.  1 root root   996802560  9月 16 06:07 hoge2

 

【結果】

■ddコマンドでソースボリュームに10GBの書き込む速度

・スナップショットが無いときのソースボリュームへの書き込み速度は、リニアボリュームの方がシンボリュームより約1.5倍速かった

・レガシースナップショットが有る場合のリニアソースボリュームへの書き込みは大幅に遅くなった(約6倍)

一方、シンスナップショットがある場合のシンソースボリュームへの書き込みは無いときとほとんど変わらなかった。

■cpコマンドでソースボリューム上の10GBを同じソースボリューム上にコピーする速度

・スナップショットが無いときのソースボリュームへの書き込み速度は、リニアボリュームの方がシンボリュームより約1.7倍速かった

・レガシースナップショットが有る場合のリニアソースボリュームへの書き込みは無いときより約7倍遅かった。

一方、シンスナップショットがある場合のシンソースボリュームへの書き込みは無いときより約1.3倍遅かった。

 

【わかったこと】

■スナップショットの有無とソースボリューム書き込み速度劣化の関係

・リニアボリュームの方がシンボリュームより書き込み速度は速い(2倍まではいかない)

・リニアボリュームはスナップショットがあるときの書き込み速度は無いときよりもかなり遅くなる(6倍とか7倍とか)

・シンボリュームはスナップショットがあっても書き込み速度はリニアボリュームほど遅くならない(2倍までいかない)

■スナップショット取得時間

・リニアソースボリュームもシンソースボリュームも連続でデータ書き込み中のスナップショット取得は数秒~数十秒かかる場合がある。(連続データ書き込み中でなければ1秒未満)

■スナップショット取得時の静止点

リニアソースボリュームもシンボリュームも連続でデータ書き込み中にスナップショット取得すると書き込み中データはDirtyキャッシュ反映はされるが書き込み途中のファイルの断面が取得されるので壊れる。

 

■ddコマンドでファイルにzeroを10GB分流し込んでる最中にとったスナップショットはどうなる?

 

# lvs
  LV              VG  Attr       LSize   Pool          Origin     Data%  Meta%  Move Log Cpy%Sync Convert
  home            cl  -wi-ao---- 173.87g
  root            cl  -wi-ao----  50.00g
  swap            cl  -wi-ao----   7.81g
  1TBthin_snap1   dst Vwi---tz-k   2.00t big_thinpool  dst_thinlv
  big_thinpool    dst twi-aotz--   2.44t                          40.30  20.04
  dst_thinlv      dst Vwi-a-tz--   2.00t big_thinpool             49.20
  testlv_bk       dst -wi-ao---- 200.00g
  src_2TB_linerlv src -wi-a-----   2.00t
  test_thinpool   src twi-aotz-- 200.00g                          26.92  20.84
  testlv          src -wi-a----- 200.00g             ←これをソースボリュームにしてレガシースナップショット(legacy_snap)をつくる
  thin_snap3      src Vwi-aotz-k 200.00g test_thinpool thinlv_1   26.04
  thinlv_1        src Vwi-aotz-- 200.00g test_thinpool            26.04

 

・試し打ち

# time dd if=/dev/zero of=/testlv/hoge count=10000 bs=1024k
10000+0 レコード入力
10000+0 レコード出力
10485760000 バイト (10 GB) コピーされました、 40.6482 秒、 258 MB/秒
real    0m40.811s  ←40秒かかるお
user    0m0.003s
sys     0m6.123s

# wc -c /testlv/hoge
10485760000 /testlv/hoge  ←0の数いっぱい
# dd if=/dev/zero of=/testlv/hoge count=10000 bs=1024k &    \

 { sleep 3;time lvcreate -s -L 10g -n legacy_snap src/testlv; }
[1] 3010
  Using default stripesize 64.00 KiB.
  WARNING: Sum of all thin volume sizes (400.00 GiB) exceeds the size of thin pools and the amount of free space in volume group (336.37 GiB)!
  For thin pool auto extension activation/thin_pool_autoextend_threshold should be below 100.
  Logical volume "legacy_snap" created.
real    0m13.252s        ←ddで流し込み始めてから3秒スリープしてそのあと13秒後にスナップショットの作成が完了しただと?
user    0m0.009s
sys     0m0.093s


# wc -c /testlv/hoge
5546967040 /testlv/hoge       ←まだ100億文字書き込まれてないぷに
# ls -lh /testlv/hoge
-rw-r--r--. 1 root root 6.1G  9月 14 23:48 /testlv/hoge       ←まだ未完成

 

----(時が流れた)----
# 10000+0 レコード入力
10000+0 レコード出力
10485760000 バイト (10 GB) コピーされました、 239.107 秒、 43.9 MB/秒   ←さっきより6倍も時間かかってる!


[1]+  終了                  dd if=/dev/zero of=/testlv/hoge count=10000 bs=1024k

 

# lvs

  LV              VG  Attr       LSize   Pool          Origin     Data%  Meta%  Move Log Cpy%Sync Convert
  home            cl  -wi-ao---- 173.87g
  root            cl  -wi-ao----  50.00g
  swap            cl  -wi-ao----   7.81g
  1TBthin_snap1   dst Vwi---tz-k   2.00t big_thinpool  dst_thinlv
  big_thinpool    dst twi-aotz--   2.44t                          40.30  20.04
  dst_thinlv      dst Vwi-a-tz--   2.00t big_thinpool             49.20
  testlv_bk       dst -wi-ao---- 200.00g
  legacy_snap     src swi-a-s---  10.00g               testlv     65.83
  src_2TB_linerlv src -wi-a-----   2.00t
  test_thinpool   src twi-aotz-- 200.00g                          26.92  20.84
  testlv          src owi-aos--- 200.00g
  thin_snap3      src Vwi-aotz-k 200.00g test_thinpool thinlv_1   26.04
  thinlv_1        src Vwi-aotz-- 200.00g test_thinpool            26.04


・dd書き込み中に取得したスナップショットをマウントして中身を見るぷに。
# mkdir /legacy_snap/
# mount -o nouuid /dev/src/legacy_snap /legacy_snap/
# ll /legacy_snap/ -h

合計 4.0G
drwxr-xr-x. 25 root root 4.0K  9月  7 04:59 1
-rw-r--r--.  1 root root 2.7G  9月 14 23:46 hoge     ←静止点作ってないやんけw

# wc -c /legacy_snap/hoge
2799697920 /legacy_snap/hoge                ←約28億個のところで止まってるw

 

LVMスナップショットは静止点を作らない!

 

■xfs_freezeと合わせてやったらどうなるか?

 

# umount /legacy_snap/
# lvremove src/legacy_snap

Do you really want to remove active logical volume src/legacy_snap? [y/n]: y
  Logical volume "legacy_snap" successfully removed

# dd if=/dev/zero of=/testlv/hoge count=10000 bs=1024k & \
> { sleep 3;xfs_freeze -f /testlv;time lvcreate -s -L 10g -n legacy_snap src/testlv; }

[1] 3161
  Using default stripesize 64.00 KiB.
  WARNING: Sum of all thin volume sizes (400.00 GiB) exceeds the size of thin pools and the amount of free space in volume group (336.37 GiB)!
  For thin pool auto extension activation/thin_pool_autoextend_threshold should be below 100.
  device-mapper: suspend ioctl on (253:5) failed: デバイスもしくはリソースがビジー状態です
  Unable to suspend src-testlv (253:5)
  Failed to lock logical volume src/testlv.
  Aborting. Manual intervention required.
  Releasing activation in critical section.
  libdevmapper exiting with 1 device(s) still suspended.


real    0m0.129s
user    0m0.010s
sys     0m0.039s

# echo $?
5

# lvs
  WARNING: Reading VG src from disk because lvmetad metadata is invalid.
  LV              VG  Attr       LSize   Pool          Origin     Data%  Meta%  Move Log Cpy%Sync Convert
  home            cl  -wi-ao---- 173.87g
  root            cl  -wi-ao----  50.00g
  swap            cl  -wi-ao----   7.81g
  1TBthin_snap1   dst Vwi---tz-k   2.00t big_thinpool  dst_thinlv
  big_thinpool    dst twi-aotz--   2.44t                          40.30  20.04
  dst_thinlv      dst Vwi-a-tz--   2.00t big_thinpool             49.20
  testlv_bk       dst -wi-ao---- 200.00g
  legacy_snap     src -wi-i-----  10.00g          ←つくられてるけどactiveになってないし
originがtestlvになってないンゴ。
  src_2TB_linerlv src -wi-a-----   2.00t
  test_thinpool   src twi-aotz-- 200.00g                          26.92  20.84
  testlv          src -wi-ao---- 200.00g
  thin_snap3      src Vwi-aotz-k 200.00g test_thinpool thinlv_1   26.04
  thinlv_1        src Vwi-aotz-- 200.00g test_thinpool            26.04

# ll /testlv/
合計 4194244
drwxr-xr-x. 25 root root       4096  9月  7 04:59 1
-rw-r--r--.  1 root root 2637168640  9月 15 00:16 hoge

----(10秒待つ)----
# ll /testlv/
合計 4194244
drwxr-xr-x. 25 root root       4096  9月  7 04:59 1
-rw-r--r--.  1 root root 2637168640  9月 15 00:16 hoge

→さてはフリーズしてるな。

# lvchange -ay src/legacy_snap
^C

→終了しなかったので強制終了

# lvs -a src/legacy_snap
  LV          VG  Attr          LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  legacy_snap src -wi-ao---- 10.00g

→無理やりactiveになったwけど、依然originがtestlvになってないぷに。

# ll /dev/src/legacy_snap
ls: /dev/src/legacy_snap にアクセスできません: そのようなファイルやディレクトリはありません

→やはりOSに認識されてないぷに。

 

・ここでxfs_freeze解除

# xfs_freeze -u /testlv;sleep 3;ls -l /testlv
合計 6245380
drwxr-xr-x. 25 root root       4096  9月  7 04:59 1
-rw-r--r--.  1 root root 5442699264  9月 15 00:31 hoge

----(5秒待つ)----
# ls -l /testlv
合計 10439684
drwxr-xr-x. 25 root root        4096  9月  7 04:59 1
-rw-r--r--.  1 root root 10191540224  9月 15 00:31 hoge

→ddコマンドがいごきだした!

----(しばし待つ)----

# 10000+0 レコード入力
10000+0 レコード出力
10485760000 バイト (10 GB) コピーされました、 924.762 秒、 11.3 MB/秒

# lvs
  LV              VG  Attr       LSize   Pool          Origin     Data%  Meta%  Move Log Cpy%Sync Convert
  home            cl  -wi-ao---- 173.87g
  root            cl  -wi-ao----  50.00g
  swap            cl  -wi-ao----   7.81g
  1TBthin_snap1   dst Vwi---tz-k   2.00t big_thinpool  dst_thinlv
  big_thinpool    dst twi-aotz--   2.44t                          40.30  20.04
  dst_thinlv      dst Vwi-a-tz--   2.00t big_thinpool             49.20
  testlv_bk       dst -wi-ao---- 200.00g
  legacy_snap     src -wi-ao----  10.00g
  src_2TB_linerlv src -wi-a-----   2.00t
  test_thinpool   src twi-aotz-- 200.00g                          26.92  20.84
  testlv          src -wi-ao---- 200.00g
  thin_snap3      src Vwi-aotz-k 200.00g test_thinpool thinlv_1   26.04
  thinlv_1        src Vwi-aotz-- 200.00g test_thinpool            26.04

# lvchange -ay /dev/src/legacy_snap
# lvs -a src/legacy_snap

  LV          VG  Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  legacy_snap src -wi-ao---- 10.00g

# mount -o uuid /dev/src/legacy_snap /legacy_snap
mount: special device /dev/src/legacy_snap does not exist

# mount | grep legacy_snap
# lvremove src/legacy_snap

  Logical volume src/legacy_snap in use.

# lvchange -an src/legacy_snap
  Logical volume src/legacy_snap in use.
# lvs -a src/legacy_snap
  LV          VG  Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  legacy_snap src -wi-ao---- 10.00g

→どうやら/dev/src/legacy_snapはお亡くなりになったみたいw

とりあえずシステムリブートしてみる

# systemctl reboot

# lvs
  LV              VG  Attr       LSize   Pool          Origin     Data%  Meta%  Move Log Cpy%Sync Convert
  home            cl  -wi-ao---- 173.87g
  root            cl  -wi-ao----  50.00g
  swap            cl  -wi-ao----   7.81g
  1TBthin_snap1   dst Vwi---tz-k   2.00t big_thinpool  dst_thinlv
  big_thinpool    dst twi-aotz--   2.44t                          40.30  20.04
  dst_thinlv      dst Vwi-a-tz--   2.00t big_thinpool             49.20
  testlv_bk       dst -wi-a----- 200.00g
  legacy_snap     src -wi-a-----  10.00g
  src_2TB_linerlv src -wi-a-----   2.00t
  test_thinpool   src twi-aotz-- 200.00g                          26.92  20.84
  testlv          src -wi-a----- 200.00g
  thin_snap3      src Vwi---tz-k 200.00g test_thinpool thinlv_1
  thinlv_1        src Vwi-a-tz-- 200.00g test_thinpool            26.04

# lvchange -an src/legacy_snap
# lvs -a src/legacy_snap

  LV          VG  Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  legacy_snap src -wi------- 10.00g

# lvremove src/legacy_snap
  Logical volume "legacy_snap" successfully removed

 

ソースLVをxfs_freezeしてスナップショットを取得しようとするとlvcreateがabort食らって壊れたスナップショットが作られる。

 

■LVMスナップショットは直前にdirtyキャッシュをsyncはしてくれるのか?

 

# mount /dev/src/testlv /testlv
# ll /testlv

合計 10240004
drwxr-xr-x. 25 root root        4096  9月  7 04:59 1
-rw-r--r--.  1 root root 10485760000  9月 15 00:31 hoge

 

・試し打ち

10GBのファイルをコピーした場合、Dirtyキャッシュは何秒でディスクに全部書き込まれるか?

 ※7200回転キャッシュ256MBのSATAディスク

# { time cp /testlv/hoge /testlv/hoge2; };for ((i=1;i<=40;i++));do printf "${i}秒 ";grep Dirty /proc/meminfo;sleep 1;done
real    0m59.639s
user    0m0.038s
sys     0m8.834s

1秒 Dirty:           2657980 kB
2秒 Dirty:           2592464 kB
3秒 Dirty:           2461380 kB
4秒 Dirty:           2272884 kB
5秒 Dirty:           2133832 kB
6秒 Dirty:           2068144 kB
7秒 Dirty:           1936912 kB
8秒 Dirty:           1805980 kB
9秒 Dirty:           1674972 kB
10秒 Dirty:           1543960 kB
11秒 Dirty:           1543740 kB
12秒 Dirty:           1543740 kB
13秒 Dirty:           1543740 kB
14秒 Dirty:           1543740 kB
15秒 Dirty:           1543740 kB
16秒 Dirty:           1347120 kB
17秒 Dirty:           1150744 kB
18秒 Dirty:           1084960 kB
19秒 Dirty:            888584 kB
20秒 Dirty:            757280 kB
21秒 Dirty:            691796 kB
22秒 Dirty:            560724 kB
23秒 Dirty:            429568 kB
24秒 Dirty:            232952 kB
25秒 Dirty:            102024 kB
26秒 Dirty:               232 kB
27秒 Dirty:                 8 kB
28秒 Dirty:                 0 kB
29秒 Dirty:                 0 kB
30秒 Dirty:                 0 kB
31秒 Dirty:                 0 kB
32秒 Dirty:                 0 kB
33秒 Dirty:                 0 kB
34秒 Dirty:                 0 kB
35秒 Dirty:                 0 kB
36秒 Dirty:                 0 kB
37秒 Dirty:                 0 kB
38秒 Dirty:                 0 kB
39秒 Dirty:                 0 kB
40秒 Dirty:                 0 kB

→約25秒前後

 

# rm -f /testlv/hoge2

# { time cp /testlv/hoge /testlv/hoge2; } & { for ((i=1;i<=600;i++));do printf "${i}秒 ";grep Dirty /proc/meminfo;sleep 1;done; } & { sleep 10;lvcreate -s -L 20g -n legacy_snap src/testlv; }

[1] 4450
[2] 4451
1秒 Dirty:                 0 kB
2秒 Dirty:            190988 kB
3秒 Dirty:            398244 kB
4秒 Dirty:            592544 kB
5秒 Dirty:            790588 kB
6秒 Dirty:            991244 kB
7秒 Dirty:           1060188 kB
8秒 Dirty:           1253212 kB
9秒 Dirty:           1426084 kB
10秒 Dirty:           1551212 kB
  Using default stripesize 64.00 KiB.     ←レガシースナップショット取得開始
11秒 Dirty:           1688804 kB
12秒 Dirty:           1849412 kB
13秒 Dirty:           1126160 kB
14秒 Dirty:           1126160 kB
15秒 Dirty:           1126160 kB
16秒 Dirty:           1126160 kB
17秒 Dirty:           1075668 kB
18秒 Dirty:                16 kB                   ←syncは発行された臭い
19秒 Dirty:                16 kB
20秒 Dirty:                16 kB
21秒 Dirty:                16 kB
22秒 Dirty:                16 kB
23秒 Dirty:                16 kB
  Logical volume "legacy_snap" created.    ←レガシースナップショット取得完了
# 24秒 Dirty:            115764 kB
25秒 Dirty:            311312 kB
26秒 Dirty:            512052 kB
27秒 Dirty:            710928 kB
28秒 Dirty:           1265748 kB
29秒 Dirty:            362100 kB
30秒 Dirty:               200 kB
31秒 Dirty:              1808 kB
32秒 Dirty:              3268 kB
33秒 Dirty:              4560 kB
34秒 Dirty:              5728 kB
35秒 Dirty:              6644 kB
36秒 Dirty:              7572 kB
37秒 Dirty:              8156 kB
38秒 Dirty:              8920 kB
39秒 Dirty:              9488 kB
40秒 Dirty:             10072 kB
41秒 Dirty:             10656 kB
42秒 Dirty:             10988 kB
43秒 Dirty:             11464 kB
44秒 Dirty:             11852 kB
45秒 Dirty:             12136 kB
46秒 Dirty:             12428 kB
47秒 Dirty:             12508 kB
48秒 Dirty:             12508 kB
49秒 Dirty:             12832 kB
50秒 Dirty:             13124 kB
51秒 Dirty:             13504 kB
52秒 Dirty:             14088 kB
53秒 Dirty:             14432 kB
54秒 Dirty:             15104 kB
55秒 Dirty:             15764 kB
56秒 Dirty:             16220 kB
57秒 Dirty:             16880 kB
58秒 Dirty:             17592 kB
59秒 Dirty:             18492 kB
60秒 Dirty:             19880 kB
61秒 Dirty:             22880 kB
62秒 Dirty:             26684 kB
63秒 Dirty:             31652 kB
64秒 Dirty:              4800 kB
65秒 Dirty:             21248 kB
66秒 Dirty:             55220 kB
67秒 Dirty:            104724 kB
68秒 Dirty:            158828 kB
69秒 Dirty:            215452 kB
70秒 Dirty:            273060 kB
71秒 Dirty:            331404 kB
72秒 Dirty:            390240 kB
73秒 Dirty:            450040 kB
74秒 Dirty:            509288 kB
75秒 Dirty:            569588 kB
76秒 Dirty:            630508 kB
77秒 Dirty:            692604 kB
78秒 Dirty:            755432 kB
79秒 Dirty:            805520 kB
80秒 Dirty:            863640 kB
81秒 Dirty:            908864 kB
82秒 Dirty:            950724 kB
83秒 Dirty:            995304 kB
84秒 Dirty:           1034624 kB
85秒 Dirty:           1073128 kB
86秒 Dirty:           1111672 kB
87秒 Dirty:           1151808 kB
88秒 Dirty:           1194112 kB
89秒 Dirty:           1230980 kB
90秒 Dirty:           1247920 kB
91秒 Dirty:           1252444 kB
92秒 Dirty:           1253912 kB
93秒 Dirty:           1257284 kB
94秒 Dirty:            372360 kB
95秒 Dirty:              3100 kB
96秒 Dirty:              8992 kB
97秒 Dirty:             14840 kB
98秒 Dirty:             24252 kB
99秒 Dirty:             37200 kB
100秒 Dirty:             50200 kB
101秒 Dirty:             65792 kB
102秒 Dirty:             82844 kB
103秒 Dirty:             89776 kB
104秒 Dirty:             95188 kB
105秒 Dirty:             99568 kB
106秒 Dirty:            104268 kB
107秒 Dirty:            108232 kB
108秒 Dirty:            111652 kB
109秒 Dirty:            114400 kB
110秒 Dirty:            116444 kB
111秒 Dirty:            117944 kB
112秒 Dirty:            119288 kB
113秒 Dirty:            119988 kB
114秒 Dirty:            120528 kB
115秒 Dirty:            120912 kB
116秒 Dirty:            121456 kB
117秒 Dirty:            121748 kB
118秒 Dirty:            121904 kB
119秒 Dirty:            122160 kB
120秒 Dirty:            122160 kB
121秒 Dirty:            122412 kB
122秒 Dirty:            122412 kB
123秒 Dirty:            122548 kB
124秒 Dirty:            122548 kB
125秒 Dirty:            122656 kB
126秒 Dirty:            122876 kB
127秒 Dirty:            122964 kB
128秒 Dirty:            123228 kB
129秒 Dirty:               188 kB
130秒 Dirty:               992 kB
131秒 Dirty:              1888 kB
132秒 Dirty:              3388 kB
133秒 Dirty:              5068 kB
134秒 Dirty:              7740 kB
135秒 Dirty:             12052 kB
136秒 Dirty:             20904 kB
137秒 Dirty:             39836 kB
138秒 Dirty:             71320 kB
139秒 Dirty:            103828 kB
140秒 Dirty:            136876 kB
141秒 Dirty:            171240 kB
142秒 Dirty:            204852 kB
143秒 Dirty:            238004 kB
144秒 Dirty:            270576 kB
145秒 Dirty:            302324 kB
146秒 Dirty:            333552 kB
147秒 Dirty:            365624 kB
148秒 Dirty:            397012 kB
149秒 Dirty:            427924 kB
150秒 Dirty:            458316 kB

151秒 Dirty:            489392 kB
152秒 Dirty:            519368 kB
153秒 Dirty:            549756 kB
154秒 Dirty:            579168 kB
155秒 Dirty:            609224 kB
156秒 Dirty:            639028 kB
157秒 Dirty:            668080 kB
158秒 Dirty:            697928 kB
159秒 Dirty:            727004 kB
160秒 Dirty:            756148 kB
161秒 Dirty:            785600 kB
162秒 Dirty:            814476 kB
163秒 Dirty:            844520 kB
164秒 Dirty:               100 kB
165秒 Dirty:              4276 kB
166秒 Dirty:              8384 kB
167秒 Dirty:             12344 kB
168秒 Dirty:             16244 kB
169秒 Dirty:             20472 kB
170秒 Dirty:             24124 kB
171秒 Dirty:             27856 kB
172秒 Dirty:             32604 kB
173秒 Dirty:             38648 kB
174秒 Dirty:             46248 kB
175秒 Dirty:             55140 kB
176秒 Dirty:             65344 kB
177秒 Dirty:             77176 kB
178秒 Dirty:             90452 kB
179秒 Dirty:            106184 kB
180秒 Dirty:            123268 kB
181秒 Dirty:            141740 kB
182秒 Dirty:            161028 kB
183秒 Dirty:            182068 kB
184秒 Dirty:            203764 kB
185秒 Dirty:            226672 kB
186秒 Dirty:            250228 kB
187秒 Dirty:            274628 kB
188秒 Dirty:            299580 kB
189秒 Dirty:            325488 kB
190秒 Dirty:            351344 kB
191秒 Dirty:            376668 kB
192秒 Dirty:            401652 kB
193秒 Dirty:            425996 kB
194秒 Dirty:            450544 kB
195秒 Dirty:            476052 kB
196秒 Dirty:            500616 kB
197秒 Dirty:            525348 kB
198秒 Dirty:            549772 kB
199秒 Dirty:               376 kB
200秒 Dirty:              5072 kB
201秒 Dirty:              8888 kB
202秒 Dirty:             13796 kB
203秒 Dirty:             21056 kB
204秒 Dirty:             32904 kB
205秒 Dirty:             52188 kB
206秒 Dirty:             71208 kB
207秒 Dirty:             89604 kB
208秒 Dirty:            108564 kB
209秒 Dirty:            128508 kB
210秒 Dirty:            147480 kB
211秒 Dirty:            170420 kB
212秒 Dirty:            193400 kB
213秒 Dirty:            214732 kB
214秒 Dirty:            238888 kB
215秒 Dirty:            261864 kB
216秒 Dirty:            284804 kB
217秒 Dirty:            293968 kB
218秒 Dirty:            298044 kB
219秒 Dirty:            300672 kB
220秒 Dirty:            302288 kB
221秒 Dirty:            304340 kB
222秒 Dirty:            305872 kB
223秒 Dirty:            306896 kB
224秒 Dirty:            307408 kB
225秒 Dirty:            308868 kB
226秒 Dirty:            310992 kB
227秒 Dirty:            311868 kB
228秒 Dirty:            313040 kB
229秒 Dirty:            313920 kB
230秒 Dirty:            314432 kB
231秒 Dirty:            314872 kB
232秒 Dirty:            315264 kB
233秒 Dirty:            315484 kB
234秒 Dirty:                 0 kB
235秒 Dirty:               260 kB
236秒 Dirty:               216 kB
237秒 Dirty:               368 kB
238秒 Dirty:               368 kB
239秒 Dirty:               464 kB
240秒 Dirty:               464 kB
241秒 Dirty:               568 kB
242秒 Dirty:               568 kB
243秒 Dirty:               712 kB
244秒 Dirty:               712 kB
245秒 Dirty:               868 kB
246秒 Dirty:               868 kB
247秒 Dirty:               964 kB
248秒 Dirty:              1044 kB
249秒 Dirty:              1140 kB
250秒 Dirty:              1252 kB
251秒 Dirty:              1348 kB
252秒 Dirty:              1648 kB
253秒 Dirty:              2160 kB
254秒 Dirty:              2692 kB
255秒 Dirty:              3276 kB
256秒 Dirty:              4220 kB
257秒 Dirty:              5388 kB
258秒 Dirty:              8152 kB
259秒 Dirty:             15456 kB
260秒 Dirty:             35184 kB
261秒 Dirty:             63240 kB
262秒 Dirty:             95060 kB
263秒 Dirty:            125808 kB
264秒 Dirty:            154960 kB
265秒 Dirty:            185064 kB
266秒 Dirty:            212460 kB
267秒 Dirty:            238092 kB
268秒 Dirty:            263628 kB
269秒 Dirty:              2804 kB
270秒 Dirty:             18552 kB
271秒 Dirty:             33024 kB
272秒 Dirty:             47268 kB
273秒 Dirty:             61560 kB
274秒 Dirty:             75220 kB
275秒 Dirty:             90096 kB
276秒 Dirty:            105116 kB
277秒 Dirty:            120268 kB
278秒 Dirty:            136664 kB
279秒 Dirty:            154112 kB
280秒 Dirty:            172376 kB
281秒 Dirty:            190844 kB
282秒 Dirty:            209636 kB
283秒 Dirty:            229120 kB
284秒 Dirty:            251000 kB
285秒 Dirty:            271872 kB
286秒 Dirty:            293284 kB
287秒 Dirty:            313600 kB
288秒 Dirty:            336248 kB
289秒 Dirty:            357624 kB
290秒 Dirty:            378624 kB
291秒 Dirty:            398336 kB
292秒 Dirty:            421376 kB
293秒 Dirty:            442744 kB
294秒 Dirty:            464384 kB
295秒 Dirty:            485880 kB
296秒 Dirty:            507136 kB
297秒 Dirty:            528448 kB
298秒 Dirty:            549888 kB
299秒 Dirty:            571392 kB
300秒 Dirty:            592632 kB
301秒 Dirty:            614656 kB
302秒 Dirty:            636928 kB
303秒 Dirty:            658936 kB
304秒 Dirty:            152328 kB
305秒 Dirty:              1920 kB
306秒 Dirty:              4892 kB
307秒 Dirty:              7776 kB
308秒 Dirty:             10592 kB
309秒 Dirty:             13920 kB
310秒 Dirty:             18016 kB
311秒 Dirty:             23652 kB
312秒 Dirty:             35488 kB
313秒 Dirty:             50756 kB
314秒 Dirty:             71912 kB
315秒 Dirty:             97580 kB
316秒 Dirty:            122856 kB
317秒 Dirty:            152040 kB
318秒 Dirty:            180676 kB
319秒 Dirty:            210408 kB
320秒 Dirty:            237800 kB
321秒 Dirty:            264276 kB
322秒 Dirty:            289724 kB
323秒 Dirty:            315224 kB
324秒 Dirty:            341148 kB
325秒 Dirty:            367184 kB
326秒 Dirty:            392680 kB
327秒 Dirty:            417512 kB
328秒 Dirty:            439488 kB
329秒 Dirty:            464396 kB
330秒 Dirty:            487432 kB
331秒 Dirty:            508180 kB
332秒 Dirty:            532624 kB
333秒 Dirty:            555240 kB
334秒 Dirty:            577768 kB
335秒 Dirty:            600296 kB
336秒 Dirty:            622824 kB
337秒 Dirty:            645608 kB
338秒 Dirty:            665976 kB
339秒 Dirty:            177552 kB
340秒 Dirty:              3488 kB
341秒 Dirty:              7072 kB
342秒 Dirty:             10144 kB
343秒 Dirty:             13216 kB
344秒 Dirty:             14752 kB
345秒 Dirty:             16800 kB
346秒 Dirty:             17984 kB
347秒 Dirty:             19360 kB
348秒 Dirty:             20384 kB
349秒 Dirty:             21920 kB
350秒 Dirty:             22848 kB
351秒 Dirty:             23456 kB
352秒 Dirty:             23968 kB
353秒 Dirty:             24448 kB
354秒 Dirty:             24736 kB
355秒 Dirty:             24960 kB
356秒 Dirty:             25176 kB
357秒 Dirty:             25300 kB
358秒 Dirty:             25388 kB
359秒 Dirty:             25452 kB
360秒 Dirty:             25504 kB
361秒 Dirty:             25552 kB
362秒 Dirty:             25584 kB
363秒 Dirty:             25604 kB
364秒 Dirty:             25620 kB
365秒 Dirty:             25644 kB
366秒 Dirty:             25664 kB
367秒 Dirty:             25680 kB
368秒 Dirty:             25700 kB
369秒 Dirty:             25724 kB
370秒 Dirty:             25740 kB
371秒 Dirty:             25760 kB
372秒 Dirty:             25784 kB
373秒 Dirty:             25784 kB
374秒 Dirty:             25824 kB
375秒 Dirty:               112 kB
376秒 Dirty:                36 kB
377秒 Dirty:                36 kB
378秒 Dirty:                80 kB
379秒 Dirty:                80 kB
380秒 Dirty:               128 kB
381秒 Dirty:               128 kB
382秒 Dirty:               184 kB
383秒 Dirty:               184 kB
384秒 Dirty:               232 kB
385秒 Dirty:               260 kB
386秒 Dirty:               300 kB
387秒 Dirty:               332 kB
388秒 Dirty:               404 kB
389秒 Dirty:               404 kB
390秒 Dirty:               592 kB
391秒 Dirty:               592 kB
392秒 Dirty:               880 kB
393秒 Dirty:               880 kB
394秒 Dirty:              1380 kB
395秒 Dirty:              1672 kB
396秒 Dirty:              2564 kB
397秒 Dirty:              4024 kB
398秒 Dirty:              7696 kB
399秒 Dirty:             27932 kB
400秒 Dirty:             70844 kB
401秒 Dirty:            124320 kB
402秒 Dirty:            180068 kB
403秒 Dirty:            224444 kB
404秒 Dirty:            262728 kB
405秒 Dirty:            297564 kB
406秒 Dirty:            329636 kB
407秒 Dirty:            362684 kB
408秒 Dirty:            391684 kB
409秒 Dirty:            423384 kB
410秒 Dirty:              7076 kB
411秒 Dirty:             19860 kB
412秒 Dirty:             31584 kB
413秒 Dirty:             43264 kB
414秒 Dirty:             55244 kB
415秒 Dirty:             67868 kB
416秒 Dirty:             80652 kB
417秒 Dirty:             94452 kB
418秒 Dirty:            107516 kB
419秒 Dirty:            123648 kB
420秒 Dirty:            138988 kB
421秒 Dirty:            155748 kB
422秒 Dirty:            173496 kB
423秒 Dirty:            190892 kB
424秒 Dirty:            208112 kB
425秒 Dirty:            230068 kB
426秒 Dirty:            250112 kB
427秒 Dirty:            269972 kB
428秒 Dirty:            290360 kB
429秒 Dirty:            309248 kB
430秒 Dirty:            332404 kB
431秒 Dirty:            354036 kB
432秒 Dirty:            376396 kB
433秒 Dirty:            398460 kB
434秒 Dirty:            420124 kB
435秒 Dirty:            442924 kB
436秒 Dirty:            463792 kB
437秒 Dirty:            487028 kB
438秒 Dirty:            508592 kB
439秒 Dirty:            530316 kB
440秒 Dirty:            551000 kB

real    7m20.883s              ←スナップショットを取得してない時と比べて7倍以上時間がかかった
user    0m0.069s
sys     0m13.287s

441秒 Dirty:            565832 kB
442秒 Dirty:            565832 kB
443秒 Dirty:            565824 kB
444秒 Dirty:            565824 kB
445秒 Dirty:            565824 kB
446秒 Dirty:             82460 kB
447秒 Dirty:                 0 kB
448秒 Dirty:                 0 kB
449秒 Dirty:                 0 kB
450秒 Dirty:                 0 kB
451秒 Dirty:                 0 kB
----(略)----
598秒 Dirty:                 0 kB
599秒 Dirty:                 0 kB
600秒 Dirty:                 0 kB

[1]-  終了                  { time cp -i /testlv/hoge /testlv/hoge2; }

[2]+  終了                  { for ((i=1; i<=600; i++))
do
    printf "${i}秒 "; grep --color=auto Dirty /proc/meminfo; sleep 1;
done; }

→スナップショットを構成してる状態だとソースボリュームへの書き込み速度が極端に遅くなる。

→リニアソースボリュームに連続でデータ書き込み中のスナップショット取得は数秒~数十秒かかる場合がある。

# mount -o nouuid /dev/src/legacy_snap /legacy_snap/
# ll /legacy_snap

合計 14434244
drwxr-xr-x. 25 root root        4096  9月  7 04:59 1
-rw-r--r--.  1 root root 10485760000  9月 15 00:31 hoge
-rw-r--r--.  1 root root  2175139840  9月 16 04:32 hoge2

# ll /testlv
合計 20480004
drwxr-xr-x. 25 root root        4096  9月  7 04:59 1
-rw-r--r--.  1 root root 10485760000  9月 15 00:31 hoge
-rw-r--r--.  1 root root 10485760000  9月 15 01:33 hoge2

 

cpコマンドが書き込み中にlvcreate -sコマンドでスナップショットを作成した場合、書き込み中のファイルは壊れるが、スナップショット作成の瞬間にはsyncを発行してDirtyキャッシュをディスクに書き込んで"静止点"を生成した上でスナップショットを作成する。

(この場合の静止点はスナップショット作成の瞬間はディスクとページキャッシュの間で差分が無い状態。ただしその瞬間に書き込み中だったファイルがあった場合は書き込んでる最中の中途半端なファイルを「断面」として取得する。すなわちそのファイルに関しては壊れるw)

 

【わかったこと】

LVMスナップショットで「健全な」バックアップを取得するためには、lvcreate -sコマンドを発行してスナップショットを取る時点でアプリケーション側でも「静止点」を取得している必要がある。

※上記のアプリケーション側の「静止点」とは、スナップショット(断面)を取得する直前で個々のファイルおよびファイル相互の整合性が取れた状態(ファイルサーバで言えばファイルが書き込み中でない状態、DBで言えば左記に加えてトランザクションのコミット取得時点のデータの状態)のことを指している。LVMスナップショットでつくられる静止点はページキャッシュとディスクの差分(=Dirtyキャッシュ)がない状態のことを指す。

 

【課題】

アプリケーション(ミドルウェア)側で静止点をつくるのが面倒なら、たとえばデータをNFSサーバ領域においてる場合、バックアップユーザがスナップショットを取得する数秒間だけ、exportしてる領域へのアクセス権もしくはNFSサーバ自体をgracefulに停止して、仕掛中の書き込み以後を禁止する「静止点」をつくることはできないか?(ただしDBトランザクションの静止点としてはまだ不十分)

アプリケーション(ミドルウェア)側のNFSクライアントはNFSアクセスが再開するまで永久リトライするので(デフォルト)数秒間だけNFSクライアントのwriteを禁止しても目に見えるようなシステムの中断は顕在化しないのではないか。

あるいは、バックアッププログラムはLVMスナップショットを取得する直前でNFS領域の監視して最後のアクセスが無くなるまで待って(lsofやfuserで確認可)からNFSへのアクセスを数秒間停止してさくっとスナップショットを取得できないだろうか?

あるいは、ファイル書き込み途中の可能性があっても構わずスナップショットをとって、バックアップ書き込み終了後にスナップショット取得時刻以降にもう一回仕上げのrsyncを実行するとか。

 

 

実データはCOWで後から書き込まれるのでスナップショット作成時にはメタデータが書き換わるだけなんだからソースボリュームがたとえ1TBであってもスナップショット取得時間自体は一瞬ではないか?

 

# df -h
ファイルシス                        サイズ  使用  残り 使用% マウント位置
----(略)----
/dev/mapper/src-src_2TB_linerlv   2.0T  507G  1.6T   25% /src_2TB_linerlv
/dev/mapper/dst-dst_2TB_linerlv   2.0T  302G  1.8T   15% /dst_2TB_linerlv
----(略)----

・/src_2TB_linerlvのサイズを1TBくらいにする。

# time cp -rp /dst_2TB_linerlv/* /src_2TB_linerlv/dst_copy/
real    38m3.881s       ←302GBのcpに約38分
user    0m8.055s
sys     7m11.233s

# df -h
ファイルシス                            サイズ  使用  残り 使用% マウント位置
----(略)----
/dev/mapper/src-src_2TB_linerlv   2.0T  808G  1.3T   40% /src_2TB_linerlv
/dev/mapper/dst-dst_2TB_linerlv   2.0T  302G  1.8T   15% /dst_2TB_linerlv
----(略)----

/src_2TB_linerlvにゴミをさらにいっぱいコピーして/src_2TB_linerlvのサイズを約1TBにした。

# df -h /src_2TB_linerlv/dst_copy/
ファイルシス                        サイズ  使用  残り 使用% マウント位置
/dev/mapper/src-src_2TB_linerlv   2.0T  999G  1.1T   49% /src_2TB_linerlv

 

1.ソースリニアボリュームからレガシースナップショット取得時間

# lvs
  LV                VG  Attr       LSize   Pool          Origin   Data%  Meta%  Move Log Cpy%Sync Convert
  home             cl  -wi-ao---- 173.87g
  root              cl  -wi-ao----  50.00g
  swap             cl  -wi-ao----   7.81g
  dst_2TB_linerlv dst -wi-ao----   2.00t
  testlv_bk        dst -wi-a-----  30.00g
  src_2TB_linerlv src -wi-ao----   2.00t       ←ここに約1TBのデータが居るのでレガシースナップショットを作成して時間を測る
  test_thinpool    src twi-aotz--  10.00g                        0.10   0.72
  testlv            src ori-ao---- 200.00g
  thin_snap        src Vwi-a-tz-k   5.00g test_thinpool thinlv_1 0.00
  thin_snap2      src Vwi-a-tz-- 200.00g test_thinpool testlv   0.00
  thinlv_1         src Vwi-a-tz--   5.00g test_thinpool          0.21

 

・レガシースナップショットボリューム作成

# time lvcreate -s -L 1g -n 1TBlegacy_snap1 src/src_2TB_linerlv
  Using default stripesize 64.00 KiB.
  WARNING: Sum of all thin volume sizes (210.00 GiB) exceeds the size of thin pools (10.00 GiB)!
  For thin pool auto extension activation/thin_pool_autoextend_threshold should be below 100.
  Logical volume "1TBlegacy_snap1" created.
real    0m0.528s
user    0m0.020s
sys     0m0.052s

# time { echo y | lvremove src/1TBlegacy_snap1; }
Do you really want to remove active logical volume src/1TBlegacy_snap1? [y/n]:   Logical volume "1TBlegacy_snap1" successfully removed
real    0m0.151s
user    0m0.014s
sys     0m0.018s

# time lvcreate -s -L 100g -n 1TBlegacy_snap1 src/src_2TB_linerlv
----(略)----
real    0m0.319s
user    0m0.018s
sys     0m0.033s

# time { echo y | lvremove src/1TBlegacy_snap1; }
Do you really want to remove active logical volume src/1TBlegacy_snap1? [y/n]:   Logical volume "1TBlegacy_snap1" successfully removed
real    0m0.158s
user    0m0.012s
sys     0m0.020s

→一瞬でした。

 

2.ソースシンボリュームからシンスナップショット取得時間 

・/dev/dst/dst_2TB_linerlvレガシーボリュームを一旦削除して/dev/dstボリュームグループにシンプール(big_thinpool)とシンソースボリューム(dst_2TB_thinlv)を作成してここに1TBのファイルをコピーする。

# umount /dst_2TB_linerlv/

# time { echo y | lvremove dst/dst_2TB_linerlv; }
Do you really want to remove active logical volume dst/dst_2TB_linerlv? [y/n]:   Logical volume "dst_2TB_linerlv" successfully removed
real    0m0.094s
user    0m0.008s
sys     0m0.020s

 

・シンプール作成

# time lvcreate -L 2500g -T dst/big_thinpool
  Using default stripesize 64.00 KiB.
  Logical volume "big_thinpool" created.
real    0m0.281s
user    0m0.017s
sys     0m0.047s

 

・シンソースボリューム作成

# time lvcreate -T dst/big_thinpool -V 2t -n dst_thinlv
  Using default stripesize 64.00 KiB.
  Logical volume "dst_thinlv" created.
real    0m0.390s
user    0m0.035s
sys     0m0.045s

# lvs
  LV              VG  Attr         LSize   Pool          Origin   Data%  Meta%  Move Log Cpy%Sync Convert
  home            cl  -wi-ao---- 173.87g
  root            cl  -wi-ao----  50.00g
  swap            cl  -wi-ao----   7.81g
  big_thinpool    dst twi-aotz--   2.44t                           0.00   0.43
  dst_thinlv      dst Vwi-a-tz--   2.00t  big_thinpool            0.00
  testlv_bk       dst -wi-a-----  30.00g
  src_2TB_linerlv src -wi-ao----   2.00t
  test_thinpool   src twi-aotz--  10.00g                          0.10   0.72
  testlv          src ori-ao---- 200.00g 
  thin_snap       src Vwi-a-tz-k   5.00g test_thinpool thinlv_1 0.00
  thin_snap2      src Vwi-a-tz-- 200.00g test_thinpool testlv   0.00
  thinlv_1        src Vwi-a-tz--   5.00g test_thinpool            0.21

# mkfs.xfs /dev/dst/dst_thinlv

# mount /dev/dst/dst_thinlv /dst_thinlv
# df -h

ファイルシス                        サイズ  使用  残り 使用% マウント位置
/dev/mapper/cl-root                 50G   12G   39G   24% /
devtmpfs                              7.7G     0  7.7G    0% /dev
tmpfs                                  7.8G     0  7.8G    0% /dev/shm
tmpfs                                  7.8G  8.6M  7.7G    1% /run
tmpfs                                  7.8G     0  7.8G    0% /sys/fs/cgroup
/dev/sda2                           1014M  132M  883M   13% /boot
/dev/sda1                            200M  9.5M  191M    5% /boot/efi
/dev/mapper/cl-home                174G   33M  174G    1% /home
/dev/mapper/src-src_2TB_linerlv   2.0T  999G  1.1T   49% /src_2TB_linerlv
tmpfs                                  1.6G     0  1.6G    0% /run/user/0
/dev/mapper/src-testlv             200G   56G  145G   28% /src
/dev/mapper/dst-dst_thinlv         2.0T   34M  2.0T    1% /dst_thinlv

 

・それぞれ異なる物理ディスク上にあるリニアボリュームからシンボリュームへ約1TBのコピー

# time cp -rp /src_2TB_linerlv/* /dst_thinlv

real    301m51.301s
user    0m34.505s
sys     26m26.723s

※7200回転のHDDで約5時間もかかった

# lvs

  LV               VG  Attr         LSize        Pool        Origin   Data%  Meta%  Move Log Cpy%Sync Convert
  home             cl  -wi-ao---- 173.87g
  root              cl  -wi-ao----  50.00g
  swap              cl  -wi-ao----   7.81g
  big_thinpool     dst twi-aotz--    2.44t                           40.30  20.02
  dst_thinlv        dst Vwi-aotz--    2.00t big_thinpool             49.20
  testlv_bk        dst -wi-a-----  30.00g
  src_2TB_linerlv src -wi-ao----    2.00t
  test_thinpool    src twi-aotz--   10.00g                           0.10    0.72
  testlv            src ori-ao---- 200.00g
  thin_snap        src Vwi-a-tz-k    5.00g test_thinpool thinlv_1  0.00
  thin_snap2       src Vwi-a-tz-- 200.00g test_thinpool testlv    0.00
  thinlv_1          src Vwi-a-tz--   5.00g test_thinpool            0.21

# df -h

ファイルシス                        サイズ  使用    残り 使用%  マウント位置
----(略)----
/dev/mapper/src-src_2TB_linerlv   2.0T  999G   1.1T   49%  /src_2TB_linerlv
tmpfs                                    1.6G      0   1.6G    0%  /run/user/0
/dev/mapper/src-testlv             200G    56G  145G   28%  /src
/dev/mapper/dst-dst_thinlv          2.0T  999G   1.1T   49%  /dst_thinlv

 

# time lvcreate -s -n 1TBthin_snap1 dst/dst_thinlv

  Using default stripesize 64.00 KiB.
  WARNING: Sum of all thin volume sizes (4.00 TiB) exceeds the size of thin pool dst/big_thinpool and the size of whole volume group (2.73 TiB)!
  For thin pool auto extension activation/thin_pool_autoextend_threshold should be below 100.
  Logical volume "1TBthin_snap1" created.
real    0m0.381s
user    0m0.012s
sys     0m0.074s

→スナップショット作成の所要時間はやはり一瞬

# lvs
  LV              VG  Attr       LSize   Pool          Origin     Data%  Meta%  Move Log Cpy%Sync Convert
  home            cl  -wi-ao---- 173.87g
  root            cl  -wi-ao----  50.00g
  swap            cl  -wi-ao----   7.81g
  1TBthin_snap1   dst Vwi---tz-k   2.00t big_thinpool  dst_thinlv
  big_thinpool    dst twi-aotz--   2.44t                          40.30  20.03
  dst_thinlv      dst Vwi-aotz--   2.00t big_thinpool             49.20
  testlv_bk       dst -wi-a-----  30.00g
  src_2TB_linerlv src -wi-ao----   2.00t
  test_thinpool   src twi-aotz--  10.00g                          0.10   0.72
  testlv          src ori-ao---- 200.00g
  thin_snap       src Vwi-a-tz-k   5.00g test_thinpool thinlv_1   0.00
  thin_snap2      src Vwi-a-tz-- 200.00g test_thinpool testlv     0.00
  thinlv_1        src Vwi-a-tz--   5.00g test_thinpool            0.21