服务粉丝

我们一直在努力
当前位置:首页 > 财经 >

云原生场景下实现编译加速

日期: 来源:ImportNew收集编辑:

(给ImportNew加星标,提高Java技能)


背景


云原生下的流水线是通过启动容器来运行具体的功能步骤,每次运行流水线可能会被调度到不同的计算节点上。这会导致一个问题:容器运行完是不会保存数据的,每当流水线重新运行时,又会重新拉取代码、编译代码、下载依赖包等等。在云原生场景下,不存在本地宿主机编译代码、构建镜像时缓存的作用,大大延长了流水线运行时间,浪费很多不必要的时间、网络和计算成本。

在许多流水线场景中,同一条流水线的多次执行之间是有关联的。如果能够用到上一次的执行结果,则可以大幅缩短执行时间。为了提高用户使用流水线的体验,我们加入支持缓存的功能,挂接远程储存管理构建缓存,可以实现同一个项目的编译依赖复用,在同一条流水线的多次运行中,共享同一份缓存。

目标


通过实现云原生流水线的缓存技术,实现代码编译的缓存复用,平均加速流水线 3~5 倍

实现方案


我们将需要进行缓存的文件,使用 zstd 的方式进行压缩,通过远程挂载 cfs,将构建的缓存持久化到 cfs 上的指定位置。当下一次构建开始的时候,判断缓存是否被命中,如果命中缓存,我们从 cfs 上的指定位置 pull 对应的缓存压缩包,解压到相应目录下。


所用工具 - cfs+zstd


非用户自定义镜像,将需要的工具打到引擎的基础镜像中,作为所有镜像的基础工具。
用户自定义镜像,不和用户镜像进行强绑定,如果需要使用缓存功能,可以使用 Restore 缓存原子和 Save 缓存原子,设置缓存 key 和缓存目录,实现缓存功能。

1. cfs 远程挂载


  • 将工具和启动脚本,配置文件打到基础镜像;

  • 启缓存的位置,启动脚本,开始挂载 cfs。


_, err = c.ScriptAction.Sh([]string{    "sh",  "-c",  "modprobe fuse;cd /export/servers/tools/cfs;sudo ./cfs-client-randomwrite -c fuse.json",})


2. zstd 压缩


针对现有的几种压缩方式进行了性能对比,最后选用了 zstd 进行压缩。

Zstd,全称 Zstandard,是 Facebook 于 2016 年开源的新无损压缩算法。Zstd 还可以以压缩速度为代价提供更强的压缩比,速度与压缩率的比重可通过增量进行配置。与 zlib、lz4、xz 等当前流行的压缩算法不同,Zstd 寻求一种压缩性能与压缩率通吃的方案,而实际上它也确实做到了。在由官方所列出的表格中,可以看到,Zstd 不仅具备优秀的压缩性能,在压缩率上也有非常亮眼的表现。在过去的两年里,Linux 内核、HTTP 协议、以及一系列的大数据工具(包括 Hadoop 3.0.0、HBase 2.0.0、Spark 2.3.0、Kafka 2.1.0)等都已经加入了对 zstd 的支持。

常见的压缩算法性能对比:


压缩包大小对比:


缓存的实现


我们借鉴了 github cache action,zadig,gitlab 等缓存的处理方式,同时结合服务自身的特点.

将整体分成三步:

  • 检查是否命中缓存:根据缓存 key,判断缓存是否命中;


  • pull 缓存:当缓存命中后,根据缓存路径,找到挂载到 cfs 上的缓存压缩包,解压到指定的缓存目录下。


  • push 缓存:将依赖包进行压缩,放到 cfs 的挂载目录下:





缓存的使用限制和回收策略


使用限制


目前存储缓存数没有限制,存储库中所有缓存的总大小限制是根据申请的 cfs 的大小限制:20G。

回收策略


我们会删除 7 天内未被访问的任何缓存。利用 etcd 的 watch 机制,实现缓存的回收。
etcd 可以 Watch 指定的键、前缀目录的更改,并对更改时间进行通知。BASE 引擎中,缓存的清除策略借助 etcd 来实现。

缓存过期策略:在编译加速的实现中,每个需要缓存的项目都有对应的缓存 key,通过 etcd 监控 key,并且设置过期时间,例如 7 天,如果在 7 天之内再次命中 key,则通过 lease 进行续约;7 天之内 key 都没有被使用,key 就会过期删除,通过监听对应的前缀,在过期删除的时候,调用删除缓存的方法。

