实战pprof性能调优
项目连接
CPU
首先top看下占用:
用perf top -g
查看:
可以看到有个for循环 占据了99.7%的时间
用pprof来看看,先采样得到profile.prof 然后go tool pprof查看
结果也指向这个Eat函数里面的24行
修改完后再次查看,cpu占用没啥问题了
内存
现在检查内存
perf record -p 10232 -u mem
:会生成一个data文件 -u表示只记录用户态的
perf report
执行后选中对应文件
出现了100% 内存占用
或者用top查看
似乎是logger的问题
go tool pprof
http://localhost:6060/debug/pprof/heap
得到当前的采样
?seconds一般只有cpu分析 计算平均时间
用pprof heap看看问题在哪
append一直往数组里面添加 直到 constant.Mi = 1024*1024
GC回收情况
为了获取程序运行过程中 GC 日志,我们需要先退出炸弹程序,再在重新启动前赋予一个环境变量,同时为了避免其他日志的干扰,使用 grep 筛选出 GC 日志查看:
GODEBUG=gctrace=1 ./go-pprof-practice | grep gc
可以看到,GC 差不多每 3 秒就发生一次,且每次 GC 都会从 16MB 清理到几乎 0MB,说明程序在不断的申请内存再释放,这是高性能 golang 程序所不允许的。
如果你希望进一步了解 golang 的 GC 日志可以查看《如何监控 golang 程序的垃圾回收》,为保证实验节奏,这里不做展开。
所以接下来使用 pprof 排查时,我们在乎的不是什么地方在占用大量内存,而是什么地方在不停地申请内存,这两者是有区别的。
由于内存的申请与释放频度是需要一段时间来统计的,所有我们保证炸弹程序已经运行了几分钟之后,再运行命令:
go tool pprof http://localhost:6060/debug/pprof/allocs
m.buffer = appen(…) 会一直往m.buffer加东西
_ = make… 无意义的make 16M