使用所有ZFS-on-Linux版本,我尝试过使用zfs list来列出文件系统或volum的所有快照( 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
这个bug是特定于ZFS-on-Linux的吗?
任何有Solaris或FreeBSD ZFS盒子的人都可以执行类似的testing(在一个文件系统上有数百个旋转硬盘快照)?
有没有一种解决方法来获得卷的快照列表,其本质上没有.zfs目录?
我已经在内核2.6.32-43-pve x86_64(Proxmox)上运行了Linux上的ZFS-on-Linux 0.6.5.2-2-wheezy的上述testing,但是我一直都在旧的和较新的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 -
它包含114个文件系统和1个卷,每个包含数百个快照,因为这是一个zfs send / zfs recv备份服务器。
解决scheme: zfs list很慢,因为它提取附加信息,即使它没有显示。 解决scheme是同时添加-o name -s name ,即使用zfs list -t snapshot -o name -s name
快照操作是您拥有的快照数量,RAM,磁盘性能和驱动器空间的函数。 这将是一个普遍的ZFS问题 ,而不是Linux变体的独特之处。
更好的问题是: 为什么你有一个zvol的1797快照? 这肯定比推荐的还要多,让我想知道系统上还有什么事情发生。
人们说“ZFS快照是免费的”,但事实并非如此。
尽pipeZFS快照对生产性能没有影响,但您明确需要磁盘访问的次数很多。
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
与
# 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要多运行几个数量级
你也在比较两个完全不同的操作。
zfs list -t snapshot枚举系统上的所有ZFS快照, 并提供有关这些快照的大量信息,例如使用的空间量。 在strace下运行以查看所做的系统调用。
ls .zfs/snapshot只是从一个目录发出一个简单的名字列表。 除了读名字之外别无他法,别无其他。