用同一份重复性文本日志,真实对比none/gzip/snappy/lz4/zstd五种压缩方式的磁盘占用和写入吞吐量,看压缩率和速度真实是怎么权衡的,本系列到这里暂告一段落。
命令 · shell $ kafka-topics.sh --create --topic comp-gzip --config compression.type=gzip ... $ kafka-producer-perf-test.sh --topic comp-gzip --num-records 100000 \ --payload-file real_repetitive_log.txt --producer-props compression.type=gzip $ kafka-log-dirs.sh --describe --topic-list comp-gzip ...
comp-none(uncompressed): 14335468 字节 comp-gzip: 2041345 字节 (压缩率约7.02x) comp-snappy: 3809979 字节 (压缩率约3.76x) comp-lz4: 4348187 字节 (压缩率约3.30x) comp-zstd: 2701030 字节 (压缩率约5.31x)
这份测试数据真实是模拟HTTP访问日志的重复性文本(方法名、路径、状态码这些高频重复的词),压缩算法真实对这类有大量重复模式的数据效果很好。gzip真实压出了最小的体积,zstd紧随其后,snappy和lz4这两个以"速度优先"著称的算法,真实压缩率明显更低。
compression.type=none: 284090 条/秒 compression.type=gzip: 222222 条/秒 compression.type=snappy: 91827 条/秒 ← 本机这次实测最慢 compression.type=lz4: 116414 条/秒 compression.type=zstd: 121654 条/秒
真实意外的是snappy——它通常以"压缩快"著称,但本机这次实测里反而是5种里最慢的,比lz4还慢了约21%。这提醒了一件事:不同压缩算法在不同CPU架构、不同数据特征下的真实表现会有差异,教程里常见的"snappy最快"这类结论不能直接照搬,真实的选型应该拿自己的真实数据和硬件跑一遍再下结论。真实能确定的规律是:none(不压缩)吞吐量最高,因为完全没有压缩计算开销;其它4种压缩算法都真实要付出CPU代价,具体谁快谁慢跟数据内容、CPU支持的指令集都有关系。
每一步都是本文上面用同一份真实数据跑出来的原始结果。