gopprof详细教程与案例分析

更新时间:2023-05-31 19:03:37 阅读: 评论:0

gopprof详细教程与案例分析
divorcego pprof简介
profile ⼀般被称为 性能分析,词典上的翻译是 概况(名词)或者 描述…的概况(动词)。对于计算机程序来说,它的 profile,就是⼀个程序在运⾏时的各种概况信息,包括 cpu 占⽤情况,内存情况,线程情况,线程阻塞情况等等。知道了程序的这些信息,也就能容易的定位程序中的问题和故障原因 。pprof是Go的性能分析⼯具,在程序运⾏过程中,可以记录程序的运⾏信息,可以是CPU使⽤情况、内存使⽤情况、goroutine运⾏情况等,当需要性能调优或者定位Bug时候,这些记录的信息是相当重要。golang 对于 profiling ⽀持的⽐较好,标准库就提供了profile库 “runtime/pprof” 和 “net/http/pprof”,⽽且也提供了很多好⽤的可视化⼯具来辅助开发者做 profiling。
对于在线服务,对于⼀个 HTTP Server,访问 pprof 提供的 HTTP 接⼝,获得性能数据。当然,实际上这⾥底层也是调⽤的
runtime/pprof 提供的函数,封装成接⼝对外提供⽹络访问,本⽂主要介绍"net/http/pprof"的使⽤。
基本使⽤
web服务中如何开启监控,来看⼀个简单的例⼦。
package main
import(
"fmt"
"net/http"
_"net/http/pprof"hole
)
func main(){
// 开启pprof,监听请求
ip :="0.0.0.0:8080"
if err := http.ListenAndServe(ip,nil); err !=nil{
fmt.Printf("start pprof failed on %s\n", ip)
}
dosomething()
}笞刑
在程序中导⼊ "net/http/pprof"包,并打开监听端⼝,这时候便可以获取程序的profile,在实际⽣产中,我们⼀般将这个功能封装成⼀个goroutine。那么开启之后如何查看呢?有三种⽅式:
浏览器⽅式
打开⼀个浏览器输⼊ ip:port/debug/pprof,回车。
韩语翻译器在线
pprof会提供很多性能数据。具体含义为:
allocs:内存分配情况的采样信息
blocks:阻塞操作情况的采样信息 cmdline:程序启动命令及其参数
goroutine:当前所有协程的堆栈信息
heap:堆上内存的使⽤情况的采样信息 mutex:锁争⽤情况的采样信息
profile:cpu占⽤情况的采样信息
threadcreate:系统线程创建情况的采样信息
trace:程序运⾏的跟踪信息
allocs是所有对象的内存分配,heap是活跃对象的内存分配,后⽂会有详细的描述。
1、当 CPU 性能分析启⽤后,Go runtime 会每 10ms 就暂停⼀下,记录当前运⾏的 goroutine 的调⽤堆栈及相关数据。当性能分
析数据保存到硬盘后,我们就可以分析代码中的热点了。
2、内存性能分析则是在堆(Heap)分配的时候,记录⼀下调⽤堆栈。默认情况下,是每 1000 次分配,取样⼀次,这个数值可以改
变。栈(Stack)分配 由于会随时释放,因此不会被内存分析所记录。由于内存分析是取样⽅式,并且也因为其记录的是分配内存,⽽不是使⽤内存。因此使⽤内存性能分析⼯具来准确判断程序具体的内存使⽤是⽐较困难的。
3、阻塞分析是⼀个很独特的分析,它有点⼉类似于 CPU 性能分析,但是它所记录的是 goroutine 等待资源所花的时间。阻塞分析
对分析程序并发瓶颈⾮常有帮助,阻塞性能分析可以显⽰出什么时候出现了⼤批的 goroutine 被阻塞了。阻塞性能分析是特殊的分析⼯具,在排除 CPU 和内存瓶颈前,不应该⽤它来分析。
当然,如果你点进任何⼀个链接,便会发现,可读性差,⼏乎⽆法分析。如图:
点击heap,拉到最底部,可以看到⼀些有意思的数据,有时候也有可能会对问题排查有帮助,但⼀般不⽤。
heap profile: 3190: 77516056[54762: 612664248] @ heap/1048576
1: 29081600[1: 29081600] @ 0x89368e 0x894cd9 0x8a5a9d 0x8a9b7c 0x8af578 0x8b4441 0x8b4c6d 0x8b8504 0x8b2bc3 0x45b1c1
apparent
#    0x89368d    /syndtr/goleveldb/leveldb/memdb.(*DB).Put+0x59d
#    0x894cd8    xxxxx/storage/internal/memtable.(*MemTable).Set+0x88
#    0x8a5a9c    xxxxx/storage.(*snapshotter).AppendCommitLog+0x1cc
#    0x8a9b7b    xxxxx/storage.(*store).Update+0x26b
#    0x8af577    xxxxx/config.(*config).Update+0xa7
#    0x8b4440    xxxxx/naming.(*naming).update+0x120
#    0x8b4c6c    xxxxx/naming.(*naming).instanceTimeout+0x27c
#    0x8b8503    xxxxx/naming.(*naming).(xxxxx/naming.instanceTimeout)-fm+0x63
......
# runtime.MemStats
# Alloc = 2463648064
# TotalAlloc = 31707239480
# Sys = 4831318840
# Lookups = 2690464
英文地址# Mallocs = 274619648
# Frees = 262711312
# HeapAlloc = 2463648064
# HeapSys = 3877830656
antik# HeapIdle = 854990848
# HeapInu = 3022839808
# HeapRelead = 0
# HeapObjects = 11908336
# Stack = 655949824 / 655949824
# MSpan = 63329432 / 72040448
# MCache = 38400 / 49152
# BuckHashSys = 1706593
# GCSys = 170819584
# OtherSys = 52922583
# NextGC = 3570699312
# PauNs = [1052815 217503 208124 233034 ......]
# NumGC = 31
love must need our patience
# DebugGC = fal
Sys: 进程从系统获得的内存空间,虚拟地址空间
wea
HeapAlloc:进程堆内存分配使⽤的空间,通常是⽤户new出来的堆对象,包含未被gc掉的。
HeapSys:进程从系统获得的堆内存,因为golang底层使⽤TCmalloc机制,会缓存⼀部分堆内存,虚拟地址空间
PauNs:记录每次gc暂停的时间(纳秒),最多记录256个最新记录。
NumGC: 记录gc发⽣的次数
命令⾏⽅式
除了浏览器,Go还提供了命令⾏的⽅式,能够获取以上信息,这种⽅式⽤起来更⽅便。
使⽤命令go tool pprof url可以获取指定的profile⽂件,此命令会发起http请求,然后下载数据到本地,之后进⼊交互式模式,就像gdb⼀样,可以使⽤命令查看运⾏信息,以下为使⽤⽰例:
# 下载cpu profile,默认从当前开始收集30s的cpu使⽤情况,需要等待30s
go tool pprof localhost:8080/debug/pprof/profile # 30-cond CPU profile
go tool pprof localhost:8080/debug/pprof/profile?conds=120# wait 120s
# 下载heap profile
go tool pprof localhost:8080/debug/pprof/heap # heap profile
# 下载goroutine profile
go tool pprof localhost:8080/debug/pprof/goroutine # goroutine profile
# 下载block profile
fal是什么意思go tool pprof localhost:8080/debug/pprof/block # goroutine blocking profile
# 下载mutex profile
go tool pprof localhost:8080/debug/pprof/mutex
接下来⽤⼀个例⼦来说明最常⽤的四个命令:web、top、list、traces。
接下来以内存分析举例,cpu和goroutine等分析同理,读者可以⾃⾏举⼀反三。
⾸先,我们通过命令go tool pprof url获取指定的profile/heap⽂件,随后⾃动进⼊命令⾏。如图:
第⼀步,我们⾸先输⼊web命令,这时浏览器会弹出各个函数之间的调⽤图,以及内存的之间的关系。如图:
这个图的具体读法,可参照: 或者 这⾥不多赘述。只需要了解越红越⼤的⽅块,有问题的可能性就越⼤,代表可能占⽤了更多的内存,如果在cpu的图中代表消耗了更多cpu资源,以此类推。
接下来 top、list、traces三步⾛可以看出很多想要的结果。
top 按指标⼤⼩列出前10个函数,⽐如内存是按内存占⽤多少,CPU是按执⾏时间多少。
top会列出5个统计数据:
flat: 本函数占⽤的内存量。
flat%: 本函数内存占使⽤中内存总量的百分⽐。
sum%: 之前函数flat的累计和。
cum:是累计量,假如main函数调⽤了函数f,函数f占⽤的内存量,也会记进来。
cum%: 是累计量占总量的百分⽐。
这样我们可以看到到底是具体哪些函数占⽤了多少内存。
当然top后也可以接参数,top n可以列出前n个函数。
list可以查看某个函数的代码,以及该函数每⾏代码的指标信息,如果函数名不明确,会进⾏模糊匹配,⽐如list main会列出main.main和runtime.main。现在list ndToASR试⼀下。
可以看到切⽚中增加元素时,占⽤了很多内存,左右2个数据分别是flat和cum。

本文发布于:2023-05-31 19:03:37,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/78/821951.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:内存   分析   情况
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图