软件开发过程中,项目上线并不是终点。上线后,还要对程序的取样分析运行情况,并重构现有的功能,让程序执行更高效更稳写。golang的工具包内自带pprof功能,使找出程序中占内存和CPU较多的部分功能方便了不少。加上超级的火焰图,可视化显示,让我们在分析程序时更简单明了。
pprof有两个包用来分析程序一个是net/http/pprof另一个是运行时/pprof,net/http/pprof只是对运行时/pprof包进行封装并用http暴露出来,如下图源码所示:
pprof分析网络项目,非常的简单只需要导入包即可。
_ "net/http/pprof "
编写一个小的web服务器
主要包 导入( _ "net/http/pprof” "net/http” “时间” “数学/兰德” “fmt” ) var计算int64=0 函数main () { 去calCount () http。HandleFunc(“/测试”,测试) http。handlerData HandleFunc(“/数据”) 错:=http。nil ListenAndServe (“9909”) 如果犯错!=nil { 恐慌(err) } } func handlerData http (w。ResponseWriter r * http.Request) { qUrl:=r.URL fmt.Println (qUrl) fibRev:=Fib () var fib uint64 我:=0;我& lt;5000;我+ + { fib=fibRev () fmt。Println (“fib=", fib) } str:=RandomStr (RandomInt (100、500)) str=fmt。Sprintf (“Fib=% d;字符串=% s”、fib、str) w.Write([]字节(str)) } 函数测试(w http。ResponseWriter r * http.Request) { fibRev:=Fib () var fib uint64 指数:=计数 加勒比海盗:=([]uint64、索引) var我int64 为;我& lt;指数;我+ + { fib=fibRev () arr[我]=无伤大雅的谎言 fmt。Println (“fib=", fib) } time . sleep(时间。毫秒* 500) str:=fmt。Sprintf (“Fib=% v”, arr) w.Write([]字节(str)) } uint64 Fib()函数func () { var x, y uint64=0, 1 uint64返回func () { x, y=y、x + y 返回x } } var letterRunes=[]神符(“abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890”) 字符串函数RandomStr (num int) { 种子:=time.Now () .UnixNano () 如果种子& lt;=0 { .UnixNano种子=time.Now () () } rand.Seed(种子) b:=([]符文,num) 我:=b{范围 b[我]=letterRunes [rand.Intn (len (letterRunes))) } 返回字符串(b) } func RandomInt int(最小,最大int) { .UnixNano rand.Seed (time.Now () ()) 返回兰德。Intn(最大值-最小值+ 1)+分钟 } func calCount () { timeInterval:=time.Tick (time.Second) 为{ 选择{ 我:=& lt; - timeInterval: 数=int64 (i.Second ()) } } }9909年
web服务监听端口
web服务器有两个http方法
测试:根据当前的秒数做斐波那契计算
数据:做一个5000年的斐波那契计算并返回一个随机的字符串
运行程序,通过访问http://192.168.3.34:9909/调试/pprof/可以查看网页版的概要文件相关信息
这几个路径表示的是
/调试/pprof/简介:访问这个链接会自动进行CPU配置,持续30年代,并生成一个文件供下载
/调试/pprof/块:Goroutine阻塞事件的记录。默认每发生一次阻塞事件时取样一次。
/调试/pprof/了Goroutine:活跃Goroutine的信息的记录。仅在获取时取样一次。
/调试/pprof/堆:堆内存分配情况的记录。默认每分配512 k字节时取样一次。
/调试/pprof/互斥:查看争用互斥锁的持有者。
/调试/pprof/threadcreate:系统线程创建情况的记录。仅在获取时取样一次。
除了这些golang为我提供了更多方便的方法,用于分析、下面我们来用命令去访问详细的信息
我们用wrk来访问我们的两个方法,这样我们的服务会处在高速运行状态,取样的结果会更准确
wrk 20 - t - c 5 - 3 m公司http://192.168.3.34:9909的数据 wrk 20 - t - c 5 - 3 m http://192.168.3.34:9909测试golang利用pprof与go-torch如何做性能分析