使用pprof分析cpu占用过高问题

yanglikai · · 383 次点击 · · 开始浏览    

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火焰图如下:

入群交流(和以上内容无关):Go中文网 QQ 交流群:798786647 或加微信入微信群:274768166 备注:入群;关注公众号:Go语言中文网

383 次点击  
加入收藏 微博
被以下专栏收入,发现更多相似内容
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传