Go:性能优化
目录:
性能优化
性能优化主要有几个方面
- CPU CPU的使用情况
- 内存 程序内存的使用情况
- goruntine 不在运行状态的情况是否存在死锁,调用关系
go语言内置了获取程序运行的库
runtime/pprof
采集工具类应用运行输出分析net/http/pprof
采集服务型应用运行输出分析
pprof开启之后,每隔10ms就会采集一下当前堆栈信息,获取函数占用的CPU和内存资源,对数据进行采样和分析,生成数据报告
runtime/pprof
直接引入即可
import runtime/pprof
CPU性能分析
开启CPU性能分析
pprof.StartCPUProfile(w io.Writer)
关闭CPU性能分析
pprof.StopCPUProfile()
应用结束后会产生文件用于保存profiling数据,使用go tool pprof
进行CPU性能分析
内存性能分析
pprof.WriteHeapProfile(w io.Writer)
也同样是go tool pprof
进行性能分析,默认是使用-inuse_space
参数,可以使用-inuse-objects
查看内存分配对象
go tool pprof
使用方式
go tool pprof [binary] [source]
- binary 是应用的二进制文件,用来解析各种符号;
- source 表示profile数据的来源,可以是本地的文件,也可以是http地址
示例有问题的代码
实行性能分析
$ go run main.go -cpu
File: main
Type: cpu
Time: Feb 20, 2020 at 12:43am (CST)
Duration: 20.40s, Total samples = 18.22s (89.33%)
Entering interactive mode (type "help" for commands, "o" for options)
(pprof)
进入交互界面
(pprof) top5
Showing nodes accounting for 18.22s, 100% of 18.22s total
flat flat% sum% cum cum%
7.72s 42.37% 42.37% 7.72s 42.37% runtime.chanrecv
6.04s 33.15% 75.52% 13.76s 75.52% runtime.selectnbrecv
4.46s 24.48% 100% 18.22s 100% main.logicCode
- flat 当前函数占用CPU耗时
- flat% 当前函数占用CPU耗时的百分比
- sum% 占用CPU耗时的累计百分比
- cum 当前函数加上调用当前函数占用CPU耗时
- cum% 当前函数加上调用当前函数占用CPU耗时的百分比
- 最后一列 函数名称
可以使用list <函数名>
的方式查看函数的耗时情况
(pprof) list logicCode
Total: 18.22s
ROUTINE ======================== main.logicCode in /root/go_code/src/runtimme_pprof/main.go
4.46s 18.22s (flat, cum) 100% of Total
. . 10:
. . 11:func logicCode() {
. . 12: var c chan int
. . 13: for {
. . 14: select {
4.46s 18.22s 15: case v := <- c:
. . 16: fmt.Printf("recv from chan, value: %v\n", v)
. . 17: default:
. . 18:
. . 19: }
. . 20: }
可以发现CPU资源都是被case v := <- c
,因为default没有内容,可以在default分支添加time.Sleep(time.Second)