对于我曾经尝试过的所有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
这个错误是否特定于Linux上的ZFS?
任何拥有Solaris或FreeBSD ZFS盒的人都可以执行类似的测试(在旋转硬盘上有数百个快照的文件系统上)吗?
是否有解决方法来获取卷的快照列表,其本质上没有.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 -
它包含114个文件系统和1个卷,每个包含数百个快照,因为这是一个zfs send / zfs recv备份服务器.
解决方案:zfs列表很慢,因为它会获取其他信息,即使它没有显示.解决方案是添加-o name -s名称,即使用zfs list -t snapshot -o name -s name
解决方法
快照操作是您拥有的快照数量,RAM,磁盘性能和驱动器空间的函数.
This would be a general ZFS issue,不是Linux变体独有的东西.
更好的问题是:为什么你有zvol的1797快照?这绝对不仅仅是推荐,让我想知道系统上还发生了什么.
人们说“ZFS快照是免费的”,但并非总是如此.
虽然ZFS快照不会对生产性能产生影响,但是您拥有的高数字显然需要磁盘访问才能进行枚举.
<磁盘访问时间> RAM访问时间,因此数量级差异. 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