web-dev-qa-db-ja.com

ZFS(zfs-Fuse)の重複排除/圧縮が特定のファイルに適用されているかどうかを確認するにはどうすればよいですか?

Zfs-Fuse for linux(Ubuntu)を使用したzfsフォーマットのパーティションがあります。

しばらく使用してから、重複排除と圧縮を有効にしました(zfs setcompression = on/dedup = on)。今、私は重複排除されて圧縮されたファイルと、まだ圧縮されていないファイルがあると思います。

大丈夫でしたが、時々混乱しました。見てみましょう、次のコマンドは私のzfsストレージのほぼ4GBを消費します:

cp oldfile.4GB newfile.4GB

..そしてこれはほとんどゼロを消費します:

cp newfile.4GB newfile.4GB.2

これは、古いファイルがまだ圧縮されていないため、重複排除が発生していないためだと思います。

私の考えは、まだ重複排除/圧縮されていない古いファイルを見つけた場合、それらをバッチコピー/名前変更/削除して、重複と冗長性を排除することができます。しかし、どうすればそれを確認できますか?

ストレージの内容全体を再コピーできることはわかっていますが(各ファイルのタイムスタンプを確認するとさらに良くなります)、いくつかのファイルプロパティを表示するzfsstatのようなツールがあればもっと嬉しいです。 。


編集:私の環境に関するjlliagreのヒントを確認しました。

First, made some dataset and directories:
$ Sudo zfs create zfs/test
$ Sudo install -d -m 1777 /zfs/test/orig /zfs/test/copy

Created some files:
$ yes > /zfs/test/orig/yes.1s & sleep 1; kill %1
$ dd if=/dev/zero of=/zfs/test/orig/zero.1M bs=1K count=1024
$ dd if=/dev/urandom of=/zfs/test/orig/Rand.1M bs=1K count=1024

Turned compression on, and copy above files:
$ Sudo zfs set compress=on  zfs/test
$ cp /zfs/test/orig/* /zfs/test/copy

Now the directories look like:
$ ls -hil /zfs/test/*
/zfs/test/copy:
total 1.5K
10 -rw-r--r-- 1 kimura kimura 1.0M Mar  2 01:30 Rand.1M
11 -rw-r--r-- 1 kimura kimura  40M Mar  2 01:30 yes.1s
12 -rw-r--r-- 1 kimura kimura 1.0M Mar  2 01:30 zero.1M

/zfs/test/orig:
total 42M
9 -rw-r--r-- 1 kimura kimura 1.0M Mar  2 01:29 Rand.1M
7 -rw-r--r-- 1 kimura kimura  40M Mar  2 01:29 yes.1s
8 -rw-r--r-- 1 kimura kimura 1.0M Mar  2 01:29 zero.1M

And zdb tool shows some information:
kimura@kimura-desktop:~$ Sudo zdb zfs/test 
Dataset zfs/test [ZPL], ID 196, cr_txg 108306, 44.2M, 12 objects

    Object  lvl   iblk   dblk  dsize  lsize   %full  type
         0    7    16K    16K    16K    16K   37.50  DMU dnode
        -1    1    16K    512     1K    512  100.00  ZFS user/group used
        -2    1    16K    512     1K    512  100.00  ZFS user/group used
         1    1    16K    512     1K    512  100.00  ZFS master node
         2    1    16K    512     1K    512  100.00  ZFS delete queue
         3    1    16K    512     1K    512  100.00  ZFS directory
         4    1    16K    512     1K    512  100.00  ZFS directory
         5    1    16K    512     1K    512  100.00  ZFS directory
         6    1    16K    512     1K    512  100.00  ZFS directory
         7    3    16K   128K  39.8M  39.8M  100.00  ZFS plain file
         8    2    16K   128K  1.00M     1M  100.00  ZFS plain file
         9    2    16K   128K  1.00M     1M  100.00  ZFS plain file
        10    2    16K   128K  1.00M     1M  100.00  ZFS plain file
        11    3    16K   128K  1.41M  39.8M  100.00  ZFS plain file
        12    2    16K   128K      0   128K    0.00  ZFS plain file

「はい」と「ゼロ」が十分に圧縮されていることがわかります。

4
asari

zdb -D poolnameコマンドを使用して、重複排除の全体的な統計を取得できます。

ファイルごとの圧縮ステータスについては、それほど単純ではありませんが、次のように使用できます。

zdb dataset | grep plain

これにより、次のような行が出力されます。

     8    2    16K   128K  3.03M  5.00M  100.00  ZFS plain file
     9    2    16K   128K  3.03M  5.00M  100.00  ZFS plain file
    10    2    16K   128K  5.00M  5.00M  100.00  ZFS plain file
    11    2    16K   128K  3.03M  6.00M   83.33  ZFS plain file

最初の列はiノード番号、列5と6はディスク上のサイズとファイルサイズを表し、列7は実際に存在するファイルのパーセンテージを表します。 6と7の値が異なり、8が100%のファイルはすべて圧縮されます。

5
jlliagre