storage.Watch("cache/",    func(id string) {      //do nothing    },    func(id string) {      CleanCache(id)    })

不同技术栈的最佳实践


Java


以 Maven 构建工具为例,其默认配置文件位于 conf/settings.xml 文件中,默认指定环境变量 $M2_HOME 来设置缓存目录,这样同一条流水线多次执行可以复用 ${M2_HOME}/.m2 目录 (缓存目录),甚至同一个应用下的多个分支之间都可以使用同一个缓存目录,就像本地构建一样。

NodeJS


在 nodejs 编译中,我们的缓存目录是当前用户空间,针对 node_modules 文件进行压缩打包,push 到 cfs;如果缓存命中,从 cfs 上 pull 并且解压到当前用户空间下,恢复缓存。

使用举例


Golang 编译


Golang 缓存路径通过 $GOCACHE 环境变量控制,将 $GOCACHE 的内容压缩成 zstd 的包,上传到 cfs 的指定路径下。pull 缓存的时候,拉取到对应的 $GOCACHE。


GCC 编译


我们使用 ccache 进行缓存实现。ccache(“compilercache” 的缩写)是一个编译器缓存,该工具会高速缓存编译生成的信息,并在编译的特定部分使用高速缓存的信息。ccache 的缓存目录:CCACHE_DIR,我们将这个目录下的文件进行压缩,push 到 cfs,当第二次运行并且命中缓存,从 cfs 上 pull 并解压到 CCACHE_DIR 指定的目录下。

总结


在不同语言的编译原子内部,默认开启缓存的设置。第一次运行流水线的时候,会进行依赖的下载,第二次运行流水线,会命中缓存,无需进行依赖的下载,提高了流水线执行的效率。缓存默认保存 7 天。

自定义镜像进行缓存的最佳实践


为了满足用户使用自定义镜像的方式触发流水线,我们增加了两个通用的缓存原子。


  • estore 缓存:恢复缓存
  • Save 缓存:保存缓存



在编译之前,添加 Restore 缓存原子:


在编译之后,添加 Save 缓存原子:


使用举例


在 maven 编译原子中,默认开启了 maven 编译的缓存;同时还有 nodejs 的编译构建,所以我们增加了 restore 原子和 save 原子。

BASE 执行
无缓存平均时间:21min57s 其中 maven: 17min83s nodejs: 4min19s
有缓存平均时间:4min20s 其中 maven: 1min10s nodejs: 2min36s
缓存效率提升maven:93.7% nodejs:39.8%(nodejs 编译中有包含单元测试)
缓存命中率接近 100%


未来规划


  • 不同编译原子,向用户开放配置,如是否开启缓存,设置缓存 key;

  • 实现不同语言编译原子增量 push 缓存功能。

转自:OSChina / 京东零售 王雷,

链接:my.oschina.net/u/4090830/blog/7091588



- EOF -

推荐阅读  点击标题可跳转

1、云原生时代的 Java 虚拟机

2、Java 运行包精简探索(GraalVM)

3、Java 云原生微服务框架 Quarkus 入门实践


看完本文有收获?请转发分享给更多人

关注「ImportNew」,提升Java技能

点赞和在看就是最大的支持❤️


相关阅读

  • 博客、笔记图床全“炸”了,一个方法秒解决!

  • 一件事情,如果你觉得它会发生,那么它就一定会发生。做为国内最好的“微博图床”(没有之一),经过了多次限制整改都“挺”了过来,然而这一次的力度可谓历史空前。2023 年初。所有微
  • 全网仅此一款APP,手慢无!!

  • 资源获取方式在文末 BILIBILIAS安卓我们有时候看B站的时候,经常碰到一些优秀的视频,苦于没有办法保存,或者很多第三方工具是没有手机端的,今天给大家推荐的这款下载工具,完美解决
  • 孙伯鍨 | 关于马克思的《博士论文》

  • 关于马克思的《博士论文》孙伯鍨作者简介:我国著名的马克思主义哲学家,中国马克思主义哲学史研究的开创者之一,南京大学马克思主义哲学重点学科的奠基者。论题的选定马克思关于
  • 国内最流行的缓存框架,它排第一!

  • 最近面试的、跳槽的一波又一波,学习群里也异常活跃,很多小伙伴在里面反馈问题,一起复盘,还是很有收获的。有面了十多家一二线互联网公司的卷王谈到,发现在Java后端面试中,Redis是
  • 要跳槽的建议赶紧

  • 作为缓存工具,Redis最广为人知的特点就是快,到底有多快呢?Redis单机qps(每秒的并发)可以达到110000次/s,写的速度是81000次/s。那么,Redis为什么能这么快呢?大家能秒答出来吗?问题不
  • 原子之心 | 苏联队长会梦见机械农庄的炸肉包吗?

  • 点击上边的“机核”关注我们,这里不止是游戏 这是一篇《原子之心》的体验文章,但我认为总体来讲现有的评价体系对于这个游戏并不太适用,因为它优秀的地方过于突出,糟糕的地方又

热门文章

  • “复活”半年后 京东拍拍二手杀入公益事业

  • 京东拍拍二手“复活”半年后,杀入公益事业,试图让企业捐的赠品、家庭闲置品变成实实在在的“爱心”。 把“闲置品”变爱心 6月12日,“益心一益·守护梦想每一步”2018年四

最新文章

  • 云原生场景下实现编译加速

  • (给ImportNew加星标,提高Java技能)背景云原生下的流水线是通过启动容器来运行具体的功能步骤,每次运行流水线可能会被调度到不同的计算节点上。这会导致一个问题:容器运行完是不
  • Word 超神插件,用了才知道有多爽!

  • 打工人,打工魂,小伙伴们,精神状态还稳定吗?当然我没有嘲讽和幸灾乐祸的意思,毕竟我这不也在码字么,人类的悲欢有时候是可以相通的……既然逃不开干活的宿命,那就只能找个趁手的工具
  • Chatgpt 能帮我下片了!

  • 关于下载网页上的视频,相信每个小伙伴的手里都有那么三把斧,什么嗅探,什么解析等等,我们也写过很多了,比如之前咱们不还研究过 M3U8 下片的姿势,
  • 为什么你还要用付费的PDF 工具,这个不香吗?

  • 咱们上期说到上班,啊不对,说到 Word 的神奇插件,那可真的是谁用谁爽谁知道。但是众所周知,很多情况下只有 Word 还是不够的,通常我们还经常会需要另一种文件,那就是 PDF。普通的 W