Golang 程序的诊断

前言

前段时间自己写的程序出现了内存泄露,排查了很久,最终在 pprof 的帮助下提早发现了问题,还有检测并发程序中的竞争情况,也很方便。时过已久,这里再系统的总结一下。

概要分析(Profiling)

Go 程序可以在运行时提供 pprof 所需的分析数据,pprof 是 Go 的一款可视化工具,用以生成各种性能分析图。

runtime/pprof 包提供了以下几种类型的分析:

  • cpu: 统计程序花费的 CPU 时间(排除等待和IO时间)
  • heap: 堆检测。报告内存的分配,监视当前和历史内存的使用情况,检查内存泄露
  • threadcreate: 检测代码中创建线程的部分
  • goroutine: 报告所有 Goroutine 的堆栈跟踪
  • mutex: 报告锁的争用情况

在 Linux 系统上,还可以使用 perf tools 来更深入的分析 cgo/SWIG 代码和内核的性能问题。在 macOS 上可以使用 Instruments 套件来分析 Go 程序。

跟踪分析(Tracing)

调试(Debugging)

运行时统计(Runtime Statistics and Events)

参考

  1. Golang Diagnostics