速度与压缩比如何兼得?压缩算法在构建部署中的优化

通常而言,服务发布平台的构建部署的流程(镜像部署除外)会经过构建(同步代码->编译->打包->上传)、部署(下载包->解压到目标机器->重启服务)等步骤。以美团内部的发布平台Plus为例,最近我们发现一些发布项在构建产物打包压缩的过程中耗时比较久。如下图所示的pack步骤,一共消耗了1分23秒。

pack作为几乎所有需要部署的服务必需步骤,它目前的耗时基本上仅低于编译和构建镜像,因此,为了提高整体构建的效率,我们准备对pack打包压缩的步骤进行一轮优化工作。

发布项的包大小分析

为了尽可能地模拟构建部署中的应用场景,我们将2020年的部分构建包数据进行了整理分析,其中压缩后的包大小如下图所示,钟形曲线说明了整体的包体积呈正态分布,并且有着较明显的长尾效应。压缩后体积主要在200M以内,压缩前的大小大致在516.0MB以内。

而99%的服务压缩包大小会在1GB以内,而对于压缩步骤而言,其实越大的项目耗时越明显,优化的空间越大。因此,我们在针对性的方案对比测试中选择了1GB左右的构建包进行压缩测试,既能覆盖99%的场景,也可以看出压缩算法之间比较明显的提升。

这样选择的主要原因如下:

备注:由于在相同压缩库相同压缩比等配置的情况下,CompressionSpeed并没有明显变化,因此没有做其它包体积的批量测试和数据汇总。

本文中我们使用的测试项目为美团内部的较大型的C++项目,其中文件类型除去C++、Python、Shell代码文件,还有NLP、工具等二进制数据(不包括.git中存储的提交数据),数据类型比较全面。

目录大小为1.2G,也可以比较清晰地对比出不同方案之间的差距。

我们通常使用tar-czf命令来进行打包并且压缩的操作,z参数正是使用gzip的方式来进行压缩。DEFLATE标准(RFC1951)是一个被广泛使用的无损数据压缩标准。它的压缩数据格式由一系列块构成,对应输入数据的块,每一块通过LZ77(基于字典压缩,就是将最高概率出现的字母以最短的编码表示)算法和Huffman编码进行压缩,LZ77算法通过查找并替换重复的字符串来减小数据体积。

文件格式

我们可以看到gzip是主要基于CRC和HuffmanLZ77的DEFLATE算法,这也是后面ISA-L库的优化目标。

因为语言本身的特性,基于上下文的建模方法(ContextModeling)可以得到更好的压缩比,但由于它的性能问题很难普及。当前比较流行的突破算法有两种:

具体测试数据见下文。

对于小数据,它还特别提供一个载入预置词典的方法优化速度,词典可以通过对目标数据进行训练从而生成。

官方Benchmark数据对比

压缩级别可以通过–fast指定,提供更快的压缩和解压缩速度,相比级别1会导致压缩比率的一些损失,如上表所示。Zstd可以用压缩速度换取更强的压缩比。它是可配置的小增量,在所有设置下,解压缩速度都保持不变,这是大多数LZ压缩算法(如zlib或lzma)共享的特性。

LZ4是一种无损压缩算法,每核提供大于500MB/s的压缩速度(大于0.15Bytes/cycle)。它的特点是解码速度极快,每核速度为多GB/s(约1Bytes/cycle)。

从上面的Zstd的Benchmark对比中,我们看到了LZ4算法效果十分出众,因此我们也对LZ4进行了对比,LZ4更加侧重压缩解压速度,尤其是解压缩的速度,压缩比并不是它的强项,它默认支持1-9的压缩参数,我们分别进行了测试。

Pigz的作者MarkAdler,同时也是Info-ZIP的zip和unzip、GNU的gzip和zlib压缩库的共同作者,并且是PNG图像格式开发工作的参与者。

Pigz是gzip的并行实现的缩写,它主要思想就是利用多个处理器和核。它将输入分成128KB的块,每个块都被并行压缩。每个块的单个校验值也是并行计算的。它的实现直接使用了zlib和pthread库,比较易读,而且重要的是兼容gzip的格式。Pigz使用一个线程(主线程)进行解压缩,但可以创建另外三个线程进行读、写和检查计算,所以在某些情况下可以加速解压缩。

