前言:环境准备
1、安装go
先打开网址:Downloads - The Go Programming Language 下载需要的版本
2、安装git
yum install git
正文:
pprof有两个包:
net/http/pprof
runtime/pprof
其实net/http/pprof中只是使用runtime/pprof包来进行封装了一下,并在http端口上暴露出来
实例
package main
import (
"log"
"net"
"net/http"
"time"
)
func run() {
http.ListenAndServe(":7773", nil)
return
}
func main() {
go run()
go func() {
for {
fmt.Println("running...")
time.Sleep(10 * time.Millisecond)
}
}()
select {}
}
我们在本地7773端口开放了一个服务端,并在后台用一个循环来产生一些cpu消耗。
开启后我们可以访问http://localhost:7773/debug/pprof/
这个路径下还有几个子页面:
/debug/pprof/profile:访问这个链接会自动进行 CPU profiling,持续 30s,并生成一个文件供下载
/debug/pprof/heap: Memory Profiling 的路径,访问这个链接会得到一个内存 Profiling 结果的文件
/debug/pprof/block:block Profiling 的路径
/debug/pprof/goroutines:运行的 goroutines 列表,以及调用关系
实例:
1、goroutine
点击goroutine 进入后显示当前函数栈:
2、heap
heap可以查看内存占用情况:http://127.0.0.1:xxxx/debug/pprof/heap?debug=1
大略的概要信息:
# runtime.MemStats
# Alloc = 80342328
# TotalAlloc = 42618843704
# Sys = 2276174456
# Lookups = 363
# Mallocs = 392353246
# Frees = 391967629
# HeapAlloc = 80342328
# HeapSys = 2141683712
# HeapIdle = 2031599616
# HeapInuse = 110084096
# HeapReleased = 2031190016
# HeapObjects = 385617
# Stack = 1933312 / 1933312
# MSpan = 3113872 / 39682048
# MCache = 41664 / 49152
# BuckHashSys = 1566273
# GCSys = 81838080
# OtherSys = 9421879
# NextGC = 156401808
# LastGC = 1586508842618898472
说明:相关字段可以自己查询下吧
当然想看详细信息可以使用go tool pprof来进行分析:
go tool pprof -alloc_space/-inuse_space http://ip:8899/debug/pprof/heap
-inuse_space:分析程序的常驻内存占用情况。-alloc_objects:分析程序的内存临时分配情况,默认是使用-inuse_space。一个函数alloc_space多不一定就代表它会导致进程的RSS高。
这个命令进入后,是一个交互式界面,输入top命令可以前10大的内存分配,flat是堆栈中当前层的inuse内存值,cum是堆栈中本层级的累计inuse内存值(包括调用的函数的inuse内存值,上面的层级)。
3、cpu
分析cpu时延:
go tool pprof http://localhost:xxx/debug/pprof/profile
help有使用说明,这里可以自己看介绍
如果输入svg 可以生成图片:
另外:我们输入gif,在当前目录生成一个gif图片。或者安装Graphviz后也可以输入pdf 生成pdf文件。
go-torch和火焰图
火焰图(Flame Graph)是 Bredan Gregg 创建的一种性能分析图表,因为它的样子近似 火焰而得名。上面的 profiling 结果也转换成火焰图,如果对火焰图比较了解可以手动来操作,不过这里我们要介绍一个工具:go-torch
。这是 uber 开源的一个工具,可以直接读取 golang profiling 数据,并生成一个火焰图的 svg 文件。
安装go-touch:
go get -v github.com/uber/go-torch
export GO111MODULE=on
export GOPROXY=https://goproxy.cn
安装 FlameGraph:
要生成火焰图,需要事先安装 FlameGraph工具,这个工具的安装很简单(需要perl环境支持),只要把对应的可执行文件加入到环境变量中即可。
- 下载安装perl:Perl Download - www.perl.org
- 下载FlameGraph:
git clone https://github.com/brendangregg/FlameGraph.git
- 将
FlameGraph
目录加入到操作系统的环境变量中。export PATH=$PATH:$GOPATH/FlameGraph
安装graphviz
yum install graphviz
如果没有安装的perl的需要安装:
yum install perl
生成火焰图:
1、go-torch -u http://xxx.xxx.xxx.xxx:xxxx -t 20
2、根据cpu统计信息生成火焰图
先生成cpu统计文件:
在生成火焰图:
记录踩过的一个坑:
生成火焰图时报错:
INFO[22:45:45] Run pprof command: go tool pprof -raw -seconds 30 http://127.0.0.1:7070/debug/pprof/profile
FATAL[22:46:15] Failed: could not parse raw pprof output: strconv.ParseInt: parsing "runtime.findrunnable": invalid syntax
搜索资料无果,经过排查发现我的程序是在windows上编译的,再linux上生成图片会出问题,改成再linux上编译程序,解决。
tips:
windows上生成火焰图:
先下载graphviz
https://graphviz.org/download/
选择windows安装包。安装后在cmd中执行:dot -version 确认安装是否成功。
启动go程序,然后在cmd中执行:
go tool pprof -http=:7773 http://localhost:7773/debug/pprof/profile
等30秒,就会自动的打开一个网页。