web接入
选择net/http/pprof。你只需要引入包_"net/http/pprof",然后就可以在浏览器中使用http://localhost:port/debug/pprof/直接看到当前web服务的状态,包括CPU占用情况和内存使用情况等。
如下图:
在上图的页面上直接点击profile,或直接访问链接 http://localhost:port/debug/pprof/profile 稍后片刻,可以下载到文件 profile
go tool pprof
使用 Go 自带的 pprof 工具进行分析,命令:go tool pprof test profile。(proof 后跟的 test 为程序编译的可执行文件)
输入top命令可以查看cpu占用前10的函数
我这里可执行文件名叫"profile",所以:
go-torch
使用to-torch工具生成火焰图来分析,更直观一些
1、可以直接使用pprof生成的profile文件生成火焰图
命令为:go-torch profile profile
如下图:
2、直接生成火焰图,命令如下:
go-torch -u http://localhost:8085 -t 30
生成的torch.svg文件用浏览器打开后效果如下:
3、内存火焰图
go-torch http://localhost:8085/debug/pprof/heap --colors mem -f mem.svg
优化
根据cpu火焰图,可以看到大部分cpu时间被time.now占用,找到问题代码如下:
go func(){
for{
data := getData()
if data == nil {
continue
}
save(data)
}
}()
由于getData方法经常是拿不到数据的,所以导致for近似死循环了
解决方法有两种:
一、在第5行插入一行代码:
time.Sleep(1000 * time.Millisecond)
二、将data := getData()改为从chan中取,即将第3行换成:
data <- dataChan
本人采用的是第二种,修改后cpu火焰图如下:
有疑问加站长微信联系(非本文作者)