【软件工程】持续集成:如何建立百万行级代码的版本构建系统(六)效率专项优化
本人华为工作6年,做过开发、维护、一线支撑等大量技术工作。
========================================================================
一、背景和现状
A企业针对Java web开发提供自动化项目管理包括持续构建、部署、测试、发布等动作,业务基数大,效率问题已经成为系统瓶颈,需要大力投入。
当前,我们使用maven来管理项目,构建动作包括Java编译和war打包。
Maven管理下的全流程(红色部分编译和打包重点关注)
Java编译*.class文件
当前应用中,应用200m的war包构建要2分钟。
二、目标
将构建效率提升到59秒内。
三、方法论
从软件构建的动作上讲,分为以下步骤:
1、拷贝,从远端仓库或者本地仓库下载代码到本地。(传输、系统IO、存储)
2、编译,调用javac(mvn compile)将java文件编译成字节流class文件。(系统IO)
3、打包,调用jar(mvn package)打包将项目打包。(系统IO)
上述动作中,可以优化的目标有:
传输:代码仓库和服务器主机的距离、带宽、协议。
系统IO:文件打开、读写、关闭等标准动作。
存储:本地存储的大小,远程存储读写效率,和传输关联较大。
还可以增加的优化目标有:
系统运行:减少操作系统本身与构建无关的模块。
代码效率:用低级语言替代甚至重写Java本身的功能。(效率提升显著)
四、具体优化方向
目前对A公司的系统了解还不够,针对上述优化的方向,假定优化方向如下:
1、系统规划仓库和构建服务器,减少拷贝次数。
代码从远程拷贝需要网络传输,而在业务量较大情况下大量业务的网络延迟可能是系统最大的瓶颈,单纯减少服务器本地代码运行时间往往达不到目的。
优化代码仓库要采用如下方法:
1.1 共享频率最高的包保存在本地,假设本地仓库有100G空间用来存放共享包,定期以一定的策略(业务使用频率统计)来优化本地仓库。
1.2 构建服务器和远程包仓库就近原则,根据业务量来设计仓库、构建服务器物理位置。
1.3 为最高优先级服务设计专用服务器。
2、优化网络带宽,适配业务流量。
根据业务量合理配置带宽,持续监控。带宽应该配置在最高业务量的120%以上防止高峰期大量业务失败。
3、用c重写maven部分功能。
C代码在效率上优于Java(字节码翻译、无引用对象、垃圾回收等机制占用大量机器时间),优化空间大,在本地代码运行效率上至少10倍提升。
1.1 解析java类,可以用工具生成UML图。
1.2 设置功能节点,将maven的每个动作输入输出及环境依赖制定测试用例,获得测量数据标记性能短板
1.3 制定性能提升策略,用c替代java的部分方法
1.4 替换功能达到里程碑点时,发布新的系统,先作为影子系统运行一个阶段(1~3个月),持续监控新系统功能匹配度和性能,当系统稳定后切换到新系统,可以两个系统反复迭代验证。
4、优化操作系统,减少不必要的系统开销。
使用Linux系统,去掉不必要的图形界面,运行速度比Windows将有较大提升。另外,可以在系统层面定制:
1.1 编译定制Linux内核,去掉不必要的模块。
1.2 使用docker服务,细分微服务功能并持续保持docker服务器冗余。
1.3 使用更大的本地存储,固态硬盘加速系统IO速度。
本人QQ 280775561,微信JohnLee790608,有同路人可以一起探讨。
====================================================================
前期链接:
【软件工程】持续集成:如何建立百万行级代码的版本构建系统(五)开发计划