这两天用golang在写一个监控的agent,发现长时间运行后会有内存泄露的情况,着实让人郁闷半天… 要解决golang泄露的问题,要理解goalng gc那是事情,再就是利用pprof监视golang的运行环境。
该文章写的有些乱,欢迎来喷 ! 另外文章后续不断更新中,请到原文地址查看更新。http://xiaorui.cc/?p=3000
这Golang GC垃圾回收我就先不多说了,等我自己深入了解了,会专门找个时间聊这事.
在golang中用来做监控分析的库包,一般用都是pprof库包… pprof可以在两个地方引入:
net/http/pprof runtime/pprof
其实net/http/pprof中只是使用runtime/pprof包来进行封装了一下,并在http端口上暴露出来。 runtime/pprof可以用来产生dump文件,再使用go tool pprof来分析这运行日志.
使用net/http/pprof可以做到直接看到当前web服务的状态,包括CPU占用情况和内存使用情况等。
这次重点说些pprof web显示的模式,我自己主要是关注heap,profile两个数据源。
关于golang运行环境heap的信息、内存mem等
http://localhost:7777/debug/pprof/heap
关于profile、CPU计算百分比等
http://localhost:7777/debug/pprof/profile
上面简单介绍了pprof的监控接口,但怎么查看这些数据? 有这么几个查看方式.
交互模式, 可以通过用help查看pprof各种命令。 每次运行后拿到的数据是固定的,不会动态更新该数据。
go tool pprof http://localhost:7777/debug/pprof/heap go tool pprof http://localhost:7777/debug/pprof/profile
如果你不想使用交互模式,当然这每次都是新数据:
go tool pprof --text http://localhost:7777/debug/pprof/heap
网页查看模式:
http://localhost:7777/debug/pprof/
下面是我随便写的一段伪业务代码. 大家可以长时间运行这段代码,会发现内存在缓慢的增长中.
#xiaorui.cc package main import ( "flag" "fmt" "io/ioutil" "log" "net/http" _ "net/http/pprof" "sync" "time" ) func counter() { list := []int{1} c := 1 for i := 0; i < 10000000; i++ { httpGet() c = i + 1 + 2 + 3 + 4 - 5 list = append(list, c) } fmt.Println(c) fmt.Println(list[0]) } func work(wg *sync.WaitGroup) { for { counter() time.Sleep(1 * time.Second) } wg.Done() } func httpGet() int { queue := []string{"start..."} resp, err := http.Get("http://www.163.com") if err != nil { // handle error } //defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { // handle error } queue = append(queue, string(body)) return len(queue) } func main() { flag.Parse() //这里实现了远程获取pprof数据的接口 go func() { log.Println(http.ListenAndServe("localhost:7777", nil)) }() var wg sync.WaitGroup wg.Add(10) for i := 0; i < 100; i++ { go work(&wg) } wg.Wait() time.Sleep(3 * time.Second) }
下面是pprof统计的heaq信息
另外需要说的一点,pprof可以生成一个svg的矢量图,可以通过这svg图确认代码的流程及调用情况. svg是使用graphviz生成的,mac下直接brew install graphviz就能安装,centos下,yum -y install graphviz .
下面是pprof help的使用文档.
根据pprof的统计信息我们可以找到CPU过度计算及内存泄露的大概的点。 现在越来越觉得Golang gc有些让人摸不清头脑. 看来有必要深入学习Golang gc垃圾回收原理.
END… ….
你好,我使用 go tool pprof http://localhost:6060/debug/pprof/heap这种方式出现了错误parsing profile: unrecognized profile format, 请问你有遇到过吗?
你少了一些东西,应该是这样 go tool pprof http://127.0.0.1:8601/debug/pprof/heap?debug=1,或者使用浏览器直接访问 http://127.0.0.1:8601/debug/pprof/ ,最后的斜杠不要忘了
mark了
赞,峰云大哥的博客干货就是多啊~