玩一玩 golang 1.21 的 pgo 编译优化

发布时间 2023-09-20 15:47:09作者: ahfuzhang

作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!


1.下载镜像

暂时不想替换本机的 golang 版本,于是打算在容器里编译:

docker pull --platform=linux/amd64 golang:1.21.1

2.运行镜像

docker run -it -v $(pwd):/root/my-golang-server/ \
    golang:1.21.1 bash

因为代码中用到了 cgo,因此还需要装一个 musl 库:

apt-get update
apt-get install musl-tools

3.编译

env CC=x86_64-linux-musl-gcc CGO_ENABLED=1  GOOS=linux  GOARCH=amd64 CGO_LDFLAGS="-static" \
	  go build -tags 'musl' -ldflags="-w -s" -o cmd/my_server_linux_amd64 cmd/main.go

运行起来,并开启压测。

4.采集profile

curl -o cmd/default.pgo "http://127.0.0.1:8080/debug/pprof/profile?seconds=60"

5.再次编译

env CC=x86_64-linux-musl-gcc CGO_ENABLED=1  GOOS=linux  GOARCH=amd64 CGO_LDFLAGS="-static" \
	  go build -tags 'musl' -ldflags="-w -s" -pgo=cmd/default.pgo -o cmd/my_server_linux_amd64 cmd/main.go

验证编译:

go version -m cmd/my_server_linux_amd64

可以看见 build -pgo=/rootmy-golang-server/cmd/default.pgo 这样的信息。

6.运行效果

相比 golang 1.20 版本编译的程序, golang 1.21+PGO 编译的程序,性能提升了 9.21% (当然,我这个程序的逻辑很简单。)