为什么`zfs list -t snapshot`的数量级比`ls .zfs / snapshot`慢?

对于我曾经尝试过的所有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

相关文章

linux常用进程通信方式包括管道(pipe)、有名管道(FIFO)、...
Linux性能观测工具按类别可分为系统级别和进程级别,系统级别...
本文详细介绍了curl命令基础和高级用法,包括跳过https的证书...
本文包含作者工作中常用到的一些命令,用于诊断网络、磁盘占满...
linux的平均负载表示运行态和就绪态及不可中断状态(正在io)的...
CPU上下文频繁切换会导致系统性能下降,切换分为进程切换、线...