作者:张富春(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% (当然,我这个程序的逻辑很简单。)