使用过SPDK(StoragePerformanceDevelopmentKit)或者DPDK(DataPlaneDevelopmentKit)应该也听说过ISA-L,前者使用了ISA-L的CRC部分,后者使用了它的压缩优化。ISA-L通过使用高效的SIMD(SingleInstruction,MultipleData)指令和专用指令,最大化的利用CPU的微架构来加速存储算法的计算过程。ISA-L底层函数都是使用手工汇编代码编写,并在很多细节上做了调优(现在经常要考虑ARM平台,本文中所提及的部分指令在该平台支持度不高甚至是不支持)。

ISA-L对压缩算法主要做了CRC、DEFLATE和Huffman编码的优化实现,官方的数据指出ISA-L相比zlib-1有5倍的速度提升。

举例来说,不少底层的存储开源软件实现的CRC都使用了查表法,代码中存储或者生成了一个CRCvalue的表格,然后计算过程中查询值,ISA-L的汇编代码中包含了无进位乘法指令PCLMULQDQ对两个64位数做无进位乘法,最大化intelPCLMULQDQ指令的吞吐量来优化CRC的性能。更好的情况是CPU支持AVX-512,就可以使用VPCLMULQDQ(PCLMULQDQ在EVEX编码的512bit版本实现)等其它优化指令集(查看是否支持的方式见“附录”)。

备注:截图来自crc32_ieee_by16_10.asm

使用

ISA-L实现的压缩优化级别支持[0,3],3为压缩比最大的版本,综合考虑我们采用了最大的压缩比,虽然压缩比2.346略低于gzip不过影响不大。在2019年6月发布的v2.27版本里,ISA-L加了多线程的Feature,因此在后续的测试中,我们采用了多线程并发的参数,效果提升比较显著。

由于我们构建机器的系统为Centos7需要自行编译ISA-L的依赖,比如nasm等库,所以在安装配置上会比较复杂,ISA-L支持多种优化参数比如,IGZIP_HIST_SIZE(压缩过程中加大滑动窗口),LONGER_HUFFTABLES,更大的Huffman编码表,这些编译参数也会对库有很大提升。

由于和gzip格式兼容,因此同样可以使用tar-xf命令进行解压,后续的解压缩测试过程中,我们使用的仍然是ISA-L提供的解压方式。

通过Pigz的测试,我们就在想,是否Zstd这样优秀的算法也可以支持并行呢,在官方的Repo中,我们十分惊喜地发现了一个“宝藏”。

Pzstd是C++11实现的并行版本的Zstandard(Zstd也在这之后加入了多线程的支持),类似于Pigz的工具。它提供了与Zstandard格式兼容的压缩和解压缩功能,可以利用多个CPU核心。它将输入分成相等大小的块,并将每个块独立压缩为Zstandard帧。然后将这些帧连接在一起以产生最终的压缩输出。Pzstd同样支持文件的并行解压缩。解压缩使用Zstandard压缩的文件时,PZstandard在一个线程中执行IO,而在另一个线程中进行解压缩。

下图是和Pigz的压缩和解压缩速度对比,来自官方Github仓库(机器配置为:IntelCorei7@3.1GHz,4threads),效果比Pigz还要出色,具体对比数据见下文:

备注:PiedPiper是美剧《硅谷》中虚拟出来的公司和算法。

本文中调研所提及的对比方案,都是统一在构建集群中的机器中进行测试,由于构建系统在线上的机器集群配置高度统一(包括硬件平台和系统版本),所以兼容性表现和测试数据也高度吻合。

实际上,部分官方的测试机器的配置和美团构建平台的物理机配置并不一致,场景可能也有区别,上面引用的测试结果中所使用的CPU以及平台架构和编译环境和我们所用的也有些出入,而且大多数还是家用的硬件比如i7-4790K或者i9-9900K,这也是需要使用构建平台的物理机和具体的构建包压缩场景来进行测试的原因,因为这样才能得出最接近我们使用场景的数据。

而在后面的方案实施中,由于部署需要稳定可靠的环境,所以我们暂时没有对部署机器做环境改造。

压缩比的对比

压缩比的对比中Zstd和Pzstd有一些优势,其中Brotli和LZ4由于支持的参数限制,比较难测试同级别压缩比下的速度,因此选择了压缩比稍低的参数,但是效率仍然距离Pigz和Pzstd存在一些差距。

