私がこれまでに試したすべてのZFS-on-Linuxバージョンでは、zfs list
を使用してファイルシステムまたはボリュームのすべてのスナップショット(zfs list -r -t snapshot -H -o name pool/filesystem
)を一覧表示すると、即時実行されるls .zfs/snapshot
よりも実行に多くの時間がかかります。
$ time ls -1 /srv/vz/subvol-300-disk-1/.zfs/snapshot
[list of 1797 snapshots here]
real 0m0.023s
user 0m0.008s
sys 0m0.014s
# time zfs list -r -t snapshot -H -o name vz/subvol-300-disk-1
[same list of 1797 snapshots]
real 1m23.092s
user 0m0.110s
sys 0m0.758s
このバグはZFS-on-Linuxに固有のものですか?
SolarisまたはFreeBSDのZFSボックスを使用している人が、同様のテストを実行できますか?
volumeのスナップショットのクイックリストを取得するための回避策はありますか?本質的に、.zfs
ディレクトリがありませんか?
カーネル2.6.32-43-pve x86_64(Proxmox)でZFS-on-Linux 0.6.5.2-2-wheezyを使用して上記のテストを実行しましたが、新旧のZFSとカーネルの両方でこの問題が常に発生しましたバージョン。
プールの統計は次のとおりです。
# zpool list
NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
vz 25.2T 9.42T 15.8T - 5% 37% 1.00x ONLINE -
これは、zfs send
/zfs recv
バックアップサーバーであるため、114のファイルシステムと1つのボリュームを含み、それぞれに数百のスナップショットがあります。
Solution:zfs list
は、表示されていなくても追加情報を取得するため、低速です。解決策は、両方の-o name -s name
を追加することです。つまり、zfs list -t snapshot -o name -s name
を使用します。
スナップショット操作は、使用しているスナップショットの数、RAM、ディスクパフォーマンス、ドライブ容量の関数です。 これは一般的なZFSの問題です 、Linuxバリアントに固有のものではありません。
より良い質問は次のとおりです:なぜzvolの1797のスナップショットがあるのですか?これは間違いなく推奨以上のものですシステムで他に何が起こっているのか不思議に思います。
人々は「ZFSスナップショットは無料だ」と言っていますが、それが常に正しいとは限りません。
ZFSスナップがproductionパフォーマンスに影響を与えることはありませんが、列挙するためにディスクアクセスが明らかに必要な高い数値です。
Disk access time > RAM access time
、したがって、差の大きさのオーダー。
strace
出力。システムコールごとの時間に注意し、ファイルシステム内のスナップショットの数に応じてどれだけうまくスケーリングできないかを想像してください。
# strace -c ls /ppro/.zfs/snapshot
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
0.00 0.000000 0 10 read
0.00 0.000000 0 17 write
0.00 0.000000 0 12 open
0.00 0.000000 0 14 close
0.00 0.000000 0 1 stat
0.00 0.000000 0 12 fstat
0.00 0.000000 0 28 mmap
0.00 0.000000 0 16 mprotect
0.00 0.000000 0 3 munmap
0.00 0.000000 0 3 brk
0.00 0.000000 0 2 rt_sigaction
0.00 0.000000 0 1 rt_sigprocmask
0.00 0.000000 0 2 ioctl
0.00 0.000000 0 1 1 access
0.00 0.000000 0 1 execve
0.00 0.000000 0 1 fcntl
0.00 0.000000 0 2 getdents
0.00 0.000000 0 1 getrlimit
0.00 0.000000 0 1 statfs
0.00 0.000000 0 1 Arch_prctl
0.00 0.000000 0 2 1 futex
0.00 0.000000 0 1 set_tid_address
0.00 0.000000 0 1 set_robust_list
------ ----------- ----------- --------- --------- ----------------
100.00 0.000000 133 2 total
versus
# strace -c zfs list -t snapshot
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
100.00 0.003637 60 61 7 ioctl
0.00 0.000000 0 12 read
0.00 0.000000 0 50 write
0.00 0.000000 0 19 open
0.00 0.000000 0 19 close
0.00 0.000000 0 15 fstat
0.00 0.000000 0 37 mmap
0.00 0.000000 0 19 mprotect
0.00 0.000000 0 1 munmap
0.00 0.000000 0 4 brk
0.00 0.000000 0 2 rt_sigaction
0.00 0.000000 0 1 rt_sigprocmask
0.00 0.000000 0 3 1 access
0.00 0.000000 0 1 execve
0.00 0.000000 0 1 getrlimit
0.00 0.000000 0 1 Arch_prctl
0.00 0.000000 0 2 1 futex
0.00 0.000000 0 1 set_tid_address
0.00 0.000000 0 1 set_robust_list
------ ----------- ----------- --------- --------- ----------------
100.00 0.003637 250 9 total
zfs list -t snapshot
の実行には、常にls .zfs/snapshot
よりも桁違いに時間がかかります。
また、2つの完全に異なる操作を比較しています。
zfs list -t snapshot
は、システム上のすべてのZFSスナップショットを列挙します-andは、使用されているスペースの量など、それらのスナップショットに関する多くの情報を提供します。これをstrace
で実行して、行われたシステムコールを確認します。
ls .zfs/snapshot
は、ディレクトリから単純な名前リストを出力しているだけです。名前を読む以外にすべきことは何もありません-そして他に何も提供しません。