zpool 列表与 zfs 列表 - 为什么可用空间相差 10 倍?

Mal*_*ous 7 zfs

如果我zpool用来列出可用空间,它会告诉我我有超过 270 GB 的可用空间,但实际可用的可用空间(由df和 显示zfs list)只有 40 GB,几乎少了十倍:

$ zpool list
NAME      SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
ssdtank  7.25T  6.98T   273G        -         -    21%    96%  1.00x    ONLINE  -

$ zpool iostat -v
                                      capacity     operations     bandwidth 
pool                                alloc   free   read  write   read  write
----------------------------------  -----  -----  -----  -----  -----  -----
ssdtank                             6.98T   273G      1     15   365K   861K
  ata-Samsung_SSD_860_QVO_4TB_S123  3.49T   136G      0      7   182K   428K
  ata-Samsung_SSD_860_QVO_4TB_S456  3.49T   137G      0      8   183K   434K

$ zfs list
NAME       USED  AVAIL     REFER  MOUNTPOINT
ssdtank   6.98T  40.6G       32K  /srv/tank
Run Code Online (Sandbox Code Playgroud)

这种差异意味着什么?为什么这两个实用程序显示的可用空间量不同?更重要的是,如果它真的存在,我如何访问“额外”的 200 GB?

该池由两个相同的磁盘组成,没有 RAID 或其他设置,只是作为普通 vdev 添加到池和在顶部创建的文件系统。(显示的根目录中有多个文件系统,但我认为它们不相关,因为它们都共享相同的根目录并具有相同的 40.6G 可用空间)。

根据要求,这里是输出zfs get all:(我还更新了上面的数字,因此随着今天可用磁盘空间量的变化,它们都有意义。旧数字是 257GB/27GB,今天是 273GB/40GB,这意味着自从我最初发布问题以来释放的磁盘空间量使这两个数字增加了相同的数量 - 即 zpool 似乎比其他任何东西都报告了大约 270 GB,但它始终比实际可用空间多出 270 GB当时)。

NAME     PROPERTY              VALUE                  SOURCE
ssdtank  aclinherit            restricted             default
ssdtank  acltype               off                    default
ssdtank  atime                 off                    received
ssdtank  available             40.6G                  -
ssdtank  canmount              on                     default
ssdtank  casesensitivity       sensitive              -
ssdtank  checksum              on                     default
ssdtank  compression           off                    default
ssdtank  compressratio         1.00x                  -
ssdtank  context               none                   default
ssdtank  copies                1                      default
ssdtank  createtxg             1                      -
ssdtank  creation              Sat Oct 26 21:53 2019  -
ssdtank  dedup                 off                    default
ssdtank  defcontext            none                   default
ssdtank  devices               on                     default
ssdtank  dnodesize             legacy                 default
ssdtank  encryption            off                    default
ssdtank  exec                  on                     default
ssdtank  filesystem_count      none                   default
ssdtank  filesystem_limit      none                   default
ssdtank  fscontext             none                   default
ssdtank  guid                  12757787786185470931   -
ssdtank  keyformat             none                   default
ssdtank  keylocation           none                   default
ssdtank  logbias               latency                default
ssdtank  logicalreferenced     16K                    -
ssdtank  logicalused           6.98T                  -
ssdtank  mlslabel              none                   default
ssdtank  mounted               yes                    -
ssdtank  mountpoint            /srv/tank              local
ssdtank  nbmand                off                    default
ssdtank  normalization         none                   -
ssdtank  objsetid              54                     -
ssdtank  overlay               off                    default
ssdtank  pbkdf2iters           0                      default
ssdtank  primarycache          all                    default
ssdtank  quota                 none                   default
ssdtank  readonly              off                    default
ssdtank  recordsize            128K                   default
ssdtank  redundant_metadata    all                    default
ssdtank  refcompressratio      1.00x                  -
ssdtank  referenced            32K                    -
ssdtank  refquota              none                   default
ssdtank  refreservation        none                   default
ssdtank  relatime              off                    default
ssdtank  reservation           none                   default
ssdtank  rootcontext           none                   default
ssdtank  secondarycache        all                    default
ssdtank  setuid                on                     default
ssdtank  sharenfs              rw=@192.168.0.0/24     received
ssdtank  sharesmb              off                    default
ssdtank  snapdev               hidden                 default
ssdtank  snapdir               hidden                 default
ssdtank  snapshot_count        none                   default
ssdtank  snapshot_limit        none                   default
ssdtank  special_small_blocks  0                      default
ssdtank  sync                  standard               default
ssdtank  type                  filesystem             -
ssdtank  used                  6.98T                  -
ssdtank  usedbychildren        6.98T                  -
ssdtank  usedbydataset         32K                    -
ssdtank  usedbyrefreservation  0B                     -
ssdtank  usedbysnapshots       0B                     -
ssdtank  utf8only              off                    -
ssdtank  version               5                      -
ssdtank  volmode               default                default
ssdtank  vscan                 off                    default
ssdtank  written               0                      -
ssdtank  xattr                 on                     default
ssdtank  zoned                 off                    default
Run Code Online (Sandbox Code Playgroud)

Mal*_*ous 7

spa_slop_shift 要添加到binarysta的答案中,您可以使用模块选项调整保留(“slop”)空间的数量。

ZFS -on-Linux 模块文档表明,对于大型数组,默认值 5 可能过于保守(保留空间过多),因此可以增加它,这样保留的空间会更少。(运行 ZFS 的其他操作系统也有类似的选项。)

默认值 5 转换为 2^5 = 32,即池容量的 1/32。设置spa_slop_shift为 6(旧 ZFS 版本中使用的值)意味着仅保留池容量的 1/64。

保留较少的空间会增加碎片,并且可能需要更多的内存来管理大量不同的块,这就是为什么文档建议 15(池空间的 1/32768)是具有 4 TB RAM 的系统的实际上限。如果您能以某种方式保证文件系统在填满时不会变得碎片化,那么内存需求可能会更少。

由于绝对最小的slop空间是128 MiB,我认为200 GB有点太多了,所以我spa_slop_shift暂时改为6。每次增量都会使保留空间量减半,因此,在我的例子中,从 5 增加到 6 会将保留空间从 200 GB 减半到 100 GB。果然,这立即给了我额外的 100 GiB 可用空间。

要在 Linux 上运行时临时更改该值,您可以更改模块参数而无需重新启动:

echo 6 > /sys/module/zfs/parameters/spa_slop_shift
Run Code Online (Sandbox Code Playgroud)

这将立即生效,并df立即显示额外的空间。

要使更改永久生效,请创建或编辑/etc/modprobe.d/zfs.conf并添加:

options zfs spa_slop_shift=6
Run Code Online (Sandbox Code Playgroud)


bin*_*sta 6

ZFS 在内部保留了少量空间(slop 空间),以确保即使在可用空间非常低的情况下,一些关键的 ZFS 操作也能完成。

该金额是总池容量的3.2%zfs-0.6.5

7.25T 的 3.2% = 235GB

文件系统中实际上只有 40.6GB 可用空间。

zpool 报告原始磁盘容量和可用空间为 40 + 235 = 275G