zstd xz 7z lz4 管道压缩效率比较

担心 TF 卡易损坏导致重新配置系统的麻烦,我准备定期使用 dd 对树莓派进行全卡备份:

1
sudo dd if=/dev/mmcblk0 of=/mnt/momoda/$(date +%Y-%m-%d)-sysbak.img

尽管使用的是 64GB 的 TF 卡,生成的镜像文件也是 64GB。然而,实际系统盘的数据占用并不多,大部分空间是空白。因此,我选择通过管道压缩备份数据的方式以节省存储空间,并测试了几种支持管道的压缩算法的性能。

测试环境:

系统存储被分为 /dev/mmcblk0p1 和 /dev/mmcblk0p2 两个分区,实际上是同一张 TF 卡,目前总空间使用率约为 10%。目标是定期对全盘进行备份以应对意外,同时通过压缩方式保存数据,减少备份所需的存储空间。由于备份操作在运行中的设备上进行,数据在此期间仍可能被读写,因此选择的压缩算法需要尽可能高效,以减少数据变动的影响。

全盘空间信息:

1
2
3
4
5
6
7
8
9
~ df
Filesystem 1K-blocks Used Available Use% Mounted on
udev 3728364 0 3728364 0% /dev
tmpfs 799744 3176 796568 1% /run
/dev/mmcblk0p2 59551920 5034336 51780988 9% /
tmpfs 3998704 0 3998704 0% /dev/shm
tmpfs 5120 16 5104 1% /run/lock
/dev/mmcblk0p1 522232 66728 455504 13% /boot/firmware
tmpfs 799740 0 799740 0% /run/user/1000

首先生成一个未压缩的镜像文件:

1
2
3
4
5
~ sudo dd if=/dev/mmcblk0 of=/mnt/exDisk/sys.img bs=4M ⮐
14909+1 records in
14909+1 records out
62534975488 bytes (63 GB, 58 GiB) copied, 1459.15 s, 42.9 MB/s
# 如果压缩算法在树莓派的 CPU 上能达到 42.9 MB/s 的处理速度,就可以认为压缩完全不影响原备份速度。

由于大部分空间是空数据,如果以 63GB 为基数计算,压缩后的文件大小差异将显得微不足道。因此,下表中的百分比均以 zstd 默认压缩率的结果作为 100% 的基准进行比较。

同时,受限于树莓派的储存方式,该镜像放在了另一台 NAS 上,两台机器间的传输能力为千兆有线,纯传输时间最低约为 536 秒。

算法 压缩参数 压缩时间秒 压缩后字节 时间比 体积比 备注
zstd -T2 -1 771.511 2574731933 89.66% 108.84%
zstd -T2 860.439 2365713277 100.00% 100.00% 默认压缩率档位 3
zstd -T2 -10 1274.784 2190541240 148.16% 92.60%
zstd -T2 -19 4416.055 2009856914 513.23% 84.96%
xz -T2 -0 1798.904 2293838248 209.07% 96.96%
xz -T2 4475.497 1924084292 520.14% 81.33% 默认压缩率档位 6
xz -T2 -9 5041.978 1803774144 585.98% 76.25%
xz -T2 -9e 8380.731 1801292000 974.01% 76.14% e: 消耗额外时间进一步提高压缩率
7z -mmt=2 -mx=1 1896.414 2330130495 220.40% 98.50%
7z -mmt=2 7938.620 1870578044 922.62% 79.07% 默认压缩率档位 5
7z -mmt=2 -mx=9 13600.655 1788204019 1580.66% 75.59%
lz4 -fast 606.257 3529871893 70.46% 149.21% lz4 没有多线程参数
lz4 640.828 3458840786 74.48% 146.21%
lz4 -best 2613.739 3038936614 303.77% 128.46%

测试结果

  • 总体来看,zstd 的性价比明显高于 xz 和 7z 等其它算法。
  • lz4 的速度极快。尽管没有多线程参数,单核性能仍快于其它算法的双核表现。然而,其较低的压缩率不适合作为备份用途,更适合处理持续性超大量数据的场景。
  • 使用 lz4 -fast 时,压缩算法的数据吞吐量已经超过数据传输的上限。这是硬盘的瓶颈,不是算法的处理上限。
  • 由于 TF 卡的读取速度更低,因此对于本文的需求而言,压缩时间低于 1459.15 秒时,是算法在等待数据读取,此时时间消耗的差异不再有区别。
  • 综合考虑数据分布和性能表现,zstd -T2 -10 是当前测试中最合适的选择。可以进一步测试 -8-12 等参数,以在 TF 卡读取时间内达到最佳压缩率。由于 TF 卡和 CPU 性能的差异,最佳方案会有所不同,需根据具体情况选择。
  • 在测试过程中,发现 xz -97z -mx=9 运行时的内存占用也高达 2GB 多,如果是小内存版本的树莓派也根本跑不起来。