zfs on linux 压缩和重复数据删除顺序

Mar*_*itl 6 linux compression deduplication zfs

在 linux 上的 zfs 上写入 zfs 文件系统的数据的顺序是什么?

我在http://docs.oracle.com/cd/E36784_01/html/E36835/gkknx.html 上找到的唯一特定文件说;When a file is written, the data is compressed, encrypted, and the checksum is verified. Then, the data is deduplicated, if possible.

但如果这是真的,那么 dedup 将不会对使用不同压缩算法压缩的块进行重复数据删除。

我测试mysqlf,我相信,顺序如下:dedup, compress, encrypt

我的测试设置:

zpool create tank /dev/sdb
zfs create tank/lz4
zfs create tank/gzip9
zfs set compression=lz4 tank/lz4
zfs set compression=gzip-9 tank/gzip9
zfs set dedup=on tank
Run Code Online (Sandbox Code Playgroud)

输出 zfs list

NAME         USED  AVAIL  REFER  MOUNTPOINT
tank         106K  19,3G    19K  /tank
tank/gzip9    19K  19,3G    19K  /tank/gzip9
tank/lz4      19K  19,3G    19K  /tank/lz4
Run Code Online (Sandbox Code Playgroud)

生成一个随机文件 dd if=/dev/urandom of=random.txt count=128K bs=1024

131072+0 Datensätze ein
131072+0 Datensätze aus
134217728 Bytes (134 MB) kopiert, 12,8786 s, 10,4 MB/s
Run Code Online (Sandbox Code Playgroud)

zpool 列表在空池上的输出:

NAME   SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
tank  19,9G   134K  19,9G         -     0%     0%  1.00x  ONLINE  -
Run Code Online (Sandbox Code Playgroud)

然后使用不同的压缩算法将文件复制到数据集:

 cp random.txt /tank/lz4
 cp random.txt /tank/gzip9
Run Code Online (Sandbox Code Playgroud)

zfs list复制后的输出:

NAME         USED  AVAIL  REFER  MOUNTPOINT
tank         257M  19,1G    19K  /tank
tank/gzip9   128M  19,1G   128M  /tank/gzip9
tank/lz4     128M  19,1G   128M  /tank/lz4
Run Code Online (Sandbox Code Playgroud)

zpool list复制后的输出:

NAME   SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
tank  19,9G   129M  19,7G         -     0%     0%  2.00x  ONLINE  -
Run Code Online (Sandbox Code Playgroud)

将相同文件复制到不同数据集后,重复数据删除率为2.0。在我看来,这意味着重复数据删除是在压缩和加密之前对数据块进行的。

请问有人可以验证这是否正确吗?

Mar*_*itl 7

事实证明,http : //docs.oracle.com/cd/E36784_01/html/E36835/gkknx.html是正确的。

写入文件时,会压缩、加密数据并验证校验和。然后,如果可能,对数据进行重复数据删除。

我对随机文件的假设是不正确的。如果 ZFS 无法达到某个最小压缩比,它似乎会中止压缩。

引自https://wiki.illumos.org/display/illumos/LZ4+Compression

另一个需要特别注意的是,LZ4 在不可压缩数据上的性能非常高。它通过合并“早期中止”机制来实现这一点,如果 LZ4 不能满足预期的最小压缩率(ZFS 上为 12.5%),该机制将触发。

为了测试,我从我的文件系统创建了一个文本文件find / >> tree.txt

将文件复制到两个数据集然后zpool get dedupratio确实返回后:

NAME  PROPERTY    VALUE  SOURCE
tank  dedupratio  1.00x  -
Run Code Online (Sandbox Code Playgroud)

Dedup 实际上是这个写入链中的最后一部分。选择不同的压缩算法会导致重复数据不足!

不幸的是,我的 ZoL 版本不支持加密。但似乎加密不同的数据集也会破坏重复数据删除。加密信息:https : //docs.oracle.com/cd/E53394_01/html/E54801/gkkih.html