為什麼快照消耗的空間比拍攝後更改的數據少得多?
儘管我使用 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
屬性。