对于我曾经尝试过的所有 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 机器的人都可以执行类似的测试(在旋转硬盘上具有数百个快照的文件系统上)吗?
是否有一种解决方法可以快速获取卷的快照列表,该卷本质上没有.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 list
速度很慢,因为它会获取额外的信息,即使它没有显示。解决方案是同时添加-o name -s name
,即使用zfs list -t snapshot -o name -s name
zfs list -t snapshot
运行时间总是比运行时间多很多数量级ls .zfs/snapshot
您还在比较两个完全不同的操作。
zfs list -t snapshot
枚举系统上的所有 ZFS 快照 -并提供有关这些快照的大量信息,例如使用的空间量。在下面运行它strace
以查看进行的系统调用。ls .zfs/snapshot
只是从目录中发出一个简单的名称列表。除了阅读名称之外,别无他法——而且别无其他。快照操作是您拥有的快照数量、RAM、磁盘性能和驱动器空间的函数。这将是一般的 ZFS 问题,而不是 Linux 变体独有的问题。
更好的问题是:为什么你有 1797 个 zvol 快照?这绝对不是推荐的,让我想知道系统上还发生了什么。
人们说“ZFS 快照是免费的”,但这并不总是正确的。
虽然 ZFS 快照对生产性能没有影响,但您拥有的大量快照显然需要磁盘访问才能枚举。
Disk access time > RAM access time
,因此数量级差异。strace
输出。请注意每个系统调用的时间,并想象它会随着文件系统中的快照数量而扩展得多么糟糕。相对