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

net/http/pprof
runtime/pprof

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

pprof包

web 服务器

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

然后就可以在浏览器中使用http://localhost:port/debug/pprof/直接看到当前web服务的状态,包括CPU占用情况和内存使用情况等。具体使用情况你可以看godoc的说明。

服务进程

如果你的go程序不是web服务器,而是一个服务进程,那么你也可以选择使用net/http/pprof包,同样引入包net/http/pprof,然后在开启另外一个goroutine来开启端口监听。

比如:

go func() {
log.Println(http.ListenAndServe("localhost:6060", nil))
}()

应用程序

如果你的go程序只是一个应用程序,比如计算fabonacci数列,那么你就不能使用net/http/pprof包了,你就需要使用到runtime/pprof。具体做法就是用到pprof.StartCPUProfile和pprof.StopCPUProfile。比如下面的例子:

var cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file")

func main() {
flag.Parse()
if *cpuprofile != "" {
f, err := os.Create(*cpuprofile)
if err != nil {
log.Fatal(err)
}
pprof.StartCPUProfile(f)
defer pprof.StopCPUProfile()
}

运行程序的时候加一个--cpuprofile参数,比如fabonacci --cpuprofile=fabonacci.prof

这样程序运行的时候的cpu信息就会记录到XXX.prof中了。

下一步就可以使用这个prof信息做出性能分析图了(需要安装graphviz)。

使用go tool pprof (应用程序) (应用程序的prof文件)

进入到pprof,使用web命令就会在/tmp下生成svg文件,svg文件是可以在浏览器下看的。像这个样子:

如果你的程序非常简单,比如只有println一个语句,你用pprof.StartCPUProfile是打印不出任何东西的。

举例

下面拿go-tour举个例子,这是个web程序,我在代码中加入了

_ "net/http/pprof"

在浏览器中我就可以直接看prof信息了

生成CPU状态分析图

下面我们想要生成CPU状态分析图,调用go tool pprof http://localhost:3999/debug/pprof/profile

就会进入30秒的profile收集时间,在这段事件内猛刷新点击go-tour浏览器上的页面,尽量让cpu占用性能产生数据。

(pprof) top10

Total: 3 samples

1 33.3% 33.3% 1 33.3% MHeap_AllocLocked

1 33.3% 66.7% 1 33.3% os/exec.(*Cmd).closeDescriptors

1 33.3% 100.0% 1 33.3% runtime.sigprocmask

0 0.0% 100.0% 1 33.3% MCentral_Grow

0 0.0% 100.0% 2 66.7% main.Compile

0 0.0% 100.0% 2 66.7% main.compile

0 0.0% 100.0% 2 66.7% main.run

0 0.0% 100.0% 1 33.3% makeslice1

0 0.0% 100.0% 2 66.7% net/http.(*ServeMux).ServeHTTP

0 0.0% 100.0% 2 66.7% net/http.(*conn).serve

(pprof)web

参考

http://blog.golang.org/2011/06/profiling-go-programs.html

这篇官方文章说得很仔细了,但是要注意,将里面的gopprof工具换成go tool pprof就行了

最新文章

  1. Mac MySQL启动不了解决办法(MySQL卸载重新安装教程)
  2. bzoj1001最小割
  3. handler和Timer的用法
  4. 解决SecureCRT中文编码乱码
  5. 【USACO 2.1】The Castle
  6. AngularJs转换json日期/Date(00000)/
  7. .net framework4与其client profile版本的区别
  8. MSP430F149学习之路——按键与LED
  9. 数据库分库分表(sharding)系列(二) 全局主键生成策略
  10. MVC中使用泛型仓储模式和依赖注入
  11. javaWeb学习总结(3)- 通过Servlet生成验证码图片(2)
  12. 福大软工 · BETA 版冲刺前准备(团队)
  13. cJSON库的简单介绍及使用
  14. windbg 加载dump监测蓝屏原因时出现重复的星星框提示解决办法
  15. odoo 默认显示字段
  16. Vue 和 angular
  17. SQL Server 索引(一)数据结构和存储结构
  18. Android指南 - 主题
  19. 16、SpringBoot-CRUD错误处理机制(3)
  20. IQ/OQ/DQ/PQ

热门文章

  1. MyBaits 错误分析
  2. 快学Scala-第五章 类
  3. [转]JSONObject与JSONArray的使用
  4. BinTools 十六进制转换
  5. hbase建索引的两种方式
  6. World Finals 1996 Uva 247 (Floyd求闭包)
  7. c++数组指针bug
  8. android 定时器总结
  9. HDU 1043 八数码(八境界)
  10. git 管理多个私钥