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 | ~ df ⮐ |
首先生成一个未压缩的镜像文件:
1 | ~ sudo dd if=/dev/mmcblk0 of=/mnt/exDisk/sys.img bs=4M ⮐ |
由于大部分空间是空数据,如果以 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 -9
和7z -mx=9
运行时的内存占用也高达 2GB 多,如果是小内存版本的树莓派也根本跑不起来。