如何判断 ZFS(zfs-fuse)重复数据删除/压缩是否应用于特定文件?

如何判断 ZFS(zfs-fuse)重复数据删除/压缩是否应用于特定文件?

我有一个使用适用于 Linux(Ubuntu)的 zfs-fuse 的 zfs 格式的分区。

我使用了一段时间,然后启用了重复数据删除和压缩 (zfs set compression=on/dedup=on)。现在我认为我有一些文件已进行重复数据删除和压缩,还有一些文件尚未进行重复数据删除和压缩。

没问题,但有时我会感到困惑。让我们看看,以下命令将消耗我近 4GB 的 zfs 存储空间:

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

我可以看到“是”和“零”被很好地压缩了。

答案1

您可以使用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

第一列是 inode 编号,第 5 和第 6 列表示磁盘大小和文件大小,第 7 列表示文件实际存在的百分比。第 6 和第 7 列的值不同,且第 8 列的值大于 100% 的文件都是压缩文件。

相关内容