这是我参与「第三届青训营 -后端场」笔记创作活动的的第一篇笔记。
前言
当使用 Golang 开发服务后端时,难免产生性能问题,如内存泄漏、Goroutine 卡死等,Golang 是一个对性能要求很高的语言。
性能调优的原则大致有四条:要依靠数据而不是猜测;要关注主要部分而不是细枝末节;不要过早优化;不要过度优化。
语言中自带的 PProf 工具可用于可视化和数据分析,因而成为我们检测 Golang 开发应用性能的利器。
搭建pproff实战项目
初始化
项目位置:wolfogre/go-pprof-practice: go pprof practice. (github.com)
克隆这个项目,然后进行go mod初始化
go mod init github.com/wolfogre/go-pprof-practice;
go mod tidy
之后我们就可以正常运行程序
这个项目中制造了一些代码问题,需要我们通过 pprod 进行排查。
浏览器查看指标
浏览器中我们打开:http://localhost:6060/debug/pprof/
可以看到如下画面:
*allocs:内存分配情况
block:阻塞操作情况
cmdline:程序启动命令
goroutine:所有gorountine堆栈情况
heap:堆上内存使用情况
mutex:锁竞争操作情况
profile:CPU占用情况
threadcreate:系统线程的堆栈情况
trace:程序运行跟踪信息*
性能排查
CPU
在命令行中使用命令 go tool pprof "http://localhost:6060/debug/pprof/profileseconds=10"
十秒后展示出 pprof 终端:
输入
Top指令,我们得到CPU占用情况前十的十个函数\
接下来输入
List 函数名 ,我们可以查找这个函数,看看具体是那里出了问题。
我们发现Tiger.Eat函数中有个无用循环,我们可以将它去除。
除了这种视图,我们还可以使用Web命令,得到可视化图片:
Heap
刚刚我们使用的是 pprof 终端,现在我们输入命令go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/heap",可以开启工具自备的Web UI功能。
Top视图:
我们发现Mouse.Steal函数对其影响巨大,我们进行对这一部分的检查,然后改正。
堆内存的四个指标:
*alloc_objects:累计申请对象数
alloc_space:累计申请空间
inuse_objects:当前对象数
inuse_space:当前申请空间*
Goroutine
步骤如同之前,但是这次我们使用火焰图:
图中,自定向下表示各个函数调用的层级关系。
每一行中,条形越长表示消耗的资源越多。
那些又长又平的节点就是占用资源较多的点。
我们对 Wolf.Drink 函数进行定位,然后改进。
接下来对于mutex和block的分析也用到上面介绍的这几个工具,方法类似,就不再做出演示。
总结
我们使用pprof中的Top、Source、Graph、Flame视图对这个项目进行了性能优化,发现项目中的错误。通过这个项目的修改过程,我们能够学会pprof的基本使用方式,这种方式可以大大帮助我们以后进行性能优化,希望大家都能学会然后多多运用。