Zfs

為什麼快照消耗的空間比拍攝後更改的數據少得多?

  • May 12, 2021

儘管我使用 ZFS 已經有一段時間了,但我仍然不時地理解它的某些方面。目前我正在嘗試了解 ZFS 快照如何占用磁碟空間以及為什麼該空間比我預期的要小得多。

我的問題最好用一個例子來解釋。我有一個從ZVOL 執行的虛擬機,沒有壓縮( compression=off)。這些是該卷的快照:

root@server01 ~ # zfs list -r -t all -o name,type,available,used,referenced,usedbyrefreservation,usedbydataset,usedbychildren,usedbysnapshots,volsize,refreservation,reservation rpool01/vm-server01
NAME                                       TYPE      AVAIL   USED  REFER  USEDREFRESERV  USEDDS  USEDCHILD  USEDSNAP  VOLSIZE  REFRESERV  RESERV
rpool01/vm-server01                        volume    1.60T  1.97T  1.01T             0B   1.01T         0B      985G    1.50T       none    none
rpool01/vm-server01@Y-2020-05-27-11-35-15  snapshot      -  1.06G  1.00T              -       -          -         -       1T          -       -
rpool01/vm-server01@T-2020-06-02-11-41-15  snapshot      -  1.04G  1.00T              -       -          -         -       1T          -       -
rpool01/vm-server01@Y-2021-04-24-05-36-24  snapshot      -  1.66G  1.00T              -       -          -         -    1.50T          -       -
rpool01/vm-server01@M-2021-04-24-21-22-30  snapshot      -  3.78G  1.01T              -       -          -         -    1.50T          -       -
rpool01/vm-server01@T-2021-04-25-14-27-15  snapshot      -     0B  1.01T              -       -          -         -    1.50T          -       -
rpool01/vm-server01@T-2021-04-25-14-27-30  snapshot      -     0B  1.01T              -       -          -         -    1.50T          -       -
rpool01/vm-server01@W-2021-04-25-21-55-43  snapshot      -   555M  1.01T              -       -          -         -    1.50T          -       -
rpool01/vm-server01@D-2021-04-27-17-49-00  snapshot      -  1.52G  1.01T              -       -          -         -    1.50T          -       -
rpool01/vm-server01@D-2021-04-29-08-48-16  snapshot      -  1.06G  1.01T              -       -          -         -    1.50T          -       -
rpool01/vm-server01@D-2021-05-03-09-42-01  snapshot      -  1.08G  1.01T              -       -          -         -    1.50T          -       -
rpool01/vm-server01@D-2021-05-04-12-12-01  snapshot      -  45.3M  1.01T              -       -          -         -    1.50T          -       -

到目前為止,一切都很好。令人擔憂的是:

例如,在拍攝倒數第二個快照後,我將大約18 GB新數據複製到正在執行的 VM。但是,該快照的USED大小報告為1.08 GB. 據我了解,拍攝快照後,它是只讀的,因此實際上無法增加。但是當然,文件系統需要空間來記錄數據集/ZVOL之後發生的變化,這就是它報告為快照的USED大小(如果我錯了,請糾正我)。

作為第二個更極端的範例,該 VM 在我拍攝快照後大約 7 小時執行@T-2021-04-25-14-27-30。我絕對確定在那段時間裡,VM 中已經更改了相當多 GB 的數據。但據報導,該快照的USED大小甚至為0.

我找到了一種奇怪的方法來查看拍攝快照後實際更改了多少數據:我們可以通過類似以下命令行的方式“模擬”發送快照(第一行的命令,以下兩行的輸出) :

root@server01 ~ # zfs send -v -n -R -i rpool01/vm-server01@D-2021-05-03-09-42-01 rpool01/vm-server01@D-2021-05-04-12-12-01
send from @D-2021-05-03-09-42-01 to rpool01/vm-server01@D-2021-05-04-12-12-01 estimated size is 18.6G
total estimated size is 18.6G

-n告訴 zfs 不做任何事情,但報告它會做什麼;-v意味著冗長;-i意味著增量;對於-R,請看一下man zfs,這裡解釋太長了)

在這裡,我們看到基於倒數第二個快照增量發送最後一個快照大約18 GB需要被採取。換句話說,ZFS 知道在倒數第二個快照和最後一個快照之間更改了多少數據,但對於倒數第二個快照仍然顯示一個值而不是 about 。@D-2021-05-03-09-42-01``D-2021-05-04-12-12-01``USED``1.08 GB``18 GB

有人可以解釋一下嗎?

PS 我已經閱讀了幾篇關於如何解釋zfs list的大小值的文章,並且我明白當reservations, refreservations, 嵌套數據集、複製、快照等發揮作用時會變得非常難以理解,但這裡的情況相當很簡單,不是嗎?無論如何,我還沒有看到關於快照的預期大小和報告大小之間差異的提示。

我現在可以回答我自己的問題了。由於在這裡幾天沒有回复,我也在 ZFS on Linux 郵件列表上問了這個問題,兩個名為“Greek”和“Stefan Ring”的成員向我解釋了這個問題。執行緒在這裡

總結一下:

快照的USED大小(與我的第一個理解相反)不反映在拍攝下一個快照之前寫入 ZVOL 的數據量。

相反,它是該快照*獨有的數據量。*換句話說,它是刪除該快照時將釋放的磁碟空間量。

現在很清楚為什麼這絕不是您在拍攝下一個快照之前添加到 ZVOL 的數據量。回到我的範例:在拍攝倒數第二個快照後,我向 ZVOL 添加了大約 18 GB。

但是,如果我刪除那個快照,那 18 GB 的數據當然仍然在 ZVOL 中。因此,刪除該快照不會釋放該空間。

相反,只會USED釋放大約 1 GB(大小);只有該空間對快照是唯一的,並且可能由混合元數據佔用,以管理快照和在該快照之後已刪除或更改(但未添加)的有效負載數據。

如果您想查看自拍攝以來和拍攝下一個快照之前寫入快照的數據量,請使用該WRITTEN屬性。

USED和之間的區別在手冊WRITTEN中有清楚的記錄。zfs儘管我已經不止一次地閱讀了該手冊,但我顯然錯過了該WRITTEN屬性。

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