性能分析(pprof)
大约 2 分钟componentgoroutineheappprofblock
概述
pprof 是 Go 语言生态中功能强大的性能分析工具,能够有效诊断 CPU、内存、协程等各类性能问题。sponge 框架深度集成了 pprof 能力,提供多种灵活的 profile 采集方式,特别适合生产环境的问题排查。
HTTP API 采集方案
sponge 创建的 Web 服务和 gRPC 服务均支持 HTTP 接口的性能分析,默认是关闭的,可以通过配置文件 configs/*.yaml
开启。
app:
enableHTTPProfile: true # 开启 HTTP 接口性能分析,默认路由为 /debug/pprof
典型应用场景:
- 开发/测试环境实时分析
- 压测期间的性能监控
注意事项:
- 线上环境启用会产生约 1% 的性能开销
- 除标准 pprof 功能外,还扩展了 IO 分析能力(访问
/debug/pprof/profile-io
)
默认访问地址:
配合 go tool pprof
可进行即时分析:
# 内存分析示例
go tool pprof http://localhost:8080/debug/pprof/heap
信号触发采集方案
sponge 创建的服务默认支持通过系统信号触发 profile 采集,该功能默认启用,无需额外配置。
技术实现亮点:
- 默认采用 SIGTRAP(5) 信号
- 启停机制:首次信号启动采集,二次信号提前终止
- 默认 60 秒自动停止的防呆设计
操作指南:
# 查找进程ID
pgrep -f "服务名称" # 推荐方式
ps aux | grep "服务名称"
# 触发采集
kill -SIGTRAP $PID
输出文件规范:日期时间_进程ID_用户ID_采集类型.out
/tmp/服务名称_profile/
├── 20240726154302_1234_user_cpu.out
├── 20240726154302_1234_user_heap.out
├── 20240726154302_1234_user_goroutine.out
├── 20240726154302_1234_user_block.out
├── 20240726154302_1234_user_mutex.out
└──20240726154302_1234_user_threadcreate.out
高级配置:
// 启用 trace 采集(注意存储开销)
prof.EnableTrace()
分析方法:
# 火焰图分析
go tool pprof -http=:8080 /tmp/service_profile/20240726154302_1234_user_cpu.out
智能自适应采集方案
sponge 创建的服务支持通过系统资源监控自动触发 profile 采集,该功能默认开启。
app:
enableStat: true # whether to turn on printing statistics, true:enable, false:disable
sponge 创新性地将信号采集与资源监控相结合,实现智能化的 profile 采集。
触发机制:
指标类型 | 采样策略 | 触发采集 profile 条件 |
---|---|---|
CPU | 默认1次/分钟 | 最近3次平均值>80% |
内存 | 默认1次/分钟 | 最近3次平均值>80% |
采集的 profile 文件输出规范与信号触发采集方案
一样。
技术优势:
- 自动关联监控与 profile 采集
- 具备夜间问题诊断能力
典型工作流:
资源监控 → 阈值突破 → 触发信号 → 自动采集 → 保存到本地 → 分析
建议配合日志系统记录触发事件,便于后期关联分析。
注
该功能不支持 Windows 系统。