Zfs

zpool list vs zfs list - 為什麼可用空間相差 10 倍?

  • April 25, 2020

如果我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

引用自:https://unix.stackexchange.com/questions/582005