Tag: pprof

2 Posts

thumbnail
golang 内存占用信息解读
触发方法: 其中debug参数为2是以高可读的方式提供各活跃Goroutine的状态信息和调用栈信息,更便于理解。 方法一(内容比较少场景适用) curl http://localhost:8001/debug/pprof/heap?debug=2 # 这个输出信息可以参考下面的解读 方法二(内容比较多场景适用) # adserver是我的程序名字,需要换成你自己的 scp 10.200.95.17:/opt/zyz/services/bin/adserver ./ # 参数信息见下面“交互式命令” go tool pprof adserver [-alloc_space|-inuse_space] http://10.200.95.17:8001/debug/pprof/heap?debug=2 # 接下来查看方法参考cpu性能统计方式,是类似的 https://www.vvniu.com/108.html 交互式命令 除了和查看cpu一致的top、list等命令,还有就是查看方式不同。 在使用 pprof 查看内存的时候,通常会用到两个选项。 - alloc_space用于告诉你已经分配了多少内存 - inuse_space用于获得正在使用的内存的数量 信息解读 解读一 # 看第一行的1: 5816320 [1: 5816320],四个数字的含义是当前存活对象的数量、存活对象已经占用的内存、分配的总的数量和所有分配已经占用的内存。 对应于具体代码来讲ip_helper.go:52中对应ipRecords对象,当前占用了582k内存,当前的存活的对象也只有一个,总共分配的对象数量也是1个,总共占用内存也是582k。 1: 5816320 [1: 5816320] @ 0x443d21 0x46806d 0x468614 0x94cf80 0x78a4b7 0x50f457 0x50a82b 0x466017 0x4019cb 0x42fa2f 0x460f01 # 0x46806d adserver/util.init.2+0xaed /home/jiyalei/serving_clean/backend/src/adserver/util/ip_helper.go:52 # 0x468614 adserver/util.init+0xf4 /home/jiyalei/serving_clean/backend/src/adserver/util/ip_helper.go:88 # 0x94cf80 adserver/nctrserver.init+0x40 /home/jiyalei/serving_clean/backend/src/adserver/nctrserver/nctrclient.go:42 # 0x78a4b7 adserver/bidserver.init+0x47 /home/jiyalei/serving_clean/backend/src/adserver/bidserver/spec.go:97 # 0x50f457 adserver/bucket.init+0x47 /home/jiyalei/serving_clean/backend/src/adserver/bucket/util.go:52 # 0x50a82b adserver/antispam.init+0x3b /home/jiyalei/serving_clean/backend/src/adserver/antispam/antispam.go:201 # 0x466017 adserver/server.init+0x47 /home/jiyalei/serving_clean/backend/src/adserver/server/adserver_handler.go:356 # 0x4019cb main.init+0x3b /home/jiyalei/serving_clean/backend/src/adserver/adserver.go:36 # 0x42fa2f runtime.main+0x27f /data/opt/go/src/runtime/proc.go:177 解读二 # ip_helper.go:29对应的对象是`line := strings.TrimSuffix(sc.Text(), ";")`读取文件临时生成的内容[]string,其中当前存活了11个,占用内从352字节,总共分配了14个,总共占用内存是448字节。 11: 352 [14: 448] @ 0x4481c7 0x44804f 0x46787c 0x468614 0x94cf80 0x78a4b7 0x50f457 0x50a82b 0x466017 0x4019cb 0x42fa2f 0x460f01 # 0x46787c adserver/util.init.2+0x2fc /home/jiyalei/serving_clean/backend/src/adserver/util/ip_helper.go:29 # 0x468614 adserver/util.init+0xf4 /home/jiyalei/serving_clean/backend/src/adserver/util/ip_helper.go:88 # 0x94cf80 adserver/nctrserver.init+0x40 /home/jiyalei/serving_clean/backend/src/adserver/nctrserver/nctrclient.go:42 # 0x78a4b7 adserver/bidserver.init+0x47 /home/jiyalei/serving_clean/backend/src/adserver/bidserver/spec.go:97 # 0x50f457 adserver/bucket.init+0x47 /home/jiyalei/serving_clean/backend/src/adserver/bucket/util.go:52 # 0x50a82b adserver/antispam.init+0x3b /home/jiyalei/serving_clean/backend/src/adserver/antispam/antispam.go:201 # 0x466017 adserver/server.init+0x47 /home/jiyalei/serving_clean/backend/src/adserver/server/adserver_handler.go:356 # 0x4019cb main.init+0x3b /home/jiyalei/serving_clean/backend/src/adserver/adserver.go:36 # 0x42fa2f runtime.main+0x27f /data/opt/go/src/runtime/proc.go:177 解读三 # runtime.MemStats # Alloc = 232368464 // 系统分配了,并且仍在使用的内存 # TotalAlloc = 515498984 // 分配的内存总量 # Sys = 379609648 // 从系统得到的内存总量 # Lookups…
thumbnail
golang cpu性能统计解读
依赖前提 程序中引入pprof包后可以直接查看线上的服务性能数据 import ( _ "net/http/pprof" ) 触发方法 # 比如程序对外暴露8001端口 go tool pprof http://127.0.0.1:8001/debug/pprof/profile?seconds=60 结果解读 如果没有添加统计时间参数,则触发之后会默认进入30s统计阶段,之后进入交互是界面,可以查看性能数据。我们先这样看,top -cum,是按照cum列按占用时间顺序显示前10个。 [@zyz-4 ~]$ go tool pprof http://localhost:8001/debug/pprof/profile Fetching profile from http://localhost:8001/debug/pprof/profile Please wait... (30s) Saved profile in /data/home/jiyalei/pprof/pprof.localhost:8001.samples.cpu.002.pb.gz Entering interactive mode (type "help" for commands) (pprof) top -cum 10ms of 80ms total (12.50%) Showing top 10 nodes out of 55 (cum >= 10ms) flat flat% sum% cum cum% 0 0% 0% 60ms 75.00% runtime.goexit 0 0% 0% 30ms 37.50% dproxy/helper.(*DataManager).StartRun 0 0% 0% 30ms 37.50% dproxy/helper.(*DataManager).realRun 10ms 12.50% 12.50% 30ms 37.50% dproxy/helper.(*DataManager).startRealTimer 0 0% 12.50% 20ms 25.00% dproxy/helper.(*RpcClient).RealGetFunc 0 0% 12.50% 10ms 12.50% dproxy/helper.(*RpcClient).GetNewClient 0 0% 12.50% 10ms 12.50% encoding/gob.(*Encoder).Encode 0 0% 12.50% 10ms 12.50% encoding/gob.(*Encoder).EncodeValue 0 0% 12.50% 10ms 12.50% encoding/gob.(*Encoder).encode 0 0% 12.50% 10ms 12.50% encoding/gob.(*Encoder).encodeStruct (pprof) top命令默认显示10个,可以通过topN的方式显示N个,cum参数表示按照cum列排序。 flat的意思是本地取样计数,cum的意思是累积取样计数,具体含义引用自官方文档: 本地取样计数和累积取样计数。本地取样计数的含义是当前函数在取样中直接出现的次数。累积取样计数的含义是当前函数以及当前函数直接或间接调用的函数在取样中直接出现的次数。所以,存在这样一种场景:对于一个函数来说,它的本地取样计数是0。因为它没有在取样中直接出现过。但是,由于它直接或间接调用的函数频繁的直接出现在取样中,所以这个函数的累积取样计数却会很高。我们以上图中的函数mian.main为例。由于main.main函数在所有取样中都没有直接出现过,所以它的本地取样计数为0。但又由于它是命令源码文件中的入口函数,程序中其他的函数都直接或间接的被它调用。所以,它的累积取样计数是所有函数中最高的。注意,不论是本地取样计数还是累积取样计数都没有把函数对自身的调用计算在内。函数对自身的调用又被称为递归调用. 我们通常看累计取样计数cum的时间,可以大致体现出来当前的耗时。可以通过list + 函数名的方式查看具体函数内部的占用时间,仅限于“触发方法二”: (pprof) list StartRun Total: 70ms ROUTINE ======================== dproxy/helper.(*DataManager).StartRun in /home/jiyalei/serving_clean/backend/src/dproxy/helper/dataManager.go 0 10ms (flat, cum) 14.29% of Total . . 72:} . . 73: . . 74://run DataManager on caller's gorountine, so caller will be blocked . . 75:func (self *DataManager) StartRun() { . .…