背景
由于最近线上服务业务量正大暴露出一些性能问题(CPU比日常翻倍、内存释放过程不如预期),所有,不得不借助golang提供的系列工具来分析,帮助快速定位问题代码段,进而优化代码逻辑的(加深对语言特性的理解);
主要内容
- pprof工具的使用
- trace日志信息
1. pprof工具的使用
主要package:
复制代码
1
2
3
4
5// 性能分析基础包 "runtime/pprof" // web封装 “net/http/pprof
1.1 基础包的使用
使用pprof基础包可以很方便的讲程序运行的某个时间段内的goroutine、堆栈、CPU等信息导出;
在使用golang工具链中的pprof工具输出更加直观的信息,方便分析;
通过第三方提供的工具/补丁,甚至可以实现火焰图输出;
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25package main import ( "os" "runtime/pprof" "sort" "time" ) func main() { var arr []int pprofCPU, _ := os.OpenFile("./pprof_cpu", os.O_RDWR|os.O_CREATE, 775) defer pprofCPU.Close() pprofHeap, _ := os.OpenFile("./pprof_heap", os.O_RDWR|os.O_CREATE, 775) defer pprofHeap.Close() pprof.StartCPUProfile(pprofCPU) defer pprof.StopCPUProfile() pprof.WriteHeapProfile(pprofHeap) for i := 0; i < 1000; i++ { t := time.Tick(10 * time.Millisecond) <-t arr = append(arr, i) } sort.Sort(sort.IntSlice(arr)) time.Sleep(time.Second) }
其中几个最常用的几个函数:
复制代码
1
2
3
4
5
6// 开始/结束CPU分析 StartCPUProfile func(w io.Writer) error StopCPUProfile func() // 堆栈分析 WriteHeapProfile func(w io.Writer) error
使用以上函数,可以输出相应的文件,通过go tool pprof
可以对结果进行简单的分析:
复制代码
1
2
3
4
5
6
7
8go tool pprof ./pprof_cpu 之后进入pprof的交互界面: help:查看所有命令 top、list等分析类命令 web、svg、git等导出类命令 exit 退出 ## sudo apt install graphviz
pprof支持的命令可通过help查询
1.2 web封装
golang在http层实现了对pprof的封装,使用也更加简单;
示例
复制代码
1
2
3
4
5
6
7
8
9package main import ( "net/http" _ "net/http/pprof" ) func main() { http.ListenAndServe(":1999", nil) }
使用方式:
复制代码
1
2
3
4
5
6
7
8http://localhost:1999/debug/pprof/ -- block -- goroutine -- heap 堆栈信息 -- mutex -- threadcreate 线程创建信息
同样的我们可以借助pprof分析web应用的性能问题:
复制代码
1
2
3
4
5// 分析一段时间内的CPU计算信息 -- 查找CPU过度消耗问题 go tool pprof http://localhost:1999/debug/pprof/profile // 堆栈信息 -- 查找内存泄露问题 go tool pprof http://localhost:1999/debug/pprof/heap
2. trace信息
如果通过pprof工具无法找到问题所在,我们或许需要在本地开启debug模式,查看和分析golang调度和GC的细节过程来找到过滤,并发现问题所在;
要开启golang的debug模式主要是通过设置环境变量来完成的:
复制代码
1
2
3
4
5
6
7
8
9
10## 方法一 GODEBUG=gctrace=1 go run ./pprof_tool.go 2>trace.log ## 方法二 设置用户环境变量:GODEBUG=gctrace=1,schedtrace=100 常用标志: gctrace: 打印GC信息 schedtrace: 打印调度信息 scavenge: scavenge信息
输出信息的具体含义,参考源码和网上资料;
总结
主要介绍了golang程序性能分析的最基础的方法,可以提供参考;具体到实际的应用中还需要更多更有效的手段来缩短我们定位问题代码的时间;
最后
以上就是伶俐画板最近收集整理的关于golang代码笔记 --pprof的基本使用和程序性能分析的全部内容,更多相关golang代码笔记内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复