奇怪的ZFS磁盘空间使用情况报告为ZVOL

我们在一台声称使用176G磁盘空间的FreeBSD 10.0-CURRENT主机上安装了100G ZVOL:

root@storage01:~ # zfs get all zroot/DATA/vtest NAME PROPERTY VALUE SOURCE zroot/DATA/vtest type volume - zroot/DATA/vtest creation Fri May 24 20:44 2013 - zroot/DATA/vtest used 176G - zroot/DATA/vtest available 10.4T - zroot/DATA/vtest referenced 176G - zroot/DATA/vtest compressratio 1.00x - zroot/DATA/vtest reservation none default zroot/DATA/vtest volsize 100G local zroot/DATA/vtest volblocksize 8K - zroot/DATA/vtest checksum fletcher4 inherited from zroot zroot/DATA/vtest compression off default zroot/DATA/vtest readonly off default zroot/DATA/vtest copies 1 default zroot/DATA/vtest refreservation none local zroot/DATA/vtest primarycache all default zroot/DATA/vtest secondarycache all default zroot/DATA/vtest usedbysnapshots 0 - zroot/DATA/vtest usedbydataset 176G - zroot/DATA/vtest usedbychildren 0 - zroot/DATA/vtest usedbyrefreservation 0 - zroot/DATA/vtest logbias latency default zroot/DATA/vtest dedup off default zroot/DATA/vtest mlslabel - zroot/DATA/vtest sync standard default zroot/DATA/vtest refcompressratio 1.00x - zroot/DATA/vtest written 176G - zroot/DATA/vtest logicalused 87.2G - zroot/DATA/vtest logicalreferenced 87.2G - root@storage01:~ # 

这看起来像一个bug,如果它没有快照,保留和孩子,它如何消耗超过它的volsize ? 或者,也许我们错过了什么?

UPD:

zpool status -v结果zpool status -v

 root@storage01:~ # zpool status -v pool: zroot state: ONLINE scan: scrub repaired 0 in 0h6m with 0 errors on Thu May 30 05:45:11 2013 config: NAME STATE READ WRITE CKSUM zroot ONLINE 0 0 0 raidz2-0 ONLINE 0 0 0 gpt/disk0 ONLINE 0 0 0 gpt/disk1 ONLINE 0 0 0 gpt/disk2 ONLINE 0 0 0 gpt/disk3 ONLINE 0 0 0 gpt/disk4 ONLINE 0 0 0 gpt/disk5 ONLINE 0 0 0 cache ada0s2 ONLINE 0 0 0 errors: No known data errors root@storage01:~ # 

zpool list结果:

 root@storage01:~ # zpool list NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT zroot 16.2T 288G 16.0T 1% 1.05x ONLINE - root@storage01:~ # 

zfs list结果:

 root@storage01:~ # zfs list NAME USED AVAIL REFER MOUNTPOINT zroot 237G 10.4T 288K / zroot/DATA 227G 10.4T 352K /DATA zroot/DATA/NFS 288K 10.4T 288K /DATA/NFS zroot/DATA/hv 10.3G 10.4T 288K /DATA/hv zroot/DATA/hv/hv001 10.3G 10.4T 144K - zroot/DATA/test 288K 10.4T 288K /DATA/test zroot/DATA/vimage 41.3G 10.4T 288K /DATA/vimage zroot/DATA/vimage/vimage_001 41.3G 10.5T 6.47G - zroot/DATA/vtest 176G 10.4T 176G - zroot/SYS 9.78G 10.4T 288K /SYS zroot/SYS/ROOT 854M 10.4T 854M / zroot/SYS/home 3.67G 10.4T 3.67G /home zroot/SYS/tmp 352K 10.4T 352K /tmp zroot/SYS/usr 4.78G 10.4T 427M /usr zroot/SYS/usr/local 288K 10.4T 288K /usr/local zroot/SYS/usr/obj 3.50G 10.4T 3.50G /usr/obj zroot/SYS/usr/ports 895K 10.4T 320K /usr/ports zroot/SYS/usr/ports/distfiles 288K 10.4T 288K /usr/ports/distfiles zroot/SYS/usr/ports/packages 288K 10.4T 288K /usr/ports/packages zroot/SYS/usr/src 887M 10.4T 887M /usr/src zroot/SYS/var 511M 10.4T 1.78M /var zroot/SYS/var/crash 505M 10.4T 505M /var/crash zroot/SYS/var/db 1.71M 10.4T 1.43M /var/db zroot/SYS/var/db/pkg 288K 10.4T 288K /var/db/pkg zroot/SYS/var/empty 288K 10.4T 288K /var/empty zroot/SYS/var/log 647K 10.4T 647K /var/log zroot/SYS/var/mail 296K 10.4T 296K /var/mail zroot/SYS/var/run 448K 10.4T 448K /var/run zroot/SYS/var/tmp 304K 10.4T 304K /var/tmp root@storage01:~ # 

更新2:

