GO的调优之实战pprof性能调优(一)

实战pprof性能调优 项目连接 CPU 首先top看下占用: 用perf top -g查看: 可以看到有个for循环 占据了99.7%的时间 用pprof来看看,先采样得到profile.prof 然后go tool pprof查看

实战pprof性能调优

项目连接

CPU

首先top看下占用:

Untitled.png

perf top -g查看:

Untitled.png

Untitled.png

可以看到有个for循环 占据了99.7%的时间

用pprof来看看,先采样得到profile.prof 然后go tool pprof查看

Untitled.png

结果也指向这个Eat函数里面的24行

修改完后再次查看,cpu占用没啥问题了

内存

现在检查内存

perf record -p 10232 -u mem:会生成一个data文件 -u表示只记录用户态的

perf report 执行后选中对应文件

Untitled.png

出现了100% 内存占用

或者用top查看

Untitled.png

Untitled.png

似乎是logger的问题

Untitled.png

go tool pprof http://localhost:6060/debug/pprof/heap 得到当前的采样

?seconds一般只有cpu分析 计算平均时间

用pprof heap看看问题在哪

Untitled.png

Untitled.png

append一直往数组里面添加 直到 constant.Mi = 1024*1024

GC回收情况

为了获取程序运行过程中 GC 日志,我们需要先退出炸弹程序,再在重新启动前赋予一个环境变量,同时为了避免其他日志的干扰,使用 grep 筛选出 GC 日志查看:

GODEBUG=gctrace=1 ./go-pprof-practice | grep gc

Untitled.png

可以看到,GC 差不多每 3 秒就发生一次,且每次 GC 都会从 16MB 清理到几乎 0MB,说明程序在不断的申请内存再释放,这是高性能 golang 程序所不允许的。

如果你希望进一步了解 golang 的 GC 日志可以查看《如何监控 golang 程序的垃圾回收》,为保证实验节奏,这里不做展开。

所以接下来使用 pprof 排查时,我们在乎的不是什么地方在占用大量内存,而是什么地方在不停地申请内存,这两者是有区别的。

由于内存的申请与释放频度是需要一段时间来统计的,所有我们保证炸弹程序已经运行了几分钟之后,再运行命令:

go tool pprof http://localhost:6060/debug/pprof/allocs

Untitled.png

m.buffer = appen(…) 会一直往m.buffer加东西

_ = make… 无意义的make 16M

Comment