Node.js 性能分析工具(Clinic.js)
Clinic.js 是 Node.js 性能诊断的利器,帮助定位各类性能瓶颈。
安装
Bash
npm install -g clinic
Clinic Doctor
功能
检测 I/O 延迟和事件循环阻塞问题。
使用
Bash
# 运行诊断
clinic doctor -- node app.js
# 指定端口压测
clinic doctor --on-port 'autocannon -c 10 -d 30 localhost:3000' -- node app.js
输出分析
Doctor 会生成 HTML 报告,显示:
| 指标 | 说明 | 正常范围 |
|---|---|---|
| Event Loop Delay | 事件循环延迟 | < 100ms |
| CPU Usage | CPU 使用率 | < 70% |
| Memory | 内存使用 | 稳定不增长 |
| Active Handles | 活跃句柄 | 无泄漏趋势 |
常见问题诊断
JavaScript
// 问题代码:同步操作阻塞事件循环
app.get('/compute', (req, res) => {
// 同步计算阻塞事件循环
const result = heavyComputation();
res.json(result);
});
// Doctor 会检测到事件循环延迟飙升
Clinic Bubbleprof
功能
分析异步操作瓶颈,可视化异步调用链。
使用
Bash
clinic bubbleprof -- node app.js
# 配合压测
clinic bubbleprof --on-port 'autocannon -c 10 -d 30 localhost:3000' -- node app.js
输出分析
Bubbleprof 生成气泡图:
- 每个气泡代表异步操作
- 气泡大小 = 执行时间
- 气泡颜色 = 操作类型(I/O、定时器、Promise 等)
- 连接线 = 调用关系
常见问题定位
JavaScript
// 异步瓶颈示例
async function processRequest() {
await readFromDB(); // 可能的瓶颈
await callExternalAPI(); // 可能的瓶颈
await writeToCache(); // 可能的瓶颈
}
// Bubbleprof 清晰展示每个操作的耗时
Clinic Flame
功能
生成火焰图,定位 CPU 热点函数。
使用
Bash
clinic flame -- node app.js
# 配合压测
clinic flame --on-port 'autocannon -c 10 -d 30 localhost:3000' -- node app.js
输出分析
火焰图解读:
| 元素 | 含义 |
|---|---|
| 横轴 | 采样数量 |
| 纵轴 | 调用栈深度 |
| 宽度 | 函数执行占比 |
| 颜色 | 不同函数(随机分配) |
定位热点
JavaScript
// CPU 热点示例
function processData(data) {
// 这个函数在火焰图中会很宽
for (let i = 0; i < data.length; i++) {
for (let j = 0; j < data[i].items.length; j++) {
// 复杂计算
}
}
}
// 火焰图会显示 processData 占用大量 CPU
完整诊断流程
Bash
# 1. 先用 Doctor 检测整体问题
clinic doctor --on-port 'autocannon -c 10 -d 30 localhost:3000' -- node app.js
# 2. 发现 I/O 问题,用 Bubbleprof 深入
clinic bubbleprof --on-port 'autocannon -c 10 -d 30 localhost:3000' -- node app.js
# 3. 发现 CPU 问题,用 Flame 定位
clinic flame --on-port 'autocannon -c 10 -d 30 localhost:3000' -- node app.js
配合 Autocannon 压测
安装
Bash
npm install -g autocannon
使用
Bash
# 基本压测
autocannon -c 100 -d 30 localhost:3000
# 参数说明
# -c: 并发连接数
# -d: 持续时间(秒)
# -p: 管道请求数
# -m: 请求方法
输出报告
所有工具生成 .clinic 目录下的 HTML 报告:
Bash
.clinic/
├── doctor.html
├── bubbleprof.html
└── flame.html
# 自动打开浏览器查看
其他诊断命令
Bash
# 清理历史数据
clinic clean
# 查看版本
clinic --version
# 帮助
clinic --help
clinic doctor --help
注意事项
- 生产环境谨慎使用,有一定性能开销
- 压测时模拟真实流量模式
- Doctor 检测到问题后用 Bubbleprof/Flame 深入分析
- 报告可能较大,注意磁盘空间
要点总结
- Doctor:检测事件循环延迟和 I/O 问题
- Bubbleprof:分析异步操作瓶颈
- Flame:定位 CPU 热点函数
- 配合
autocannon进行压力测试 - 诊断流程:Doctor → Bubbleprof/Flame
📝 发现内容有误?点击此处直接编辑