高性能架构 学习笔记(第 5 部分)
6.1 性能测试工具
6.1.1 Apache JMeter
特点:
- 图形化界面
- 支持多种协议
- 可扩展性强
测试流程:
plaintext
JMeter 性能测试步骤:
1. 创建测试计划
└── 添加线程组(模拟并发用户)
2. 配置采样器
└── HTTP 请求、数据库查询等
3. 添加监听器
└── 查看结果、生成报告
4. 执行测试
└── 收集性能数据
5. 分析结果
└── 生成性能报告6.1.2 Apache Bench (ab)
简单压力测试:
bash
# 测试 100 个并发用户,总共发送 10000 个请求
ab -n 10000 -c 100 http://localhost:3000/api/users
# 参数说明:
# -n: 总请求数
# -c: 并发数输出示例:
plaintext
Server Software: Express
Server Hostname: localhost
Server Port: 3000
Document Path: /api/users
Document Length: 1234 bytes
Concurrency Level: 100
Time taken for tests: 10.234 seconds
Complete requests: 10000
Failed requests: 0
Requests per second: 977.12 [#/sec] (mean) ← QPS
Time per request: 102.340 [ms] (mean) ← 平均响应时间6.1.3 wrk
高效 HTTP 基准测试工具:
bash
# 测试 12 个线程,400 个连接,持续 30 秒
wrk -t12 -c400 -d30s http://localhost:3000/api/users
# 输出示例:
Running 30s test @ http://localhost:3000/api/users
12 threads and 400 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 102.34ms 45.23ms 1.23s 89.12%
Req/Sec 324.56 89.12 1.23k 76.34%
116789 requests in 30.03s, 145.67MB read
Requests/sec: 3888.45 ← QPS
Transfer/sec: 4.85MB6.2 性能测试策略
javascript
// 性能测试策略矩阵
const testStrategies = {
// 1. 负载测试
loadTest: {
purpose: '测试系统在预期负载下的性能',
steps: [
'逐步增加并发用户',
'观察系统响应',
'找到系统瓶颈'
],
metrics: ['QPS', '响应时间', '资源使用率']
},
// 2. 压力测试
stressTest: {
purpose: '测试系统在极限负载下的表现',
steps: [
'持续增加负载直到系统崩溃',
'找到系统的极限点',
'测试系统的恢复能力'
],
metrics: ['最大 QPS', '崩溃点', '恢复时间']
},
// 3. 并发测试
concurrencyTest: {
purpose: '测试系统同时处理多个请求的能力',
steps: [
'模拟大量并发用户',
'测试数据一致性',
'检测死锁和竞态条件'
],
metrics: ['并发数', '成功率', '错误率']
},
// 4. 耐久性测试
enduranceTest: {
purpose: '测试系统长时间运行的稳定性',
steps: [
'持续运行系统数小时或数天',
'监控内存泄漏',
'观察性能衰减'
],
metrics: ['内存使用', '响应时间变化', '错误率']
}
}6.3 性能测试代码示例
javascript
// 使用 Artillery 进行性能测试
// artillery.yml
config:
target: 'http://localhost:3000'
phases:
- duration: 60 # 持续 60 秒
arrivalRate: 10 # 每秒 10 个用户
name: "Warm up"
- duration: 120 # 持续 120 秒
arrivalRate: 10
rampTo: 50 # 增加到每秒 50 个用户
name: "Ramp up load"
- duration: 300 # 持续 300 秒
arrivalRate: 50 # 保持每秒 50 个用户
name: "Sustained load"
scenarios:
- name: "User browsing products"
flow:
- get:
url: "/api/products"
- think: 2 # 停顿 2 秒
- get:
url: "/api/products/{{ $randomNumber(1, 100) }}"
- post:
url: "/api/cart/add"
json:
productId: "{{ $randomNumber(1, 100) }}"
quantity: 1
// 运行测试
// artillery run artillery.yml七、性能优化策略
7.1 优化层次架构
plaintext
性能优化层次:
应用层优化
├── 代码优化
├── 算法优化
├── 缓存策略
└── 异步处理
数据库层优化
├── 索引优化
├── 查询优化
├── 分库分表
└── 读写分离
架构层优化
├── 负载均衡
├── CDN 加速
├── 微服务拆分
└── 消息队列
基础设施优化
├── 服务器配置
├── 网络优化
├── 容器化部署
└── 自动扩缩容