在日常的开发和运维工作中,我们经常需要传输大量文件。当传输单个大文件时,网络带宽通常能被充分利用,速度令人满意。然而,一旦面对成千上万个小文件,传输速度便会急剧下降,令人抓狂。这背后的原因在于,每次文件传输都伴随着网络连接建立、元数据读写等额外开销。对于小文件而言,这些固定开销所占比例远超实际数据传输的时间. 本文参考美团技术团队的博客:https://tech.meituan.com/2021/01/07/pack-gzip-zstd-lz4.html 选择isa-l算法和Pigz算法进行测试。
使用macbook air m4 16g内存,4+4 核心,单核频率最大4.5GHz
ISA-L 是一套在 IA 架构上加速算法执行的开源函数库,目的在于解决存储系统的计算需求。 ISA-L 使用的是 BSD-3-Clause License ,因此在商业上同样可以使用。
使用过 SPDK(Storage Performance Development Kit )或者 DPDK(Data Plane Development Kit)应该也听说过 ISA-L ,前者使用了 ISA-L 的 CRC 部分,后者使用了它的压缩优化。ISA-L 通过使用高效的 SIMD (Single Instruction, Multiple Data)指令和专用指令,最大化的利用 CPU 的微架构来加速存储算法的计算过程。ISA-L底层函数都是使用手工汇编代码编写,并在很多细节上做了调优(现在经常要考虑 ARM 平台,本文中所提及的部分指令在该平台支持度不高甚至是不支持)。
首先安装
brew install isa-l
测试压缩:
time tar cf - ./海事事故数据 | igzip > demo.tar.gz
这个文件夹大约7.95G,大量的小型pdf文件,测试结果:
tar cf - ./海事事故数据 0.18s user 1.53s system 3% cpu 51.342 total igzip > demo.tar.gz 41.62s user 1.26s system 83% cpu 51.343 total
测试解压:
time igzip -dc demo.tar.gz | tar xf -
测试结果:
igzip -dc demo.tar.gz 15.86s user 1.53s system 82% cpu 20.961 total tar xf - 0.26s user 4.06s system 20% cpu 20.962 total
测试压缩:
time tar -cf - ./海事事故数据 | pigz > demo.tar.gz
测试结果:
tar -cf - ./海事事故数据 0.31s user 2.85s system 11% cpu 28.507 total pigz > demo.tar.gz 163.13s user 6.14s system 593% cpu 28.508 total
解压测试:
time pigz -dc demo.tar.gz | tar -xf -
测试结果:
pigz -dc demo.tar.gz 9.26s user 3.81s system 117% cpu 11.169 total tar -xf - 0.33s user 4.56s system 43% cpu 11.175 total
可以看到Pigz算法在压缩速度上优势比较明显,因为是并行的,如果是服务器100多核心的,可能优势更大。不过占用资源也是真的。一般来讲,服务器不需要跑什么服务,或者不是用在生产环节,使用Pigz能够更加节约时间。 ⚠️:一定不要在U盘下进行压缩操作,U盘的读写速度非常差,并且很多文件格式只支持最大4G!!!
压缩大文件,每个分卷3G
tar -cf - large_project | pigz | split -b 3G - large_project_archive.tar.gz.
解压分卷
cat /path/to/archive.tar.gz.* | pigz -dc | tar -xf -
本文作者:James
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!