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 程序。