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

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

如果我用来zpool列出可用空间,它会告诉我有超过 270 GB 的可用空间,但实际可用空间(由 和 显示dfzfs 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

这种差异意味着什么?为什么这两个实用程序显示不同数量的可用空间?更重要的是,如果“额外”的 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              [email protected]/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

答案1

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

金额为3.2%池总容量。 zfs-0.6.5

7.25T 的 3.2% = 235GB

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

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

答案2

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

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

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

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

options zfs spa_slop_shift=6

相关内容