227 lines
5.6 KiB
Markdown
227 lines
5.6 KiB
Markdown
# 生产环境使用 pprof 性能分析
|
||
|
||
## 概述
|
||
|
||
pprof 是 Go 语言内置的性能分析工具,可以帮助你诊断生产环境中的性能问题。本指南介绍如何在生产环境中安全地使用 pprof。
|
||
|
||
## 安全配置
|
||
|
||
### 1. 启用 pprof
|
||
|
||
在 `.env` 文件中添加以下配置:
|
||
|
||
```env
|
||
# 启用 pprof(生产环境需要显式设置)
|
||
PPROF_ENABLED=true
|
||
|
||
# IP 白名单(推荐使用)
|
||
# 支持单个 IP 和 CIDR 格式,多个 IP 用逗号分隔
|
||
PPROF_ALLOWED_IPS=127.0.0.1,192.168.1.100,10.0.0.0/8
|
||
|
||
# 访问 token(可选,但强烈推荐)
|
||
# 如果设置,需要在请求头或查询参数中提供
|
||
PPROF_TOKEN=your-secret-token-here
|
||
```
|
||
|
||
### 2. 安全建议
|
||
|
||
**强烈推荐同时使用 IP 白名单和 token:**
|
||
- IP 白名单:限制只有特定 IP 可以访问
|
||
- Token 认证:即使 IP 泄露,也需要 token 才能访问
|
||
|
||
**不推荐在生产环境不设置任何限制:**
|
||
- 如果 `PPROF_ALLOWED_IPS` 为空且 `PPROF_TOKEN` 为空,任何人都可以访问性能数据
|
||
|
||
## 使用方法
|
||
|
||
### 方法一:使用 go tool pprof(推荐)
|
||
|
||
即使生产服务器没有 Go 环境,你也可以在本地机器上使用 `go tool pprof` 连接到远程服务器。
|
||
|
||
#### 1. 安装 Go 工具链
|
||
|
||
在你的本地机器上安装 Go(如果还没有安装):
|
||
- 下载地址:https://golang.org/dl/
|
||
- 或者使用包管理器:`brew install go` (macOS) / `apt-get install golang-go` (Linux)
|
||
|
||
#### 2. 连接到远程服务器
|
||
|
||
```bash
|
||
# CPU 性能分析(30秒采样)
|
||
go tool pprof http://your-server:3008/debug/pprof/profile?token=your-secret-token-here
|
||
|
||
# 堆内存分析
|
||
go tool pprof http://your-server:3008/debug/pprof/heap?token=your-secret-token-here
|
||
|
||
# 协程分析
|
||
go tool pprof http://your-server:3008/debug/pprof/goroutine?token=your-secret-token-here
|
||
|
||
# 线程创建分析
|
||
go tool pprof http://your-server:3008/debug/pprof/threadcreate?token=your-secret-token-here
|
||
```
|
||
|
||
#### 3. 使用请求头传递 token
|
||
|
||
```bash
|
||
# 使用 curl 设置请求头
|
||
curl -H "X-Pprof-Token: your-secret-token-here" \
|
||
http://your-server:3008/debug/pprof/heap > heap.prof
|
||
|
||
# 然后使用 go tool pprof 分析
|
||
go tool pprof heap.prof
|
||
```
|
||
|
||
### 方法二:导出数据文件
|
||
|
||
如果无法直接连接,可以先导出数据文件,然后在有 Go 环境的机器上分析。
|
||
|
||
#### 1. 导出 pprof 数据
|
||
|
||
```bash
|
||
# 使用 curl 导出数据(需要 token)
|
||
curl -H "X-Pprof-Token: your-secret-token-here" \
|
||
http://your-server:3008/debug/pprof/heap > heap.prof
|
||
|
||
curl -H "X-Pprof-Token: your-secret-token-here" \
|
||
http://your-server:3008/debug/pprof/profile?seconds=30 > cpu.prof
|
||
```
|
||
|
||
#### 2. 传输到本地机器
|
||
|
||
```bash
|
||
# 使用 scp 传输文件
|
||
scp user@your-server:/path/to/heap.prof ./
|
||
```
|
||
|
||
#### 3. 在本地分析
|
||
|
||
```bash
|
||
# 分析堆内存
|
||
go tool pprof heap.prof
|
||
|
||
# 分析 CPU
|
||
go tool pprof cpu.prof
|
||
```
|
||
|
||
### 方法三:使用 Web 界面
|
||
|
||
直接在浏览器中访问(需要 token):
|
||
|
||
```
|
||
http://your-server:3008/debug/pprof/?token=your-secret-token-here
|
||
```
|
||
|
||
或者使用请求头:
|
||
|
||
```bash
|
||
# 使用 curl 访问主页
|
||
curl -H "X-Pprof-Token: your-secret-token-here" \
|
||
http://your-server:3008/debug/pprof/
|
||
```
|
||
|
||
## 常用分析命令
|
||
|
||
### CPU 性能分析
|
||
|
||
```bash
|
||
# 30秒 CPU 采样
|
||
go tool pprof http://your-server:3008/debug/pprof/profile?token=your-token
|
||
|
||
# 交互式命令
|
||
(pprof) top10 # 查看占用 CPU 最多的 10 个函数
|
||
(pprof) list 函数名 # 查看函数详细代码
|
||
(pprof) web # 生成 SVG 图表(需要安装 graphviz)
|
||
(pprof) png # 生成 PNG 图表
|
||
```
|
||
|
||
### 内存分析
|
||
|
||
```bash
|
||
# 堆内存分析
|
||
go tool pprof http://your-server:3008/debug/pprof/heap?token=your-token
|
||
|
||
# 交互式命令
|
||
(pprof) top10 # 查看占用内存最多的 10 个函数
|
||
(pprof) alloc_space # 查看累计分配的内存
|
||
(pprof) inuse_space # 查看当前使用的内存
|
||
```
|
||
|
||
### 协程分析
|
||
|
||
```bash
|
||
# 协程分析(排查 goroutine 泄漏)
|
||
go tool pprof http://your-server:3008/debug/pprof/goroutine?token=your-token
|
||
|
||
# 交互式命令
|
||
(pprof) top10 # 查看协程数量最多的 10 个函数
|
||
```
|
||
|
||
## 常见问题排查
|
||
|
||
### 1. CPU 使用率过高
|
||
|
||
```bash
|
||
# 分析 CPU profile
|
||
go tool pprof http://your-server:3008/debug/pprof/profile?token=your-token
|
||
|
||
# 查看 top 函数
|
||
(pprof) top20
|
||
```
|
||
|
||
### 2. 内存泄漏
|
||
|
||
```bash
|
||
# 分析堆内存
|
||
go tool pprof http://your-server:3008/debug/pprof/heap?token=your-token
|
||
|
||
# 查看内存分配
|
||
(pprof) top20 -cum
|
||
```
|
||
|
||
### 3. 协程泄漏
|
||
|
||
```bash
|
||
# 分析协程
|
||
go tool pprof http://your-server:3008/debug/pprof/goroutine?token=your-token
|
||
|
||
# 查看协程堆栈
|
||
(pprof) top20
|
||
```
|
||
|
||
### 4. 阻塞问题
|
||
|
||
```bash
|
||
# 分析阻塞
|
||
go tool pprof http://your-server:3008/debug/pprof/block?token=your-token
|
||
```
|
||
|
||
## 注意事项
|
||
|
||
1. **性能影响**:pprof 采样会对性能产生一定影响,建议在排查问题时临时启用
|
||
2. **数据安全**:pprof 数据可能包含敏感信息,务必使用 IP 白名单和 token 保护
|
||
3. **网络访问**:确保防火墙规则允许访问 pprof 端口
|
||
4. **定期清理**:排查完成后,建议关闭 pprof 或加强安全限制
|
||
|
||
## 故障排查
|
||
|
||
### 404 错误
|
||
|
||
- 检查 `PPROF_ENABLED=true` 是否设置
|
||
- 检查应用是否重启以加载新配置
|
||
|
||
### 403 错误(IP 不允许)
|
||
|
||
- 检查 `PPROF_ALLOWED_IPS` 是否包含你的 IP
|
||
- 如果使用代理,检查真实 IP 获取是否正确
|
||
|
||
### 401 错误(Token 无效)
|
||
|
||
- 检查 `PPROF_TOKEN` 是否设置
|
||
- 检查请求头或查询参数中的 token 是否正确
|
||
|
||
## 参考资源
|
||
|
||
- [Go pprof 官方文档](https://pkg.go.dev/net/http/pprof)
|
||
- [Go 性能分析指南](https://github.com/golang/go/wiki/Performance)
|
||
|