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