压缩在数据传输和存储过程中经常扮演着十分重要的角色,因此提高压缩的效率可以帮助我们节省时间和降低存储成本。本文介绍了压缩算法的优化在构建部署平台的应用,能够帮助研发团队提高研发和交付效率。
背景
通常而言,服务发布平台的构建部署的流程(镜像部署除外)会经过构建(同步代码 -> 编译 -> 打包 -> 上传)、部署(下载包 -> 解压到目标机器 -> 重启服务)等步骤。以美团内部的发布平台 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]和其他受专利保护的数据压缩算法,因为这些算法在当时限制了压缩和其他流行的存档器的可用性(Wikipedia)。
我们通常使用 tar -czf
命令来进行打包并且压缩的操作,z 参数正是使用 gzip 的方式来进行压缩。DEFLATE 标准(RFC1951)是一个被广泛使用的无损数据压缩标准。它的压缩数据格式由一系列块构成,对应输入数据的块,每一块通过 LZ77 (基于字典压缩,就是将最高概率出现的字母以最短的编码表示)算法和 Huffman 编码进行压缩,LZ77 算法通过查找并替换重复的字符串来减小数据体积。
文件格式
我们可以看到 gzip 是主要基于 CRC 和 Huffman LZ77 的 DEFLATE 算法,这也是后面 ISA-L 库的优化目标。
Brotli
Alakuijala 和 Szabadka 在 2013-2016 年完成了 Brotli 规范,该数据格式旨在进一步提高压缩比,它在优化网站速度上有大量应用。Brotli 规范的正式验证是由 Mark Adler 独立实现的。Brotli 是一个用于数据流压缩的数据格式规范,它使用了通用的 LZ77 无损压缩算法、Huffman 编码和二阶上下文建模(2nd order context modelling)的特定组合。大家可以参考[这篇论文]查看其实现原理。
因为语言本身的特性,基于上下文的建模方法 (Context Modeling)可以得到更好的压缩比,但由于它的性能问题很难普及。当前比较流行的突破算法有两种:
具体测试数据见下文。
Zstd
Zstd 全称叫 Zstandard,是一个提供高压缩比的快速压缩算法,主要实现的编程语言为 C,是 Facebook 的 Yann Collet 于2016年发布的,Zstd 采用了[有限状态熵](Finite State Entropy,缩写为FSE)编码器。该编码器是[由Jarek Duda 基于ANS 理论开发]的一种新型熵编码器,提供了非常强大的压缩速度/压缩率的折中方案(事实上也的确做到了“鱼”和“熊掌”兼得)。Zstd 在其最大压缩级别上提供的压缩比接近 lzma、lzham 和 ppmx,并且性能优于 lza 或 bzip2。Zstandard 达到了 [Pareto frontier](资源分配最佳的理想状态),因为它解压缩速度快于任何其他当前可用的算法,但压缩比类似或更好。
对于小数据,它还特别提供一个载入预置词典的方法优化速度,词典可以通过对目标数据进行训练从而生成。
官方 Benchmark 数据对比
压缩级别可以通过 --fast 指定,提供更快的压缩和解压缩速度,相比级别 1 会导致压缩比率的一些损失,如上表所示。Zstd 可以用压缩速度换取更强的压缩比。它是可配置的小增量,在所有设置下,解压缩速度都保持不变,这是大多数 LZ 压缩算法(如 zlib 或 lzma)共享的特性。
LZ4
LZ4是一种无损压缩算法,每核提供大于 500 MB/s的压缩速度(大于0.15 Bytes/cycle)。它的特点是解码速度极快,每核速度为多 GB/s( 约1 Bytes/cycle )。
从上面的 Zstd 的 Benchmark 对比中,我们看到了 LZ4 算法效果十分出众,因此我们也对 LZ4 进行了对比,LZ4 更加侧重压缩解压速度,尤其是解压缩的速度,压缩比并不是它的强项,它默认支持 1-9 的压缩参数,我们分别进行了测试。
LZ4 使用默认参数压缩速度十分优秀,比 Zstd 快很多,但是压缩比并不高,比 Zstd 压缩后多了 206 MB,足足多了 46%,这就意味着更多的数据传输时间和磁盘空间占用。即使是最大的压缩比也并不高,仅仅从 1.79 提升到了 2.11,但是耗时却从 5s 提升到了 51s。通过对比,LZ4 的确在压缩率上并不是最优秀的方案,在 2.x 级别压缩率上基本上时间优势荡然无存,而且还有一点,就是 LZ4 目前官方并没有对多核 CPU 并行压缩的支持,所以在后续的对比中,LZ4 丧失了压缩解压缩速度的优势。
Pigz
Pigz 的作者 Mark Adler,同时也是 Info-ZIP 的 zip 和 unzip、GNU 的 gzip 和 zlib 压缩库的共同作者,并且是 PNG 图像格式开发工作的参与者。
Pigz 是 gzip 的并行实现的缩写,它主要思想就是利用多个处理器和核。它将输入分成 128 KB 的块,每个块都被并行压缩。每个块的单个校验值也是并行计算的。它的实现直接使用了 zlib 和 pthread 库,比较易读,而且重要的是兼容 gzip 的格式。Pigz 使用一个线程(主线程)进行解压缩,但可以创建另外三个线程进行读、写和检查计算,所以在某些情况下可以加速解压缩。
一些博客在 i7 4790K 这样的家用 PC 平台中测试 Pigz 的压缩性能时,并没有十分高的速度,但在我们真机验证的数据中提升要明显很多。通过测试,它的压缩时间执行速度只用了 1.768s,充分发挥了我们平台物理机的性能,User 时间(CPU 时间之和)一共使用了 1m30.569s,这和前面的使用 gzip 单线程的方式速度几乎是一个级别。压缩率 2.5488 和正常使用 tar -czf
几乎相差不多。
ISA-L Acceleration Version
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 平台,本文中所提及的部分指令在该平台支持度不高甚至是不支持)。
ISA-L 对压缩算法主要做了 CRC、DEFLATE 和 Huffman 编码的优化实现,官方的数据指出 ISA-L 相比 zlib-1 有 5 倍的速度提升。
举例来说,不少底层的存储开源软件实现的 CRC 都使用了查表法,代码中存储或者生成了一个 CRC value 的表格,然后计算过程中查询值,ISA-L 的汇编代码中包含了无进位乘法指令 PCLMULQDQ 对两个64位数做无进位乘法,最大化 intel PCLMULQDQ 指令的吞吐量来优化 CRC 的性能。更好的情况是 CPU 支持 AVX-512,就可以使用 VPCLMULQDQ(PCLMULQDQ 在 EVEX 编码的 512 bit 版本实现)等其它优化指令集(查看是否支持的方式见文末“附录”)。
备注:截图内容来自 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 编码表,这些编译参数也会对库有很大提升。
压缩时间
real 0m1.372s
user 0m5.512s
sys 0m1.791s
测试后的效果相当惊人,是目前对比方案中最为快速的,时间上节省了 98.09%。
由于和 gzip 格式兼容,因此同样可以使用 tar -xf
命令进行解压,后续的解压缩测试过程中,我们使用的仍然是 ISA-L 提供的解压方式。
Pzstd
通过 Pigz 的测试,我们就在想,是否 Zstd 这样优秀的算法也可以支持并行呢,在官方的 Repo 中,我们十分惊喜地发现了一个“宝藏”。
Pzstd 是 C++11 实现的并行版本的 Zstandard (Zstd 也在这之后加入了多线程的支持),类似于 Pigz 的工具。它提供了与 Zstandard 格式兼容的压缩和解压缩功能,可以利用多个 CPU 核心。它将输入分成相等大小的块,并将每个块独立压缩为 Zstandard 帧。然后将这些帧连接在一起以产生最终的压缩输出。Pzstd 同样支持文件的并行解压缩。解压缩使用 Zstandard 压缩的文件时,PZstandard 在一个线程中执行 IO,而在另一个线程中进行解压缩。
下图是和 Pigz 的压缩和解压缩速度对比,来自官方 Github 仓库(机器配置为:Intel Core i7 @ 3.1 GHz, 4 threads),效果比 Pigz 还要出色,具体对比数据见下文:
Pied Piper (Middle-out compression)
Middle-out Compression 最初是在美剧中提到的一个概念,不过现在已经有了一个真正的实现 [middle-out] ,该算法目前小范围应用在压缩时序数据中,由于缺乏成熟地理论支撑以及数据对比,没有正式进入方案的对标。
备注:Pied Piper 是美剧《硅谷》 中虚拟出来的公司和算法。
兼容性
本文中调研所提及的对比方案,都是统一在构建集群中的机器中进行测试,由于构建系统 在线上的机器集群配置高度统一(包括硬件平台和系统版本),所以兼容性表现和测试数据也高度吻合。
选型
实际上,部分官方的测试机器的配置和美团构建平台的物理机配置并不一致,场景可能也有区别,上面引用的测试结果中所使用的CPU以及平台架构和编译环境和我们所用的也有些出入,而且大多数还是家用的硬件比如 i7-4790K 或者 i9-9900K,这也是需要使用构建平台的物理机和具体的构建包压缩场景来进行测试的原因,因为这样才能得出最接近我们使用场景的数据。
对比数据
几个方案的数据对比如下表格(在本文中的时间数据选择是通过多次运行后,选择结果的中位数):
压缩时间对比
从整个构建后的压缩构建包的时间可视化图中可以看出,最初版本的 gzip 压缩相当耗时,而采取 Pzstd 是最快速的方案,ISA-L 稍慢,Pigz 略微慢一点,这三者都可以达到从 1m11s 到 1s 左右的优化,最快可以节省 98.51% 的压缩时间。
解压缩时间对比
解压缩的时间上并没有像压缩效率相差很多,在 GB 级别的项目中压缩比 2.5-2.6 范围内时,时间都在 11s 以内。而且为了最大兼容已有的实现和保持稳定性,解压方案优先考虑兼容 gzip 格式的策略,这样对部署目标机器的侵入性最小,即可以使用 tar -xf
解压的方案优先。
而在后面的方案实施中,由于部署需要稳定可靠的环境,所以我们暂时没有对部署机器做环境改造。
下面的时间对比是分别使用各自的解压方案的对比:
压缩比的对比
压缩比的对比中 Zstd 和 Pzstd 有一些优势,其中 Brotli 和 LZ4 由于支持的参数限制,比较难测试同级别压缩比下的速度,因此选择了压缩比稍低的参数,但是效率仍然距离 Pigz 和 Pzstd 存在一些差距。
而 ISA-L 的实现在压缩比上有一些牺牲,不过并没有差距很大。
优劣分析总结
在本文开始阶段,我们介绍了构建部署流程,因此我们此次优化的目标时间大致计算公式如下:
在测试案例对比中,时间耗时的顺序为 Pzstd < ISA-L < Pigz < LZ4 < Zstd < Brotli < Gzip (排名越靠前越好),其中压缩和解压缩的时间在整体的耗时上占比较大,因此备选策略为 Pzstd、ISA-L、Pigz。
当然,这其中还存在磁盘空间的成本优化问题,即压缩比可能对磁盘空间产生优化,但是对构建的耗时会产生负优化,不过由于目前时间维度是我们优化的主要目标,比磁盘成本和上传带宽成本要重要,因此压缩比采用了较为普遍或者默认最优的压缩比方案,即在 2.3 - 2.6 范围内。不过在一些内存型数据库等存储介质成本较为高的场景中,也许要综合多个方面需要更多考量,请大家知悉。
评分策略
比较于 gzip,新算法都具有想当不错的速度,但是由于压缩格式的向前不兼容,加上需要客户端(部署目标机器)的支持,可能方案实施周期会较长。
而对于部署来说,可能收益并不是十分明显,反而加重了一些维护和运维成本,所以我们暂时没有把 Pzstd 的方案放到较高的优先级。
选型的策略主要有基于如下原则:
综合以上几点,决定一期采取 ISA-L 的方式加速,可以最稳定并且较高速地提升构建平台的效率,未来可能会实现 Pzstd 的方案,下面的数据为一期的结果。
优化效果
为了方便结果的展示,我们过滤出了部分打包时间较长的发布项展示出来(这些耗时很久的项目往往十分影响用户的使用体验,而且总体的占比在 10% 左右),这部分任务优化的时间从 27s 到 72s 不等,过去越是项目大的项目压缩时间越长,如今压缩时间都可以稳定在 10s 以内,而且是在我们的机器同时执行多个任务的情况下。
而后我们将优化前的 Pack 步骤(压缩+上传)部分打点数据,以及优化后的部分打点数据做了汇总,得出了平均的优化效果对比,数据如下:
压缩平均节省了 90% 的时间。
写在后面
本文由哈喽比特于3年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/9kdeSj0RwUvlIi4oBEF_Wg
京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。
日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。
据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。
今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。
日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。
近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。
据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。
9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...
9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。
据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。
特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。
据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。
近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。
据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。
9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。
《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。
近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。
社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”
2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。
罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。