每日一Go-27、Go语言进阶-性能剖析与优化
当你的Go服务上线后,你肯会遇到这些问题: pprof就是Go官方为你准备的扫描仪,用来帮你看清程序内部发生了什么。 1、pprof是什么 pprof是Go内置的性能分析工具,支持以下分析: 2、如何使用pprof(Web方式) 最常用:用于Web服务(Gin/标准http) 启动服务后,访问以下地址: web汇总如图 3、单独在代码中采集 CPU Profile和内存 3.1 主要用于命令行工具 3.2 内存 4、如何查看pprof文件 4.1 命令行查看 4.2 打开web页面查看 会自动弹出web界面 5、查看火焰图 火焰图的核心规则是:越宽的块=越多的CPU时间/内存占用;越高的块=调用链更深 6、举个实例 启动服务,然后不断地访问测试地址,同时收集cpu的pprof信息 启动火焰图后,我们看见确实math.Sqrt占用了大量的CPU资源。这就是你要优化的地方。 7、内存泄漏定位示例 采集内存 打开火焰图 在图上我们看见main.leak占用内存最多。 8、Go性能优化的基本思路 CPU优化方向 内存优化方向 并发优化方向 9、安全 生产环境不要暴露pprof,可用内网防火墙或者白名单可以访问,其他的均禁止。 10、源码地址 https://pan.baidu.com/s/1B6pgLWfSgMngVeFfSTcPdg?pwd=jc1s 性能优化和人生一样,不是拼命就能更快,而是找到真正拖慢你的瓶颈,持续迭代,人生和程序都会跑的更快更稳。 如果您喜欢这篇文章,请点赞、推荐+分享给更多朋友,万分感谢!
文末有源码下载链接

package main
import (
"log"
"net/http"
_ "net/http/pprof"
)
func main() {
//开启pprof的方式
go func() {
log.Println(http.ListenAndServe(":6060", nil))
}()
http.ListenAndServe(":8080", nil)
}

f, _ := os.Create("cpu.prof")
pprof.StartCPUProfile(f)
time.Sleep(30 * time.Second)
pprof.StopCPUProfile()f, _ := os.Create("mem.prof")
pprof.WriteHeapProfile(f)go tool pprof cpu.profgo
8081

package main
import (
"log"
"math"
"net/http"
_ "net/http/pprof"
)
// 这个函数消耗大量的CPU计算
func slow() {
for i := 0; i < 1e7; i++ {
math.Sqrt(float64(i))
}
}
func main() {
//开启pprof的方式
go func() {
log.Println(http.ListenAndServe(":6060", nil))
}()
http.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) {
slow()
w.Write([]byte("done"))
})
http.ListenAndServe(":8080", nil)
}//收集cpu信息
curl http://localhost:6060/debug/pprof/profile?seconds=20 -o cpu.prof//查看火焰图
go tool pprof -http=:8081 cpu.prof
var data [][]byte
func leak() {
b := make([]byte, 10<<20) // 10MB
data = append(data, b) // 不断增长
}curl
6060
20go
8082