go中提供了pprof包来做代码的性能监控,在两个地方有包:

  • net/http/pprof
  • runtime/pprof

其实net/http/pprof中只是使用runtime/pprof包来进行封装了一下,并在http端口上暴露出来。

使用 net/http/pprof 做WEB服务器的性能监控

如果你的go程序是用http包启动的web服务器,想要查看自己的web服务器的状态。这个时候就可以选择net/http/pprof。

   import _ "net/http/pprof"
然后就可以在浏览器中使用http://localhost:port/debug/pprof/ 直接看到当前web服务的状态,包括CPU占用情况和内存使用情况等。
当然,非WEB的也可以用下面方式启动WEB。
在 main 方法中增加
func main() {
    go func() {
        http.ListenAndServe("localhost:6060", nil)
    }()
下图就是访问该网址的一次截图:
 

CPU消耗分析

使用 runtime/pprof 做应用程序性能监控

关键代码:

import  "runtime/pprof"

 

func main() {
    f, err := os.OpenFile("./tmp/cpu.prof", os.O_RDWR|os.O_CREATE, 0644)
    if err != nil {
        log.Fatal(err)
    }
    defer f.Close()
    pprof.StartCPUProfile(f)
    defer pprof.StopCPUProfile()

注意,有时候 defer f.Close(), defer pprof.StopCPUProfile() 会执行不到,这时候我们就会看到 prof 文件是空的, 我们需要在自己代码退出的地方,增加上下面两行,确保写文件内容了。

pprof.StopCPUProfile()

f.Close()

对产生的文件进行分析:

我们可以使用 go tool pprof (应用程序) (应用程序的prof文件) 方式来对这个 prof 文件进行分析。

$ go tool pprof HuaRongDao ./tmp/cpu.prof
Entering interactive mode (type "help" for commands)
(pprof)

一些常用 pprof 的命令:

top

在默认情况下,top命令会输出以本地取样计数为顺序的列表。我们可以把这个列表叫做本地取样计数排名列表。

(pprof) top
2700ms of 3200ms total (84.38%)
Dropped 58 nodes (cum <= 16ms)
Showing top 10 nodes out of 111 (cum >= 80ms)
      flat  flat%   sum%        cum   cum%
     670ms 20.94% 20.94%      670ms 20.94%  runtime.mach_semaphore_signal
     580ms 18.12% 39.06%      590ms 18.44%  runtime.cgocall
     370ms 11.56% 50.62%      370ms 11.56%  runtime.mach_semaphore_wait
     360ms 11.25% 61.88%      360ms 11.25%  runtime.memmove
     210ms  6.56% 68.44%      580ms 18.12%  golang.org/x/mobile/gl.(*context).DoWork
     120ms  3.75% 72.19%      120ms  3.75%  runtime.usleep
     110ms  3.44% 75.62%      110ms  3.44%  image/png.filterPaeth
     100ms  3.12% 78.75%      160ms  5.00%  compress/flate.(*decompressor).huffSym
     100ms  3.12% 81.88%      100ms  3.12%  image/draw.drawNRGBASrc
      80ms  2.50% 84.38%       80ms  2.50%  runtime.memclr
(pprof)

参考: https://github.com/hyper-carrot/go_command_tutorial/blob/master/0.12.md

默认情况下top命令会列出前10项内容。但是如果在top命令后面紧跟一个数字,那么其列出的项数就会与这个数字相同。

web

与gv命令类似,web命令也会用图形化的方式来显示概要文件。但不同的是,web命令是在一个Web浏览器中显示它。如果你的Web浏览器已经启动,那么它的显示速度会非常快。如果想改变所使用的Web浏览器,可以在Linux下设置符号链接/etc/alternatives/gnome-www-browser或/etc/alternatives/x-www-browser,或在OS X下改变SVG文件的关联Finder。

mac 下 修改默认打开方式: 右键一个想处理的文件,按alt 键(lion)出现always open with,然后打开,整个过程中, 先右键,然后一直按 alt, 一直到打开为止。

参考资料:

go tool pprof
https://github.com/hyper-carrot/go_command_tutorial/blob/master/0.12.md

Go的pprof使用
http://www.cnblogs.com/yjf512/archive/2012/12/27/2835331.html

Profiling Go Programs
https://blog.golang.org/profiling-go-programs

内存泄漏或消耗分析

关键代码

fm, err := os.OpenFile("./tmp/mem.out", os.O_RDWR|os.O_CREATE, 0644)
if err != nil {
    log.Fatal(err)
}
pprof.WriteHeapProfile(fm)
fm.Close()

在我们需要生成当时的内存情况时,只需要执行上面代码即可。

触发的条件可以通过 http 的一个接口,或者退出时,或者接收到某个特殊信号,这些逻辑就需要自己实现了。

分析方法,跟之上CPU的分析方法一致。

参考资料:

[golang]内存不断增长bytes.makeSlice
http://studygolang.com/articles/2763

使用go tool pprof分析内存泄漏、CPU消耗的更多相关文章

  1. 使用Memory Analyzer tool(MAT)分析内存泄漏(二)

    转载自:http://www.blogjava.net/rosen/archive/2010/06/13/323522.html 前言的前言 写blog就是好,在大前提下可以想说什么写什么,不像投稿那 ...

  2. 使用Memory Analyzer tool(MAT)分析内存泄漏

    前言的前言 写blog就是好,在大前提下可以想说什么写什么,不像投稿那么字字斟酌.上周末回了趟成都办事,所以本文来迟了.K117从达州经由达成线往成都方向走的时候,发现铁路边有条河,尽管我现在也不知道 ...

  3. 使用Memory Analyzer tool(MAT)分析内存泄漏(一)

    转载自:http://www.blogjava.net/rosen/archive/2010/05/21/321575.html 前言 在平时工作过程中,有时会遇到OutOfMemoryError,我 ...

  4. Memory Analyzer tool(MAT)分析内存泄漏---理解Retained Heap、Shallow Heap、GC Root

    Shallow Heap Size 指对象自身所占用的内存大小,不包含其引用的对象所占的内存大小. 1.数组类型 数组元素对象所占内存的大小总和. 2.非数组类型 对象与它所有的成员变量大小的总和.当 ...

  5. 性能监控 | MAT分析内存泄漏

    使用MAT分析内存泄漏(二)八周年重印版 - 知乎 .u-safeAreaInset-top { height: constant(safe-area-inset-top) !important; h ...

  6. 【转】如何使用MAT分析内存泄漏

    原文链接:http://www.lightskystreet.com/2015/09/01/mat_usage/ MAT - Memory Analyzer Tool 使用进阶 Sep 1, 2015 ...

  7. Atitit.提升稳定性-----分析内存泄漏PermGen OOM跟解决之道...java

    Atitit.提升稳定性-----分析内存泄漏PermGen OOM跟解决之道...java 1. 内存区域的划分 1 2. PermGen内存溢出深入分析 1 3. PermGen OOM原因总结 ...

  8. 使用androidstudio 分析内存泄漏

    分析内存泄漏 http://www.jianshu.com/p/c49f778e7acf

  9. 如何使用memstat 插件分析内存泄漏问题

    对于内存泄漏问题,如何分析并找到内存泄漏的原因是个难点.KingbaseES 提供了memstat 扩展插件用于分析内存泄漏的原因. 一.使用 memstat 插件 1.修改shared_preloa ...

随机推荐

  1. risc与cisc

    RISC(精简指令集计算机)和CISC(复杂指令集计算机)是当前CPU的两种架构.它们的区别在于不同的CPU设计理念和方法. 早期的CPU全部是CISC架构,它的设计目的是要用最少的机器语言指令来完成 ...

  2. shell之here文档

    http://www.cnblogs.com/xiangzi888/archive/2012/03/24/2415077.html在shell脚本程序中,向一条命令传递输入的一种特殊方法是使用here ...

  3. CentOS 6使用mutt+msmtp发送邮件

    转:http://www.tuicool.com/articles/YRnQVfq CentOS系统下如果希望向外域发送邮件,需要配置sendmail+dovecot等一系列工具.其实不用这么麻烦,只 ...

  4. Html.BeginForm())与Ajax.BeginForm()

     一.@using (Html.BeginForm())参数示例 1.指定表单提交方式和路径等 @using (Html.BeginForm("Index", "Home ...

  5. html之input系列标签

    input属性太多,我这里仅列出几个我喜欢的吧. disabled:首次加载时禁用此元素 checked:首次加载时选中此元素 form:输入字段所属的一个或多个表单 hieght:定义input字段 ...

  6. Intellij IDEA 的使用(创建项目、导入项目、同时部署多个项目、JRebel)等常见eclipse、myeclipse换idea必看

    第一篇:Intellij IDEA 的使用 1.黑色主题 中文乱码修改 2.WEB项目的部署 以及自动编译 3.多项目的同时部署 4.相关插件提高工作效率 1.JRebel插件 实现热部署 2.Tas ...

  7. sql查询重复记录并取对应最小值

    原表(aa): id   a                      b 1    22                    456 2    22                    256 ...

  8. 修改mysql root 密码

    C:\Program Files\MySQL\MySQL Server 5.6\bin mysqld --skip-grant-tables 开启一新窗口:然后输入mysql -uroot -p up ...

  9. 解决Centos6.5虚拟机上网问题

    起初是为了能通过上网的方式简化g++的安装,故有此篇博文,希望能帮助到有需要的人. 虚拟机环境: 1.Linux系统:Centos6.5 64位 2.ifconfig查看虚拟机ip:竟然没有ip! 3 ...

  10. eclipse中tomcat加gc日志输出

    -XX:ParallelGCThreads=4 -XX:+PrintGCDetails