ZFSの基本的な使い方と、ZFSとEXT4のベンチマーク比較をまとめた。
ZFSの使い方
初期
一番最初は何もない。
[root@kvm ~]# zpool list no pools available [root@kvm ~]# zfs list no datasets available
ストレージプール作成
ストレージプール、tankを作成。
# zpool create tank /dev/sdd
プール確認
[root@kvm ~]# zpool list NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT tank 2.72T 91.5K 2.72T 0% 1.00x ONLINE -
[root@kvm ~]# zpool status pool: tank state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM tank ONLINE 0 0 0 sdd ONLINE 0 0 0 errors: No known data errors
FS作成
FS、homeを作成。
# zfs create tank/home
FS確認
[root@kvm ~]# zfs list NAME USED AVAIL REFER MOUNTPOINT tank 130K 2.68T 31K /tank tank/home 30K 2.68T 30K /tank/home
ファイル作成
[root@kvm ~]# dd if=/dev/urandom of=/tank/home/tmpfile1 bs=1M count=1 1+0 records in 1+0 records out 1048576 bytes (1.0 MB) copied, 0.246428 s, 4.3 MB/s [root@kvm ~]# [root@kvm ~]# ll /tank/home/ 合計 1029 -rw-r--r--. 1 root root 1048576 7月 17 01:29 2012 tmpfile1 [root@kvm ~]# [root@kvm ~]# zfs list NAME USED AVAIL REFER MOUNTPOINT tank 1.13M 2.68T 31K /tank tank/home 1.03M 2.68T 1.03M /tank/home
スナップショット作成
tank/homeのスナップショットを取る。
スナップショットの名前はss1とする。
[root@kvm ~]# zfs snapshot tank/home@ss1 [root@kvm ~]# [root@kvm ~]# zfs list -t all NAME USED AVAIL REFER MOUNTPOINT tank 1.13M 2.68T 31K /tank tank/home 1.03M 2.68T 1.03M /tank/home tank/home@ss1 0 - 1.03M -
スナップショット差分チェック
スナップショットを取ってからFSのサイズをチェック。
tank/homeは、追加した1MB分が増加。
tank/home@ss1は、tank/homeとの差分が1MB増加。
[root@kvm ~]# dd if=/dev/urandom of=/tank/home/tmpfile2 bs=1M count=1 1+0 records in 1+0 records out 1048576 bytes (1.0 MB) copied, 0.242763 s, 4.3 MB/s [root@kvm ~]# [root@kvm ~]# ll /tank/home/ 合計 2055 -rw-r--r--. 1 root root 1048576 7月 17 01:29 2012 tmpfile1 -rw-r--r--. 1 root root 1048576 7月 17 01:36 2012 tmpfile2 [root@kvm ~]# [root@kvm ~]# zfs list -t all NAME USED AVAIL REFER MOUNTPOINT tank 2.33M 2.68T 31K /tank tank/home 2.05M 2.68T 2.04M /tank/home tank/home@ss1 19K - 1.03M -
FSのクローンを作る
tank/home@ss1のクローン、tank/home_cloneを作る。
[root@kvm ~]# zfs clone tank/home@ss1 tank/home_clone [root@kvm ~]# [root@kvm ~]# zfs list -t all NAME USED AVAIL REFER MOUNTPOINT tank 2.20M 2.68T 32K /tank tank/home 2.05M 2.68T 2.04M /tank/home tank/home@ss1 19K - 1.03M - tank/home_clone 1K 2.68T 1.03M /tank/home_clone [root@kvm ~]# [root@kvm ~]# ll /tank/home_clone/ 合計 1029 -rw-r--r--. 1 root root 1048576 7月 17 01:29 2012 tmpfile1
クローン元のスナップショットは削除出来ないらしい。
オプションに-Rをつけるとクローン先も含めて全て削除される。
[root@kvm ~]# zfs destroy tank/home@ss1 cannot destroy 'tank/home@ss1': snapshot has dependent clones use '-R' to destroy the following datasets: tank/home_clone
FSをコピーする
クローンだとクローン元が消せなくてちょっと不便。
だから別物としてコピーを作る。
tank/home@ss1をコピーしてtank/home_copyを作る。
コピー元をスナップショットとすると、スナップショットを取った直後の状態がコピーされるらしい。
[root@kvm ~]# zfs send tank/home@ss1 | zfs receive tank/home_copy [root@kvm ~]# [root@kvm ~]# zfs list -t all NAME USED AVAIL REFER MOUNTPOINT tank 3.40M 2.68T 32K /tank tank/home 2.05M 2.68T 2.04M /tank/home tank/home@ss1 19K - 1.03M - tank/home_clone 1K 2.68T 1.03M /tank/home_clone tank/home_copy 1.03M 2.68T 1.03M /tank/home_copy tank/home_copy@ss1 0 - 1.03M - [root@kvm ~]# [root@kvm ~]# ll /tank/home_copy/ 合計 1027 -rw-r--r--. 1 root root 1048576 7月 17 01:29 2012 tmpfile1
クローン/コピー元を削除
オプション-Rをつけてクローン先も全部削除。
クローンしたFSは削除されるが、コピーしたFSは削除されていない。
[root@kvm ~]# zfs destroy -R tank/home@ss1 [root@kvm ~]# [root@kvm ~]# zfs list -t all NAME USED AVAIL REFER MOUNTPOINT tank 3.35M 2.68T 32K /tank tank/home 2.04M 2.68T 2.04M /tank/home tank/home_copy 1.03M 2.68T 1.03M /tank/home_copy tank/home_copy@ss1 0 - 1.03M -
ベンチマーク
ZFSとext4を比較。
どうやらext4の方がread/write共に速いようだ。
ZFS
write
[root@kvm ~]# for i in {1..3} > do > time (dd if=/dev/zero of=/tank/home/ddfile bs=1M count=1024 > /dev/null 2>&1) > done real 0m10.880s user 0m0.004s sys 0m1.192s real 0m12.575s user 0m0.002s sys 0m1.302s real 0m12.329s user 0m0.003s sys 0m1.157s
read
[root@kvm ~]# for i in {1..3} > do > time (cat /tank/home/ddfile > /dev/null) > done real 0m0.417s user 0m0.004s sys 0m0.413s real 0m0.414s user 0m0.004s sys 0m0.409s real 0m0.413s user 0m0.001s sys 0m0.411s
ext4
write
[root@kvm ~]# for i in {1..3} > do > time (dd if=/dev/zero of=/mnt/ddfile bs=1M count=1024 > /dev/null 2>&1) > done real 0m2.068s user 0m0.001s sys 0m1.997s real 0m8.711s user 0m0.000s sys 0m2.659s real 0m8.333s user 0m0.003s sys 0m2.653s
read
[root@kvm ~]# for i in {1..3} > do > time (cat /mnt/ddfile > /dev/null) > done real 0m0.585s user 0m0.003s sys 0m0.461s real 0m0.385s user 0m0.008s sys 0m0.377s real 0m0.385s user 0m0.004s sys 0m0.381s