分享
  1. 首页
  2. 文章

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

yanglikai · · 8726 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

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

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