背景 通常而言,服务发布平台的构建部署的流程(镜像部署除外)会经过构建(同步代码 -> 编译 -> 打包 -> 上传)、部署(下载包 -> 解压到目标机器 -> 重启服务)等步骤。以美团内部的发布平台 Plus 为例,最近我们发现一些发布项在构建产物打包压缩的过程中耗时比较久。如下图所示的 pack 步骤,一共消耗了1分23秒。 而在平常为用户解答运维问题的时候我们也发现,很多用户会习惯将一些较大的机器学习或者 NLP 相关的数据放入到仓库中,这部分数据往往占据几百兆,甚至占据几个GB的磁盘空间,十分影响打包的速度。 Java 项目也是如此,由于 Java 服务框架繁多,依赖也多,通常这些服务打包后也要占据百兆级别的空间,耗时也会达到十多秒。下图是我们的 pack 步骤的中位数,基本上大部分的 Java 服务和 Node.js 服务都至少要消耗 13s 左右的时间来做压缩打包 。 pack 作为几乎所有需要部署的服务必需步骤,它目前的耗时基本上仅低于编译和构建镜像,因此,为了提高整体构建的效率,我们准备对 pack 打包压缩的步骤进行一轮优化工作。 方案对比 准备场景数据 发布项的包大小分析 为了尽可能地模拟构建部署中的应用场景,我们将 2020 年的部分构建包数据进行了整理分析,其中压缩后的包大小如下图所示,钟形曲线说明了整体的包体积呈正态分布,并且有着较明显的长尾效应。压缩后体积主要在 200M 以内,压缩前的大小大致在 516.0MB 以内。 而 99%的服务压缩包大小会在 1GB 以内,而对于压缩步骤而言,其实越大的项目耗时越明显,优化的空间越大。因此,我们在针对性的方案对比测试中选择了 1GB 左右的构建包进行压缩测试,既能覆盖 99% 的场景,也可以看出压缩算法之间比较明显的提升。 这样选择的主要原因如下: 数据大的情况下计算结果会比小数据误差小很多。 能够覆盖绝大多数应用场景。 效果对比明显,可以看到是否有明显的提升。 备注:由于在相同压缩库相同压缩比等配置的情况下,Compression Speed 并没有明显变化,因此没有做其它包体积的批量测试和数据汇总。 本文中我们使用的测试项目为美团内部的较大型的 C++ 项目,其中文件类型除去 C++、Python、Shell 代码文件,还有 NLP、工具等二进制数据(不包括 .git 中存储的提交数据),数据类型比较全面。 目录大小为 1.2G,也可以比较清晰地对比出不同方案之间的差距。 gzip gzip 是基于 DEFLATE 的算法,它是 LZ77 和 Huffman 编码 的结合。DEFLATE 的目的是为了取代 LZW 和其他受专利保护的数