缩小可执行文件的大小
在生产环境中,特别是一些环境受限的环境,对二进制文件的大小会更加敏感,二进制越大,占用的内存空间也就越大,在微服务领域对此更加敏感,一个服务多占用100m内存,10个服务就是1个g了.
联犀在探索结合gozero如何减少二进制文件的大小,有以下几个方案
# 二进制分析
首先我们来看下不添加任何处理的二进制文件大小(注: 需要在linux环境下操作)
- 打开things,进入
things/service/apisvr
- 执行编译
go build
- 打开 https://gsa.zxilly.dev/ (opens new window) 将二进制文件拖进重点的上传框
- 可以看到下图的分析, 总大小 121.55MB,左侧的debug信息中有14.44MB
# 优化
# 添加通用编译条件
go build的时候添加 -ldflags="-s -w"
如: go build -ldflags "-s -w"
- -s: 去掉符号信息.
- -w: 去掉DWARF调试信息.
通过以上方式可以减少大约一半的大小,编译后总大小为84.35MB
# 删减引入k8s
gozero是一个微服务框架,默认支持k8s,但是这也带来一个问题,当我们不需要k8s的时候k8s引入的包就会过于庞大,可以看到下图, k8s占用了总共约18MB的空间
解决方式: 通过和gozero的作者的沟通, 可以通过编译条件的方式来减少依赖的引入,解决方式如下
go build的时候添加 -tags no_k8s
如: go build -ldflags "-s -w" -tags no_k8s
我们编译了之后再看看文件的大小,从一开始的121.55MB 变成了 59.45MB
参考: https://github.com/zeromicro/go-zero/pull/4323 (opens new window)
# 分包
在golang中,如果一个包被引入了一个文件,那么所有文件都会打进这个二进制中,那么我们其实可以将大包拆分为不同的小包,这样就能做到按需引入,如联犀的share中,将不同的客户端拆分成多个包,当没有使用的服务就不会引入了
上次更新: 2024/10/11, 17:14:01