しばらくZFSを使用してきましたが、時々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 - -
今まではそんなに良くなった。気になる点は次のとおりです。
たとえば、2番目の最後のスナップショットを撮った後、18 GB
実行中のVMに約2つの新しいデータをコピーしました。しかし、そのスナップショットのサイズUSED
は1.08 GB
。ただし、もちろん、ファイルシステムには、報告されたスナップショットサイズであるデータセット/ZVOL以降の変更を記録するためのスペースが必要ですUSED
(間違った場合は修正してください)。
2番目にもっと極端な例として、このVMはスナップショットを作成してから約7時間実行されました@T-2021-04-25-14-27-30
。私はその間、仮想マシンでかなりのギガバイトのデータが変更されたと確信しています。ただし、USED
スナップショットのサイズは均一であることが知られています0
。
スナップショットを撮った後、実際にどれだけのデータが変更されたかを確認する奇妙な方法が見つかりました。次のコマンドライン(最初の行のコマンド、次の2行の出力)などの操作を実行して、スナップショット転送を「シミュレート」できます。
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
ここで説明するには長すぎます)
ここでは、2番目のスナップショットの増分に基づいて最後のスナップショットを送信するのにおよそかかることがわかります。これは、それぞれスナップショットの後、スナップショットの前に仮想18 GB
マシンに変更または追加されたデータの量とほぼ正確に一致します。撮った。つまり、ZFSは2番目のスナップショットと最後のスナップショットの間にどれだけのデータが変更されたかを知っていますが、2番目のスナップショットはまだ約の代わりに値を表示します。@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
答え1
今私の質問に答えることができます。ここで数日間返事が届かなかったため、ZFS on Linuxメーリングリストにもこの質問を投稿し、「Greek」と「Stefan Ring」という2人のメンバーがこのトピックについて説明してくれました。スレッドはここ。
結論として:
最初の理解とは異なり、スナップショットのサイズは、次のスナップショットがUSED
作成される前にそのスナップショットが作成されたため、ZVOLに書き込まれたデータの量を反映しません。
代わりに、データ量はユニークそのスナップショットに。つまり、スナップショットを削除したときに確保されるディスク領域のサイズです。
これで、次のスナップショットが作成される前にZVOLに追加されたデータ量ではない理由が明らかになりました。私の例に戻り、最後から2番目のスナップショットを撮った後、ZVOLに約18GBのスペースを追加しました。
しかし、スナップショットを削除しても、もちろん18GBのデータはまだZVOLに残ります。したがって、スナップショットを削除してもその領域は解放されません。
USED
代わりに、約1GB(サイズ)だけが解放されます。これはスナップショットに固有のスペースであり、スナップショットとそのスナップショットの後に削除または変更された(しかし追加されていない)有効なデータを管理するために混合メタデータが占有することがあります。データをロードします。
WRITTEN
スナップショットが作成されてから次のスナップショットが作成される前に、スナップショットに書き込まれたデータの量を確認するには、このプロパティを使用します。
USED
との違いはマニュアルWRITTEN
で明確に説明されていますzfs
。ドキュメントを何度も読みましたが、このWRITTEN
プロパティを見逃したようです。