如果我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)
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)
归档时间: |
|
查看次数: |
1601 次 |
最近记录: |