ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CI编译速度优化

2020-12-15 11:02:53  阅读:245  来源: 互联网

标签:10 CI 工程 编译 串行化 优化 打包


Date: 2020/3/6

背景:

并行编译的可靠性不高?编译经常卡住,eGateway无版本可用,影响项目进度。

 

CI的基本流程

目前eGateway,中央站,Benelink,Jekins的基本工作流如上图所示。

 

 

eGateway的编译速度慢在哪里?

  1. 工程编译串行化:一个工程编译完了才能编译另外一个工程
  2. 文件签名速度慢:文件签名的速度慢。
  3. NSIS打包串行化:生成eGatewaySetup.exe, eGatewaySteup_PDB.exe
  4. 7z打包压缩串行化:打包完成会生成多个压缩包串行,且较慢

     

    问题:

  5. 并行编译的可靠性不高?

    主要表现是卡住不动。

     

     

工程编译串行化:

这个编译,对CPU的有效利用率并不高,比较多的时间花在了编译准备和文件交换上了。

优化策略:

  1. 梳理依赖关系,对于没有依赖关系的工程同时编译。提升CPU占用率。
  2. 移除Incredibuild软件,这个软件经常导致编译卡死。

 

经过优化后,节省20分钟左右

 

文件签名速度慢

文件签名对网络的访问主要是时间戳

目前的网络连接方式,如下图:

 

 

对于网络的交互流程,使用的签名工具,都是没有问题,很验证从这个地方进行优化。

优化策略:

  1. 一次签一个文件和一次签多个文件时间差不多,目前是一次签多个文件的方式。
  2. 减少重复签名。同一二进制文件,多次签名。经过优化后,减少了300个左右签名文件,减少10分钟左右

 

NSIS打包串行化

NSIS打包生成eGatewaySetup.exe, eGatewaySteup_PDB.exe

经过分析发生,NSIS脚本编译采用单线程的方式,这两个打包是串行方式。

打包使用的压缩压缩算法为LZMA。这个算法暂不支持多线程。

 

优化策略:

  1. 对打化进行并行,同时启动这两个打包。
  2. 此步优化后约节省6分钟

     

7z打包压缩串行化

7z 最初的版本为4.65,使用LZMA压缩算法,对多线程支持不好。

 

优化策略:

使用7z 16.04,支持LZMA2压缩算法,对多线程支持好。提高压缩速度。

 

eGateway优化对比:

优化前

优化后(试验中)

约2小时10分

约1小时10分钟

目前优化后的版本还在试用行中,经过初步比对,减少了1个小时左右。

 

后续的优化策略:

策略:

  1. 打印各个工程的时间,看看哪些工程最费时间,进行优化。
  2. 查看关键路径,梳理依赖关系,进行优化。

     

时间

工程或者目标

Elapse(分钟)

2020/3/10 2:51:40

Common

9.82

2020/3/10 3:00:54

eGatewayCommon

9.24

2020/3/10 3:02:41

ADTServer

1.78

2020/3/10 3:02:43

DocServer

1.82

2020/3/10 3:04:37

FHIRServer

1.93

2020/3/10 3:05:05

eGatewayDaemon

0.46

2020/3/10 3:05:47

eGatewayLogsTool

0.69

2020/3/10 3:09:39

ResultServer

6.92

2020/3/10 3:10:19

eGatewayUI

4.53

2020/3/10 3:27:30

CS_MultiBackend

35.84

2020/3/10 3:33:23

NO_PDB

2.35

2020/3/10 3:41:27

CONTAIN_PDB

10.41

 

关键路径及优化:

  1. 多后端的编译很费时间,约35分钟
  2. Common目录下工程间的依赖关系不明确,串行编译。优化后预计可以节省5分钟左右。
  3. NSIS打包速度过慢,这一步目前耗时10分钟

     

    优化的地方比较多。但考虑好易维护和时间成本。已基本达到预期,暂停止优化。

     

     

Benelink的编译速度慢在哪里?

Benelink不适合使用Incredibuild。或者说对Incredibuild的使用方式不正确。

 

优化策略:

移除Incredibuild

Incredibuild的使用

适用于哪些场景:

1, 单个工程,拥有大量文件的场景。

2, 如果有多个工程时,需要使用sln,并把多个工程依赖组织好,然后再来编译。

目前我们Common工程的依赖关系组织不明确。而且没有sln的方案,没有发挥出并行编译的优势了性能。

 

不适用哪些场景:

数量多的小工程(文件数量少)的串行化编译

 

Benelink优化对比:

优化前

优化后(试验中)

约1小时30分

约16分钟

经过初步比对,减少了1个小时10分钟左右。

 

标签:10,CI,工程,编译,串行化,优化,打包
来源: https://www.cnblogs.com/iamkun2005/p/14137306.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有