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


8

我们在FreeBSD 10.0-CURRENT主机上有一个100G ZVOL,声称使用了176G磁盘空间:

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:~ # 

这看起来像是个错误,volsize如果没有快照,保留和子项,它怎么会比它消耗更多?或者,也许我们缺少了什么?

更新:

结果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:

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

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:~ # 

我们怀疑这可能是碎片,但我们不知道如何证明它
亚历克斯

可能与快照有关吗?
Steve Wills

不,我们没有该卷的任何快照
Alex

当我看到ZFS卷/文件系统上的压缩被禁用时,我感到很伤心。无论如何,你可以发布zpool status -vzpool listzfs list
ewwhite

1
从我所能看到的一切来看,它似乎是一个错误。如果没有子级或保留等内容,则卷大小为100G的zvol的“已使用”不应超过100G。也许实际上是200+ GB的卷大小,并且您更改了卷大小参数?如果不是这样,则FreeBSD-10.0尚未正式发布。向他们提出错误。
2013年

Answers:


2

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

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

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

创建卷时,zfs将估计需要使用多少空间才能向其客户端显示“ volsize”卷。您可以看到vtest-16和vtest-3卷中的差异(其中,refreservation为102GB,volsize为100GB)。该计算可以在libzfs_dataset.c中找到(zvol_volsize_to_reservation(uint64_t volsize,nvlist_t * props))

该计算未考虑的是第三个来源。第三个来源对使用具有512字节扇区的磁盘创建的vdev几乎没有影响。根据我的实验(通过填充整个zvol进行测试,我进行了测试),当在较新的4K扇区磁盘上创建vdev时,确实有很大的不同。

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

这些是将4K驱动器与具有默认volblocksize(8K)的卷一起使用时的结果。第一列代表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卷块大小时的结果。第一列代表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创建卷;对性能的影响可以忽略不计,对空间的使用开销也可以忽略不计(较大的块大小需要较少的填充以正确对齐)。
  • 为您的游泳池更喜欢镜子的条纹;这种布局既可以提高性能,又可以减少与空间相关的意外情况。
  • 对于上述情况,这种估计显然是错误的,这是zfs中的错误。

2
在池中使用4k驱动器ashift=9会导致问题。这不是什么新鲜事。更改块大小也无法对齐驱动器。正确的解决方案是使用创建池ashift=12
克里斯·S

ashift=12在4K驱动器上无法解决此问题;实际上,在具有ashift=125个4K驱动器和raidz 的zpool上,消耗的空间接近上述空间,例如7T体积消耗11T。
drookie

-1

如果我没有logicalreferenced看错,那么您实际上在该卷上有87.6 GB的数据。您正在查看的170 GB数字是数据使用的物理空间。因此,如果您的驱动器已镜像,我希望referenced大约是2倍logicalreferenced


嗯,同一个池上的另一个FS拥有referenced 3.50Glogicalreferenced 3.00G因此该池上FS 之间的2x比率不一致。
亚历克斯

顺便说一句,游泳池是raidz2镜子,不是普通镜子
亚历克斯

是的,我只是在虚拟机上做了一些快速测试,但我的理论没有成立。
13年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.