go-性能分析
文章目录
go 性能分析
- 使用默认 pprof 工具 : go tool pprof cpu.prof
- 图形化界面依赖于graphviz
- 常用命令:
- top: 列出最高调用
- list: 列出问题代码片段
- peek: 查询具体函数的调用关系
- web: 图形化界面
|
|
benchmark 测试
运行选项:
- bench: 输入正则表达式,匹配才会执行
- benchmem: 输出内存分配
- benchtime: 运行时间,默认1秒,可以设置次数,比如 500x
- -count: 轮速, 执行多次轮
- 生成profile 文件,用于 pprof 分析
- -cpuprofile=cpu.count
- -memprofile=mem.out
- -blockfile=block.out
运行结果: 运行次数,单词运行耗时,总耗时
google pprof 工具安装
web 界面展示
- 使用 pprof工具分析:
go get -u github.com/google/pprof
- 安装 graphviz
- web界面: pprof -http=:8080 cpu.prof
web 界面查看 最红最粗的就是 关键的性能瓶颈
使用反射会导致内存分配, 性能优化尽量减少反射的使用
如何查看火焰图
白色的是代码运行本身占用,有颜色红色,黄色等就是性能瓶颈(性能开销)
内存和cpu 分析 – view trace
- timeline: 时间线,表达执行时机
- Heap: 内存占用,分析 goroutine哪个消耗比较大,可以用来辅助分析内存逃逸
- Goroutines: 执行中的goroutine 和可以执行的goroutine
- Threads: 系统线程
- PROCS: go概念中的 processor
采样的概念
名字 | 含义 |
---|---|
InSyscall | 处于系统调用 |
running | 运行状态 |
GO 逃逸分析
在go里面,对象可以被分配在栈或者堆上。 分配在堆上的,被称为内存逃逸
可能的原因 ( 不是必然逃逸,而是可能逃逸。 是否逃逸和 执行上下文有关)
- 指针逃逸: 方法返回局部变量指针
- interface{} 逃逸: 如使用 interface{} 作为参数或者返回值
- 接口逃逸: 如以接口作为返回值
- 大对象: 大对象会直接分配到堆上
- 栈空间不足
- 闭包: 闭包内部引用了外部变量
- channel 传递指针
分析内存逃逸 gcflags=-m
|
|
文章作者 lyr
上次更新 2022-05-11