这两天用golang在写一个监控的agent,发现长时间运行后会有内存泄露的情况,着实让人郁闷半天… 要解决golang泄露的问题,要理解goalng gc那是事情,再就是利用pprof监视golang的运行环境。
这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可以生成一个svg的矢量图,可以通过这svg图确认代码的流程及调用情况. svg是使用graphviz生成的,mac下直接brew install graphviz就能安装,centos下,yum -y install graphviz .
根据pprof的统计信息我们可以找到cpu过度计算及内存泄露的大概的点。 现在越来越觉得Golang gc有些让人摸不清头脑. 看来有必要深入学习Golang gc垃圾回收原理.
如果你想用Python开辟副业赚钱,但不熟悉爬虫与反爬虫技术,没有接单途径,也缺乏兼职经验
关注下方微信公众号:Python编程学习圈,获取价值999元全套Python入门到进阶的学习资料以及教程,还有Python技术交流群一起交流学习哦。