专栏首页大猪的笔记go:如何定位内存cpu问题

go:如何定位内存cpu问题

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

添加监听

import _ "net/http/pprof"
func main() {
    go func() {
        log.Println(http.ListenAndServe(":6060", nil))
    }()
...

网页查看数据

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

# runtime.MemStats
# Alloc = 1950440
# TotalAlloc = 6346404496
# Sys = 27572472

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

查看内存详情日志

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

go tool pprof -alloc_space http://localhost:6060/debug/pprof/heap

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

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查询这个函数,在交互界面输入

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详情

输入命令

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 搞定收工。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • go:优雅的退出http服务

    此外,server.ListenAndServe()不能跑在main中,因为在main中,要处理其它任务。如何使main阻塞呢?上段代码done这个协程是能派上...

    超级大猪
  • python:安装python3.6

    超级大猪
  • 笔记:NEC QTP 第三个实例

    附带一个自编的代码生成工具,QTP的编译器实在太差了。不能识别外部类。这下妈妈再也不用担心我打错字了。。

    超级大猪
  • 天龙八部:8步从Python白板到专家

    如果你想做一个数据科学家,或者作为一个数据科学家你想扩展自己的工具和知识库,那么,你来对地方了。 这篇文章的目的,是给刚开始使用Python进行数据分析的...

    小小科
  • [译] 天龙八步 第二弹:8步从Python白丁到专家,从基础到深度学习

    大数据文摘
  • 网络安全学习网址

    http://www.sec-wiki.com/skill/安全技能(里面渗透逆向编程都有介绍) http://blog.knownsec.com/Knowns...

    没有故事的陈师傅
  • 【学习】天龙八部:8步从Python白板到专家

    如果你想做一个数据科学家,或者作为一个数据科学家你想扩展自己的工具和知识库,那么,你来对地方了。 这篇文章的目的,是给刚开始使用Python进行数据分析的人,指...

    小莹莹
  • 行业|小程序线上+线下打通区块链安全存储场景体验链

    当下,随着线上线下融合不断加速,新一代的营销玩法趋于多样化。在消费升级和互联网+思维的双重影响下,各行通过结合小程序实现更多无限可能性。面对越来越多的选择,消费...

    微宝阁
  • 浅谈程序的内存布局

    现代的应用程序都运行在一个内存空间里,在 32 位系统中,这个内存空间拥有 4GB (2 的 32 次方)的寻址能力。

    刘盼
  • 前沿科技:3D打印的无人机在英国首飞

    英国谢菲尔德大学的一个研究团队成功测试了3D打印的无人飞行器(UAV)原型,该无人飞行器是低成本无人机快速制造项目的一部分。 先进制造研究中心(AMRC)的工程...

    机器人网

扫码关注云+社区

领取腾讯云代金券