背景

最近合作开发一个项目,项目部署发现了才跑了没多久,就直接宕机了,查看服务器信息发现在某个时间端内存猛的暴涨了非常多,由于是合作开发的项目,我仔细的检查了自己的拿块代码,都没啥问题,另一个开发也说自己的代码没啥问题。

pprof

pprof 是什么

pprofgo

pprof 的采样方式

  • runtime/pprof
  • net/http/pprof
  • test

这里举例采样内存信息。

heapProfilego tool pprof heapProfile top

webCould not execute dot; may need to install graphviz.

runtime.MemStats

net/http/pprof

net/http/pprof
http://127.0.0.1:6060/debug/pprof

  • allocs:查看过去所有内存分配的样本。
  • block:查看导致阻塞同步的堆栈跟踪。
  • cmdline: 当前程序的命令行的完整调用路径。
  • goroutine:查看当前所有运行的 goroutines 堆栈跟踪。
  • heap:查看活动对象的内存分配情况。
  • mutex:查看导致互斥锁的竞争持有者的堆栈跟踪。
  • profile: 默认进行 30s 的 CPU Profiling,得到一个分析用的 profile 文件。
  • threadcreate:查看创建新 OS 线程的堆栈跟踪。
  • trace:略,trace可以单独写一篇文章来介绍。
blockmutex

gin 框架使用 pprof

gingohttppprofgithub.com/gin-contrib/pprofnet/http/pprof

test

testgo tool pprof

火焰图

安装

启动

http://localhost:8080

每个块都是可点击的,可以进行深度分析。

总结

pprofgocpugoroutine
pprof

参考

golang pprof 实战-CPU,heap,alloc,goroutine,mutex,block

Go 语言编程之旅-pprof篇

实用go pprof使用指南