前言:
go1.15beta一出来,腾讯云的朋友就通知到我,官方doc里有说提高了编译速度?我目前在做容器云调度相关的项目,由于中间引入了各种k8s、rancher、中间件的库,编译速度着实太慢,在16寸标压cpu的mac下也需要16s,而40c的服务器则需要18s。😁
为什么要优化?
这是一个好问题呀。如果正常上线20s的编译时间无所谓。但开发期间测试期间,每次一个小修改都需要20秒才能启动,TM 真心受不了。😭
如何优化?
优化golang项目的编译速度刻不容缓,当然这里的优化不是指优化go编译器代码,而是从其他途径优化。
第一步,拆解
容器云管理端是分服务端和客户端的。
服务端作为master主控角色,可以把独立一体式的功能拆分多角色。但客户端要部署到每个物理主机上,为了减少维护的复杂性及稳定性,所以不做拆解。
第二步,golang plugin
由于容器云项目集成了阉割版的prometheus、二次开发的node exportor、魔改的rancher等组件,这些组件跟容器云无太紧密的数据交互,所以我都单独拆分并编译成golang plugin。
容器云客户端把非紧密的功能拆分出去,然后编译成plugin插件使用。这样主代码编译速度从16s到了9s。 ( 😅 代码都拆离了,能不快么 )
plugin还可以动态更新,热加载,代码解耦方面。开始用plugin只是为了解决容器云里需要热插拔的逻辑,后来才因编译速度把其他组件也打成了plugin。
先前写了一个go node_exportoer plugin的例子,有兴趣的朋友可以看看。
https://github.com/rfyiamcool/node-exporter-plugin
第三步,等待golang 1.15 release
go team一直在调优go编译器,在go1.10实现了golang build cache,该编译缓存也是默认开启的。后续1.12和1.13做了小范围的优化,目前go1.15beta已经出来了,经过我的测试得出,go1.15编译速度着实加快了不少。
下面是两个版本的对比,粗略看结果可得出 go1.15要比1.14快了20%左右。两个版本在编译期间的cpu表现来说,go1.15的cpu消耗更大一些。
go 1.14.4
// xiaorui.cc
time go1.15beta build cmd/master/main.go
go1.15beta build cmd/master/main.go 10.84s user 1.76s system 172% cpu 7.314 total time go1.15beta build cmd/master/main.go
go1.15beta build cmd/master/main.go 11.40s user 2.00s system 177% cpu 7.554 total
time go1.15beta build cmd/master/main.go
go1.15beta build cmd/master/main.go 11.53s user 1.84s system 180% cpu 7.410 total time go1.15beta build cmd/master/main.go
go1.15beta build cmd/master/main.go 10.94s user 1.95s system 179% cpu 7.193 total
$ time go1.15beta build cmd/master/main.go
go1.15beta build cmd/master/main.go 11.54s user 1.82s system 180% cpu 7.390 total
golang 1.15 beta
// xiaorui.cc
time go build cmd/master/main.go
go build cmd/master/main.go 11.65s user 1.63s system 144% cpu 9.196 total time go build cmd/master/main.go
go build cmd/master/main.go 11.91s user 1.73s system 137% cpu 9.935 total
time go build cmd/master/main.go
go build cmd/master/main.go 11.87s user 1.86s system 138% cpu 9.945 total time go build cmd/master/main.go
go build cmd/master/main.go 11.66s user 1.73s system 143% cpu 9.306 total
$ time go build cmd/master/main.go
go build cmd/master/main.go 11.52s user 1.76s system 136% cpu 9.754 total
总结
golang plugin是有局限性的,业务代码不适合用。服务的组件拆分看起来更靠谱点。