Golang Profile
Go 的 profile 是一套内置于 runtime 的性能诊断机制,它通过采样或事件记录的方式,持续收集程序运行时的 CPU 使用、内存分配、Goroutine 状态、锁竞争等数据,最终生成一个可分析的数据文件(.prof)。go tool pprof 则是解读这些数据的官方工具,能将原始数据转化为调用图、火焰图或源码级别的热点标注,帮你定位性能瓶颈。 📊 Profile 的核心类型:按“症状”选择工具 每种 Profile 回答不同的问题,选错类型会浪费大量调查时间。 Profile 类型 采集标志 / HTTP 端点 核心用途 关键说明 CPU -cpuprofile 或 /debug/pprof/profile?seconds=30 高 CPU 占用、函数执行慢 以 100Hz 采样在 CPU 上运行的函数;无法捕获 I/O、Sleep 等 Off-CPU 时间 Heap (内存) -memprofile 或 /debug/pprof/heap GC 压力大、内存泄漏 有四种视角:alloc_objects(分配次数)、alloc_space(分配字节数)、inuse_space(当前存活字节)、inuse_objects(当前存活对象数) Goroutine /debug/pprof/goroutine Goroutine 泄漏、阻塞堆积 对所有 Goroutine 的调用栈进行快照;查找大量 Goroutine 堆积在同一调用点的情况 Mutex /debug/pprof/mutex 锁竞争激烈 记录 Goroutine 等待获取锁的累计时间;默认关闭,需 runtime.SetMutexProfileFraction() 开启 Block /debug/pprof/block Channel/Mutex/Select 阻塞 记录 Goroutine 在同步原语上的累计阻塞时间;默认关闭,需 runtime.SetBlockProfileRate() 开启 Threadcreate /debug/pprof/threadcreate OS 线程过度创建 显示创建新 OS 线程的调用栈,通常由 cgo 或阻塞系统调用导致 🛠️ 三种采集方式:按“场景”选择入口 💻 代码植入式(runtime/pprof):适用于独立程序或精确控制 在代码中手动启动和停止,适合命令行工具、离线分析或需要精确控制采集时机的场景。 ...