钉钉 AI 客服:性能压测实战
压测是上线前的必要步骤。
一、压测工具
| 工具 | 特点 |
|---|---|
| k6 | 脚本化、云原生 |
| JMeter | GUI、功能全 |
| Locust | Python、易扩展 |
| wrk | 轻量、高性能 |
二、k6 脚本
2.1 基础脚本
import http from 'k6/http';
import { check, sleep } from 'k6';
export const options = {
stages: [
{ duration: '1m', target: 100 }, // 1 分钟升到 100 并发
{ duration: '3m', target: 100 }, // 持续 3 分钟
{ duration: '1m', target: 0 }, // 1 分钟降到 0
],
};
export default function() {
const res = http.post('http://localhost:3000/api/chat',
JSON.stringify({ message: '你好' }),
{ headers: { 'Content-Type': 'application/json' } }
);
check(res, {
'status is 200': (r) => r.status === 200,
'response time < 1s': (r) => r.timings.duration < 1000,
});
sleep(1);
}
2.2 运行压测
k6 run script.js
三、压测场景
3.1 正常负载
// 100 并发,持续 5 分钟
export const options = {
vus: 100,
duration: '5m',
};
3.2 峰值负载
// 模拟峰值
export const options = {
stages: [
{ duration: '30s', target: 500 },
{ duration: '1m', target: 500 },
{ duration: '30s', target: 0 },
],
};
3.3 长时间稳定性
// 1 小时稳定性测试
export const options = {
vus: 50,
duration: '1h',
};
四、压测指标
| 指标 | 目标 |
|---|---|
| 响应时间 P50 | < 500ms |
| 响应时间 P99 | < 2s |
| 错误率 | < 1% |
| QPS | > 1000 |
五、结果分析
# k6 输出示例
checks.........................: 100% 5000/5000
data_received..................: 1.5 MB
data_sent......................: 500 kB
http_req_duration..............: avg=500ms min=100ms med=400ms max=2s p(90)=800ms p(95)=1s
http_req_failed................: 0.00%
http_reqs......................: 5000
iteration_duration.............: avg=1.5s
iterations.....................: 5000
vus............................: 100
六、瓶颈分析
6.1 CPU 瓶颈
top -p $(pgrep node)
6.2 内存瓶颈
free -h
6.3 数据库瓶颈
SHOW PROCESSLIST;
七、优化建议
- 增加缓存
- 数据库索引优化
- 连接池配置
- 水平扩展
项目地址:GitHub - dingtalk-connector-pro 有问题欢迎 Issue 或评论区交流