zpool list vs zfs list - 為什麼可用空間相差 10 倍?
如果我
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 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
ZFS 在內部保留少量空間(slop space)以確保即使在可用空間非常低的情況下也可以完成一些關鍵的 ZFS 操作。
該數量是總池容量的3.2%。 zfs-0.6.5
7.25T 的 3.2% = 235GB
文件系統中實際上只有 40.6GB 可用空間。
zpool 報告原始磁碟容量,可用空間為 40 + 235 = 275G
要添加到 binarysta 的答案,您可以使用
spa_slop_shift
module選項調整保留(“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
這將立即生效,並將立即
df
顯示額外的空間。要使更改永久生效,請創建或編輯
/etc/modprobe.d/zfs.conf
並添加:options zfs spa_slop_shift=6