4.10.3 性能压测设计与场景构建

性能压测设计与场景构建的核心是围绕业务目标定义可验证的指标与边界,并将“流量模型、数据准备、依赖范围、风险控制”落地为可执行计划。推荐先形成压测设计稿:目标(SLA/SLO)、范围(链路/模块/组件)、基线与阈值、场景列表、数据与依赖、风险与回滚。

文章图片

一、指标与范围确定(示例)#

以“订单查询接口”为例,设定P95≤200ms、错误率<0.1%、峰值QPS=3000,并决定仅覆盖API网关→订单服务→Redis→MySQL。

SLA/SLO模板示例

- 业务接口:GET /api/orders/{id}
- 指标:P95 <= 200ms;错误率 < 0.1%
- 峰值:QPS=3000,稳定期30分钟
- 资源阈值:CPU < 75%,MEM < 70%,IOPS < 70%
- 成功标准:稳定期内无持续抖动,P99 < 350ms

二、场景构建(示例+命令)#

1)并发模型与负载曲线#

采用“线性爬坡→稳定→峰值冲刺→回落”的负载模型:

0-5min: 200 QPS
5-15min: 200 -> 1500 QPS
15-45min: 1500 QPS 稳定
45-50min: 1500 -> 3000 QPS
50-60min: 3000 QPS 峰值
60-65min: 3000 -> 500 QPS

2)请求比例与数据分布#

  • 读写比例:90%读 / 10%写
  • 热点:Top 10%订单占 70%访问
  • 缓存命中:目标 > 85%

示例:压测脚本数据准备(shadow表)

-- 影子库影子表,防止污染生产
CREATE DATABASE IF NOT EXISTS order_shadow;
CREATE TABLE order_shadow.orders LIKE production.orders;

-- 生成模拟数据(示例:插入1百万条)
INSERT INTO order_shadow.orders(id, user_id, amount, status, created_at)
SELECT 
  seq, 
  FLOOR(RAND()*100000), 
  ROUND(RAND()*5000,2),
  ELT(FLOOR(RAND()*4)+1,'NEW','PAID','SHIP','CLOSE'),
  NOW() - INTERVAL FLOOR(RAND()*365) DAY
FROM seq_1_to_1000000;

三、依赖与隔离策略(示例)#

  • 若不纳入外部依赖:使用Mock或流量回放
  • 若纳入:使用影子库、影子集群

Nginx回放流量隔离示例(影子域名)

# /etc/nginx/conf.d/shadow.conf
server {
  listen 80;
  server_name shadow.example.com;
  location / {
    proxy_pass http://shadow_backend;
  }
}

验证配置

nginx -t
systemctl reload nginx
curl -I http://shadow.example.com/api/health

四、负载工具安装与可执行示例#

以 wrk 为例(仅用于构建场景与验证负载曲线):

# 安装 wrk(Ubuntu)
sudo apt-get update
sudo apt-get install -y wrk

# 基线压测:50并发,持续60秒
wrk -t4 -c50 -d60s http://shadow.example.com/api/orders/123

# 峰值压测:400并发,持续120秒
wrk -t8 -c400 -d120s http://shadow.example.com/api/orders/123

关键参数解释
- -t:线程数
- -c:并发连接数
- -d:持续时间

五、排错与风险控制(示例)#

常见问题与快速排查:

# 1) 连接被拒绝:检查端口与进程
ss -lntp | grep 80
systemctl status nginx

# 2) 高延迟:查看CPU/IO
top -p $(pidof nginx)
iostat -xz 1 5

# 3) 错误率高:查看错误日志
tail -f /var/log/nginx/error.log

回滚策略示例

# 一键停止压测
pkill -f wrk

# 限流回退(示例:Nginx限流开启)
# /etc/nginx/conf.d/limit.conf
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=100r/s;

六、练习#

  1. 设计一个“登录接口”的压测计划,写出P95、QPS、错误率目标与负载曲线。
  2. 按照影子库方案生成10万条数据并验证访问。
  3. 用wrk进行基线与峰值压测,记录P95与错误率并对比。
  4. 人为将Redis限速,观察响应时间变化并记录结论。