前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >go:如何定位内存cpu问题

go:如何定位内存cpu问题

作者头像
超级大猪
发布2019-11-21 20:34:50
7480
发布2019-11-21 20:34:50
举报
文章被收录于专栏:大猪的笔记大猪的笔记

在go web中,定位内存/cpu问题(内存泄漏,内存优化)可以这么做。

添加监听

代码语言:javascript
复制
import _ "net/http/pprof"
func main() {
    go func() {
        log.Println(http.ListenAndServe(":6060", nil))
    }()
...

网页查看数据

此时,可以在web浏览器中输入http://localhost:6060/debug/pprof/,并点击进入 heap,查看信息。 重要的数据在下面:

代码语言:javascript
复制
# runtime.MemStats
# Alloc = 1950440
# TotalAlloc = 6346404496
# Sys = 27572472

Alloc 指当前分配的内存,Sys指向系统申请的内存。正常情况下,Alloc的数值应该呈波动状(因为GC)。 这样,就能比较容易的发现内存泄漏的情况。

查看内存详情日志

但是,上面的信息还不足以优化代码,进入命令行,输入命令如下:

代码语言:javascript
复制
go tool pprof -alloc_space http://localhost:6060/debug/pprof/heap

此时进入交互界面,输入 top -cum。 举例:

代码语言:javascript
复制
top -cum
...
28MB  0.44% 29.40%  1532.19MB 24.24%  gcount/handlers.getArticleCount

这里先讲下几个标准:

  • flat: 采样时,cpu状态下是该函数正在运行的次数 * 采样频率(10ms),即得到估算的函数运行”采样时间”。这里不包括函数等待子函数返回。内存状态下则为实际值。
  • flat%: flat / 总采样时间值
  • sum%: 前面所有行的 flat% 的累加值。
  • cum: 采样时,该函数出现在调用堆栈的采样时间,包括函数等待子函数返回。因此 flat <= cum
  • cum%: cum / 总采样时间值

主要关注cum和flat就行了。 因为cum是链式的资源总合,我们很容易找到消耗链,然后使用list查看具体代码。具体上,我们关注flat的值就行了,找出大的优化它。

上面的例子中,getArticleCount 累计消耗1532M 内存。此时,用list查询这个函数,在交互界面输入

代码语言:javascript
复制
list getArticleCount

ROUTINE ======================== gcount/handlers.getArticleCount in handlers/ getclick.go
      28MB     1.50GB (flat, cum) 24.24% of Total
         .          .     15:)
         .          .     16:
         .          .     17://GetArticleCount传入id_list,返回相关文章点击量
         .          .     18:func getArticleCount(r *http.Request) (interface{}, int) {
         .          .     19:   logger.Debug("getArticleCount run")
         .   186.54MB     20:   id_list := httpHelper.GetReqKey(r, "id_list")
...

最上面一行是总量,然后是每行代码对应的内存消耗。 多调用几次list深挖,就能找出内存消耗的元凶啦。

查看cpu详情

输入命令

代码语言:javascript
复制
go tool pprof ./msg_topic_manager http://193.112.83.241:6060/debug/pprof/profile

等待一会,进入交互界面。 输入top10,查看cpu前十名:

发现第一名是syscall.Syscall,看不出来,我们继续。

输入top -cum

有点意思了,我们一路list,找到了关键地方:

从上面的图分析,可以发现cpu的消耗,主要在:

  • GetKafkaJobID(这个函数实际是json的解析);
  • json.Marshal/UnMarshal
  • http request 搞定收工。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-05-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 添加监听
  • 网页查看数据
  • 查看内存详情日志
  • 查看cpu详情
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档