ZFSでファイルブロックに同じデータを書き込むと、スナップショットはスペースを占めますか?

ZFSでファイルブロックに同じデータを書き込むと、スナップショットはスペースを占めますか?

16Mファイルがあります。

これを含むZFSファイルシステムのスナップショットを撮りました。

同じデータでファイルを上書きする場合、ZFSはファイル内のすべてのブロックの2つのコピーを保存する必要がありますか?

ベストアンサー1

はい、ファイルセットからスナップショットを作成すると、ZFSは同じファイルに追加のスペースを割り当てます。

まず、空のファイルセットを作成してコピーするファイルを準備します。簡単な理由で、圧縮シャットダウンされ、プールは何もせずに単一のディスクに作成されます。レズまたは

[root@localhost ~]# dd if=/dev/urandom of=/tmp/testfile bs=16M count=1
1+0 records in
1+0 records out
16777216 bytes (17 MB) copied, 0.113345 s, 148 MB/s    


[root@localhost ~]# zpool create tank sdd
[root@localhost ~]# zfs create tank/test

ディスクで使用されているスペースはで確認できますzpool list

[root@localhost]# zpool list tank
NAME     SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
tank    9.94G   182K  9.94G         -     0%     0%  1.00x  ONLINE  -

次に、ファイルをZFSファイルセットにコピーし、スナップショットを作成し、使用されたスペースを確認します。

[root@localhost ~]# /bin/cp /tmp/testfile /tank/test/

[root@localhost ~]# zfs list -t all -r tank/test
NAME        USED  AVAIL  REFER  MOUNTPOINT
tank/test  16.0M  9.61G  16.0M  /tank/test

[root@localhost ~]# zfs snapshot tank/test@1
[root@localhost ~]# zfs list -t all -r tank/test
NAME          USED  AVAIL  REFER  MOUNTPOINT
tank/test    16.0M  9.61G  16.0M  /tank/test
tank/test@1     0B      -  16.0M  -

いいですね。同じファイルをZFSファイルセットの同じ場所にコピーし、使用されたスペースをもう一度見てください。

[root@localhost ~]# /bin/cp -f /tmp/testfile /tank/test/
[root@localhost ~]# zfs list -t all -r tank/test
NAME          USED  AVAIL  REFER  MOUNTPOINT
tank/test    32.0M  9.60G  16.0M  /tank/test
tank/test@1  16.0M      -  16.0M  -

また、プールに使用されるディスク容量は32MBに増えます。

[root@localhost tank]# zpool list tank
NAME     SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
tank    9.94G  32.2M  9.91G         -     0%     0%  1.00x  ONLINE  -

ご覧のとおり、tank/testファイルセットは現在合計32 MBを占め、16 MBはファイルセットにtank/test、16 MBはスナップショットに分割されますtank/test@1。また、出力にはzpool listディスクに32MBが割り当てられているとマークされています。
繰り返すとコピーとスナップショットを撮るUSED​​の総量はtank/testさらに増えるでしょう。

修正する

ありがとう、Andrew Henleに感謝します。上記の回答を更新する必要があり、続行されます。重複排除以下に何かがあります。

ファイルセットを使用してこれをやり直してみましょう。重複排除有効です。

[root@localhost]# zfs destroy -r tank/test
[root@localhost]# zfs create tank/test-dedup
[root@localhost]# zfs set dedup=on tank/test-dedup

ここでは、個々のステップをスキップして、使用されたスペース概要の出力のみを追加します。

[root@localhost ~]# zfs list -t all -r tank/test-dedup
NAME                  USED  AVAIL  REFER  MOUNTPOINT
tank                 32.3M  9.61G    24K  /tank
tank/test-dedup      32.1M  9.61G  16.0M  /tank/test-dedup
tank/test-dedup@1    16.0M      -  16.0M  -
[root@localhost ~]# zpool list tank
NAME     SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
tank    9.94G  16.3M  9.92G         -     0%     0%  2.00x  ONLINE  -

そして重複排除有効にすると、スナップショットはまだ使用量を報告します。追加サイズは分かるzpool listように重複排除重複排除率2でディスク容量を節約します。

IIRC重複排除は、メモリ使用量が多く、パフォーマンスに影響を与えるため、通常はお勧めできません。 ZFSの重複排除機能が改善されていると思います。

おすすめ記事