而ISA-L的实现在压缩比上有一些牺牲,不过并没有差距很大。

优劣分析总结

比较于gzip,新算法都具有想当不错的速度,但是由于压缩格式的向前不兼容,加上需要客户端(部署目标机器)的支持,可能方案实施周期会较长。

而对于部署来说,可能收益并不是十分明显,反而加重了一些维护和运维成本,所以我们暂时没有把Pzstd的方案放到较高的优先级。

选型的策略主要有基于如下原则:

综合以上几点,决定一期采取ISA-L的方式加速,可以最稳定并且较高速地提升构建平台的效率,未来可能会实现Pzstd的方案,下面的数据为一期的结果。

而后我们将优化前的Pack步骤(压缩+上传)部分打点数据,以及优化后的部分打点数据做了汇总,得出了平均的优化效果对比,数据如下:

宏达,美团基础技术部研发工程师。

基础技术部-研发质量及效率部-代码仓库和构建组,团队旨在建设代码仓库管理、协作及代码构建能力,完善多维度的工作流执行引擎及构建工具链,与公司其他研发工具打通,提高业务整体的开发、交付效率。

机器环境

文中的测试统一在如下物理机中进行,测试中使用相同的目标文件。测试机使用的是非PCIESSD磁盘。

THE END
1.科技巨头推出新一代人工智能算法预计将彻底改变数据处理效率新算法的核心技术 人工智能领域的最新进展显示了一个重大突破:新一代的人工智能算法,其核心技术在于一种全新的神经网络架构设计。该设计能够显著提高计算机学习和数据处理的速度与效率。这意味着未来的人工智能系统将能够更快地分析大量复杂数据,从而在医疗、金融、交通等行业中发挥更大的作用。 https://www.vjvqxysd.cn/bai-jia-dian/512055.html
2.机器学习找不到创新点?三种特征选择的方法包你拿下顶会!3.提供了七个黑盒AI模型在合成和真实世界网络入侵数据集上的实证比较。 4.开源了基于XAI的特征选择框架,供社区使用和扩展。 轻量级特征选择 shap-select框架 文章解析 文章介绍了一种新的特征选择框架shap-select,该框架通过在验证集上对目标变量与原始特征的SHAP值进行线性或逻辑回归,并根据回归系数的符号和显著性水https://www.bilibili.com/read/cv40067807
3.深入探索神经网络反向传播算法是最基本的优化算法,每次更新参数都是基于当前样本的梯度计算。虽然收敛速度较快,但由于随机性较大,容易受到噪音的影响,收敛不稳定。 算法在SGD的基础上引入了动量项,可以加速模型训练,并且在梯度方向改变时有一定的惯性,有利于减少参数更新时的震荡。 算法根据参数的历史梯度调整学习率,可以自适应地调整各个参数的学习https://www.jianshu.com/p/2548f5df22f1
4.《光谱学与光谱分析》2023年,第43卷,第02期最后,利用所训练出的模型对太赫兹频域高频区域图像进行盲去噪,并用重建图像分别与原始成像结果和传统太赫兹去噪算法结果进行比较,分别从主观和客观两个方面评价了不同算法对太赫兹频域高频图像的去噪效果。实验结果表明,通过该算法实现了极限空间分辨率约为157 μm,去噪后图像极限空间分辨率处的瑞利判据鞍-峰比约为0.623,http://www.sinospectroscopy.org.cn/readnews.php?nid=97530
5.独家发布!10个2024年新算法跑10个测试集!2024新算法每个算法都是独立.m文件,高效管理,所有结果均可一键运行自动保存,可用于算法对比、学习、改进等等,趁现在知道的人少,先用先发,可定制改进算法和各种应用。 一、10个2024年新算法介绍 1.苦鱼优化算法(Bitterling Fish Optimization,BFO) 摘要:苦鱼是自然界中为了生存而表现出智能行为的典型例子。苦鱼用牡蛎产卵的https://blog.csdn.net/2301_82017165/article/details/136943200
6.几种现代优化算法的比较研究(通用7篇)【导语】下面是小编为大家整理的几种现代优化算法的比较研究(共7篇),供大家参考借鉴,希望可以帮助到有需要的朋友。 篇1:几种现代优化算法的比较研究 几种现代优化算法的比较研究 摘要:现代优化算法主要包括遗传算法、蚁群算法、禁忌搜索算法.这些算法主要是解决优化问题中的难解问题.由于这些算法在求解时不依赖于梯度https://www.hrrsj.com/wendang/qitafanwen/760240.html
7.2022下半年盘点:20+主流数据库重大更新及技术要点汇总在即将发布的新版本中,PieCloudDB Database将为用户带来内核和云原生平台多方位的大幅提升,包括极速vacuum、全新的缓存实现、极速Analyze、用户数据存储的分布式处理增强、HDFS/NAS支持,Kafka支持以及ETL/ELT增强等多个重大新特性。? 云原生、分布式发展如火如荼 https://www.51cto.com/article/744621.html
8.人教版三年级数学上《口算两位数加两位数》教学反思范文(通用10篇)在新知的教学上,我通过创设学生熟悉的跳绳场景,在生活情境中使学生经历提出数学问题——列出算式——探究算法——巩固算法的过程。其中探究算法这一部分,我们先研究不进位加法,我通过组织学生小组活动,让学生充分阐述自己的算法,在交流中不自觉的对算法进行比较,一方面使学生感受算法的多样化,另一方面寻找最优化算法。在https://www.ruiwen.com/jiaoxuefansi/3461381.html
9.一种边缘计算环境中功耗优化的负载任务迁移算法在边缘计算架构中,边缘节点处于远离云计算中心的地理位置,其对迁移时间的影响不可忽视,所以在边缘环境中的任务迁移调度算法必然要考虑到迁移时间对服务质量带来的影响。另外一方面,目前尚未存在针对边缘计算的功耗、CPU利用率和温度等度量指标对节点任务进行优化调度的算法,而边缘计算本身也是一个近几年来出现的新概念,https://wenku.baidu.com/view/5b4900a368d97f192279168884868762caaebba8.html
10.基础研究新进展和新成果非线性光学晶体、量子信息和通信、超强超短激光研究居国际前列;纳米材料和纳米结构、蛋白质结构与功能、脑与认知、动物克隆、创造新物质的分子工程学、古生物学、海洋科学等领域取得系列创新成果,整体研究水平显著提高,在国际上产生重要影响;数学机械化、辛几何算法等方面保持我国特色和优势。 https://www.most.gov.cn/ztzl/jqzzcxxqx/jqzzcxxqxxtp/200606/t20060612_33902.html
11.美颜技术近几年的数据图片分析怎么写帆软数字化转型知识库美颜技术在过去几年的发展中取得了显著的进步,其普及率、用户群体、技术多样性和复杂性都得到了极大的提升。未来,美颜技术将继续在算法优化、新功能开发和应用场景扩展上实现创新和突破。随着人工智能和深度学习技术的不断进步,美颜技术将更加注重个性化和自然化,通过深度学习算法实现更为精准的面部识别和优化调整。同时https://www.fanruan.com/blog/article/357819/
12.果蝇优化算法的加权策略研究AET关键词: 加权因子;果蝇优化算法;线性递减策略;先增后减策略 果蝇优化算法FOA(Fruit Fly Optimization Algorithm)是由台湾博士潘文超于2011年提出的,与蚁群算法和粒子群算法类似,是基于动物群体觅食行为演化出的一种寻求全局优化的新方法[1-3]。它不同于顺序执行的传统智能算法,而是以果蝇群体自组织性和并行性为基础,http://www.chinaaet.com/article/3000004316
13.科学网—[转载]进化集成学习算法综述【摘 要】进化集成学习结合了集成学习和进化算法两方面的优势,并在机器学习、数据挖掘和模式识别等领域被广泛应用。首先对进化集成学习算法的理论基础、组成结构及分类情况进行了概述。然后根据进化算法在集成学习中的优化任务,从样本选择、特征选择、集成模型参数组合优化、集成模型结构优化以及集成模型融合策略优化几个方面https://wap.sciencenet.cn/blog-951291-1312816.html
14.OpenAI公布强化学习新算法,可控制复杂机器人OpenAI公布强化学习新算法,可控制复杂机器人 近日,OpenAI 发布了一种新型的强化学习算法:近端策略优化(Proximal Policy Optimization,简称 PPO),这种算法不但在性能上比肩甚至超过当前最先进的方法,而且更容易实现和调试。由于 PPO 易于使用并且性能优秀,OpenAI 已将其设为默认的强化学习算法。https://cloud.tencent.com/developer/article/1109341