我们创build了许多具有不同参数的ZVOL,并使用dd来移动内容。 我们注意到另一个奇怪的事情,对于16k和128k volblocksize ,磁盘使用是正常的,即使在dd之后,对于8k volblocksize的ZVOL仍然不正常(所以这不是碎片问题):

 root@storage01:~ # zfs get all zroot/DATA/vtest-3 NAME PROPERTY VALUE SOURCE zroot/DATA/vtest-3 type volume - zroot/DATA/vtest-3 creation Fri May 31 7:35 2013 - zroot/DATA/vtest-3 used 201G - zroot/DATA/vtest-3 available 10.2T - zroot/DATA/vtest-3 referenced 201G - zroot/DATA/vtest-3 compressratio 1.00x - zroot/DATA/vtest-3 reservation none default zroot/DATA/vtest-3 volsize 100G local zroot/DATA/vtest-3 volblocksize 8K - zroot/DATA/vtest-3 checksum fletcher4 inherited from zroot zroot/DATA/vtest-3 compression off default zroot/DATA/vtest-3 readonly off default zroot/DATA/vtest-3 copies 1 default zroot/DATA/vtest-3 refreservation 103G local zroot/DATA/vtest-3 primarycache all default zroot/DATA/vtest-3 secondarycache all default zroot/DATA/vtest-3 usedbysnapshots 0 - zroot/DATA/vtest-3 usedbydataset 201G - zroot/DATA/vtest-3 usedbychildren 0 - zroot/DATA/vtest-3 usedbyrefreservation 0 - zroot/DATA/vtest-3 logbias latency default zroot/DATA/vtest-3 dedup off default zroot/DATA/vtest-3 mlslabel - zroot/DATA/vtest-3 sync standard default zroot/DATA/vtest-3 refcompressratio 1.00x - zroot/DATA/vtest-3 written 201G - zroot/DATA/vtest-3 logicalused 100G - zroot/DATA/vtest-3 logicalreferenced 100G - root@storage01:~ # 

 root@storage01:~ # zfs get all zroot/DATA/vtest-16 NAME PROPERTY VALUE SOURCE zroot/DATA/vtest-16 type volume - zroot/DATA/vtest-16 creation Fri May 31 8:03 2013 - zroot/DATA/vtest-16 used 102G - zroot/DATA/vtest-16 available 10.2T - zroot/DATA/vtest-16 referenced 101G - zroot/DATA/vtest-16 compressratio 1.00x - zroot/DATA/vtest-16 reservation none default zroot/DATA/vtest-16 volsize 100G local zroot/DATA/vtest-16 volblocksize 16K - zroot/DATA/vtest-16 checksum fletcher4 inherited from zroot zroot/DATA/vtest-16 compression off default zroot/DATA/vtest-16 readonly off default zroot/DATA/vtest-16 copies 1 default zroot/DATA/vtest-16 refreservation 102G local zroot/DATA/vtest-16 primarycache all default zroot/DATA/vtest-16 secondarycache all default zroot/DATA/vtest-16 usedbysnapshots 0 - zroot/DATA/vtest-16 usedbydataset 101G - zroot/DATA/vtest-16 usedbychildren 0 - zroot/DATA/vtest-16 usedbyrefreservation 886M - zroot/DATA/vtest-16 logbias latency default zroot/DATA/vtest-16 dedup off default zroot/DATA/vtest-16 mlslabel - zroot/DATA/vtest-16 sync standard default zroot/DATA/vtest-16 refcompressratio 1.00x - zroot/DATA/vtest-16 written 101G - zroot/DATA/vtest-16 logicalused 100G - zroot/DATA/vtest-16 logicalreferenced 100G - root@storage01:~ # 

VOLSIZE表示客户可以看到的卷的大小,而不是存储在池中的卷的大小。

这种差异可能来自多个来源:

  • 元数据所需的空间
  • 存储多个副本所需的空间(“副本”参数)
  • 在“volblocksize”大小的块与vdev结构alignment时由于填充而导致“浪费的空间”; 由vdev结构我的意思是两个参数:raidz-N中的磁盘数量和设备的物理块大小。

创build卷时,zfs会估计需要使用多less空间才能向客户端呈现“volsize”大小。 你可以看到vtest-16和vtest-3卷的不同(在102GB和volgize为100GB的情况下)。 计算可以在libzfs_dataset.c中find(zvol_volsize_to_reservation(uint64_t volsize,nvlist_t * props))

这个计算没有考虑到的是第三个来源。 第三个源对使用512字节扇区的磁盘创build的vdevs几乎没有影响。 从我的实验(我已经testing了填充整个zvol来检查出来),当在较新的4K扇区磁盘上创buildvdev时,它确实有很大的不同。

在我的实验中发现的另一件事是,有镜子并没有显示计算出的保留和最终使用什么之间的差异。

这些是使用具有默认volblocksize(8K)的卷的4K驱动器时的结果。 第一列表示vdev中的磁盘数量:

  raidz1 raidz2 3 135% 101% 4 148% 148% 5 162% 181% 6 162% 203% 7 171% 203% 8 171% 217% 9 181% 232% 10 181% 232% 11 181% 232% 12 181% 232% 

这些是使用512字节扇区驱动器和8K的默认volblocksize时的结果。 第一列表示vdev中的磁盘数量:

  raidz1 raidz2 3 101% 101% 4 104% 104% 5 101% 113% 6 105% 101% 7 108% 108% 8 110% 114% 9 101% 118% 10 102% 106% 11 103% 108% 12 104% 110% 

我的结论如下:

  • 不要使用4K驱动器
  • 如果确实需要使用它们,请使用大于或等于32K的volblocksize创build卷; 性能影响可以忽略不计,空间使用开销可以忽略(较大的块大小需要较less的填充来正确alignment)。
  • 喜欢你的游泳池的镜子条纹; 这种布局既有性能优势,也有较小的空间相关的惊喜,比如这个。
  • 对于上面列举的情况,估计显然是错误的,这是zfs中的一个错误。

如果我正在阅读这个权利,那么您实际上已经在logicalreferenced了卷上的87.6 GB数据。 您正在查看的170 GB数字是数据使用的物理空间。 所以,如果你有你的驱动器镜像,我希望referenced约2 logicalreferenced