使用go tool pprof分析内存泄漏、CPU消耗
2016-05-09 13:49
609 查看
go中提供了pprof包来做代码的性能监控,在两个地方有包:
net/http/pprof
runtime/pprof
其实net/http/pprof中只是使用runtime/pprof包来进行封装了一下,并在http端口上暴露出来。
import"runtime/pprof"
funcmain(){
f,err:=os.OpenFile("./tmp/cpu.prof",os.O_RDWR|os.O_CREATE,0644)
iferr!=nil{
log.Fatal(err)
}
deferf.Close()
pprof.StartCPUProfile(f)
deferpprof.StopCPUProfile()
注意,有时候deferf.Close(),deferpprof.StopCPUProfile()会执行不到,这时候我们就会看到prof文件是空的,我们需要在自己代码退出的地方,增加上下面两行,确保写文件内容了。
pprof.StopCPUProfile()
f.Close()
$gotoolpprofHuaRongDao./tmp/cpu.prof
Enteringinteractivemode(type"help"forcommands)
(pprof)
一些常用pprof的命令:
(pprof)top
2700msof3200mstotal(84.38%)
Dropped58nodes(cum<=16ms)
Showingtop10nodesoutof111(cum>=80ms)
flatflat%sum%cumcum%
670ms20.94%20.94%670ms20.94%runtime.mach_semaphore_signal
580ms18.12%39.06%590ms18.44%runtime.cgocall
370ms11.56%50.62%370ms11.56%runtime.mach_semaphore_wait
360ms11.25%61.88%360ms11.25%runtime.memmove
210ms6.56%68.44%580ms18.12%golang.org/x/mobile/gl.(*context).DoWork
120ms3.75%72.19%120ms3.75%runtime.usleep
110ms3.44%75.62%110ms3.44%image/png.filterPaeth
100ms3.12%78.75%160ms5.00%compress/flate.(*decompressor).huffSym
100ms3.12%81.88%100ms3.12%image/draw.drawNRGBASrc
80ms2.50%84.38%80ms2.50%runtime.memclr
(pprof)
参考:https://github.com/hyper-carrot/go_command_tutorial/blob/master/0.12.md
默认情况下top命令会列出前10项内容。但是如果在top命令后面紧跟一个数字,那么其列出的项数就会与这个数字相同。
mac下修改默认打开方式:右键一个想处理的文件,按alt键(lion)出现alwaysopenwith,然后打开,整个过程中,先右键,然后一直按alt,一直到打开为止。
参考资料:
gotoolpprof
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
ProfilingGoPrograms
https://blog.golang.org/profiling-go-programs
fm,err:=os.OpenFile("./tmp/mem.out",os.O_RDWR|os.O_CREATE,0644)
iferr!=nil{
log.Fatal(err)
}
pprof.WriteHeapProfile(fm)
fm.Close()
在我们需要生成当时的内存情况时,只需要执行上面代码即可。
触发的条件可以通过http的一个接口,或者退出时,或者接收到某个特殊信号,这些逻辑就需要自己实现了。
分析方法,跟之上CPU的分析方法一致。
参考资料:
[golang]内存不断增长bytes.makeSlice
http://studygolang.com/articles/2763
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方法中增加
funcmain(){
gofunc(){
http.ListenAndServe("localhost:6060",nil)
}()
下图就是访问该网址的一次截图:
CPU消耗分析
使用runtime/pprof做应用程序性能监控
关键代码:import"runtime/pprof"
funcmain(){
f,err:=os.OpenFile("./tmp/cpu.prof",os.O_RDWR|os.O_CREATE,0644)
iferr!=nil{
log.Fatal(err)
}
deferf.Close()
pprof.StartCPUProfile(f)
deferpprof.StopCPUProfile()
注意,有时候deferf.Close(),deferpprof.StopCPUProfile()会执行不到,这时候我们就会看到prof文件是空的,我们需要在自己代码退出的地方,增加上下面两行,确保写文件内容了。
pprof.StopCPUProfile()
f.Close()
对产生的文件进行分析:
我们可以使用gotoolpprof(应用程序)(应用程序的prof文件)方式来对这个prof文件进行分析。$gotoolpprofHuaRongDao./tmp/cpu.prof
Enteringinteractivemode(type"help"forcommands)
(pprof)
一些常用pprof的命令:
top
在默认情况下,top命令会输出以本地取样计数为顺序的列表。我们可以把这个列表叫做本地取样计数排名列表。(pprof)top
2700msof3200mstotal(84.38%)
Dropped58nodes(cum<=16ms)
Showingtop10nodesoutof111(cum>=80ms)
flatflat%sum%cumcum%
670ms20.94%20.94%670ms20.94%runtime.mach_semaphore_signal
580ms18.12%39.06%590ms18.44%runtime.cgocall
370ms11.56%50.62%370ms11.56%runtime.mach_semaphore_wait
360ms11.25%61.88%360ms11.25%runtime.memmove
210ms6.56%68.44%580ms18.12%golang.org/x/mobile/gl.(*context).DoWork
120ms3.75%72.19%120ms3.75%runtime.usleep
110ms3.44%75.62%110ms3.44%image/png.filterPaeth
100ms3.12%78.75%160ms5.00%compress/flate.(*decompressor).huffSym
100ms3.12%81.88%100ms3.12%image/draw.drawNRGBASrc
80ms2.50%84.38%80ms2.50%runtime.memclr
(pprof)
参考:
默认情况下top命令会列出前10项内容。但是如果在top命令后面紧跟一个数字,那么其列出的项数就会与这个数字相同。
web
与gv命令类似,web命令也会用图形化的方式来显示概要文件。但不同的是,web命令是在一个Web浏览器中显示它。如果你的Web浏览器已经启动,那么它的显示速度会非常快。如果想改变所使用的Web浏览器,可以在Linux下设置符号链接/etc/alternatives/gnome-www-browser或/etc/alternatives/x-www-browser,或在OSX下改变SVG文件的关联Finder。mac下修改默认打开方式:右键一个想处理的文件,按alt键(lion)出现alwaysopenwith,然后打开,整个过程中,先右键,然后一直按alt,一直到打开为止。
参考资料:
gotoolpprof
Go的pprof使用
ProfilingGoPrograms
内存泄漏或消耗分析
关键代码fm,err:=os.OpenFile("./tmp/mem.out",os.O_RDWR|os.O_CREATE,0644)
iferr!=nil{
log.Fatal(err)
}
pprof.WriteHeapProfile(fm)
fm.Close()
在我们需要生成当时的内存情况时,只需要执行上面代码即可。
触发的条件可以通过http的一个接口,或者退出时,或者接收到某个特殊信号,这些逻辑就需要自己实现了。
分析方法,跟之上CPU的分析方法一致。
参考资料:
[golang]内存不断增长bytes.makeSlice
相关文章推荐
- Mongoid Paging and Iterating Over Large Collections
- Django系列三:Django 模板
- 在Django中进行用户注册和邮箱验证的方法
- 2016 Google hosts 持续更新
- Django系列二:Django 创建第一个项目
- Django系列一:Django的安装
- 在Django中进行用户注册和邮箱验证的方法
- 利用google工具类实现对list集合分组
- go语言小项目之留言板
- django框架从零开始_008_页面元素 表单处理
- Golang-slice
- hdu3966 Aragorn's Story【树链剖分+线段树】
- 在ubuntu 上用Sublime text 3 搭建golang 环境
- Codeforces Round #258 (Div. 2) D. Count Good Substrings
- GO语言学习
- Google 的开源技术 protobuf 简介与例子
- ROS(indigo)机器人操作系统学习有趣丰富的Gazebo仿真示例evarobot
- ROS(indigo)机器人操作系统学习有趣丰富的Gazebo仿真示例evarobot
- ROS(indigo)机器人操作系统学习有趣丰富的Gazebo仿真示例evarobot
- Django simple sample