{T}

高性能架构 学习笔记(第 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.85MB

6.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 加速
├── 微服务拆分
└── 消息队列
 
基础设施优化
├── 服务器配置
├── 网络优化
├── 容器化部署
└── 自动扩缩容