1. 压测基础:性能测试概念、压测目标定义、关键性能指标与压测环境搭建

1.1 性能测试核心概念

性能测试(Performance Testing)是通过自动化工具模拟多用户并发访问,测量系统在特定负载下的响应速度、吞吐量和资源消耗,从而评估系统是否满足预设性能目标的过程。在授权服务和 Kubernetes 资源限制场景中,性能测试能提前暴露瓶颈,避免生产事故。

核心认知: 性能测试不是“压垮系统”,而是“在可控条件下发现系统性能拐点”。授权测试关注认证/授权链路的延迟与吞吐,Kubernetes 调优关注容器 CPU/内存限制对应用性能的影响。

1.2 压测目标定义

明确的压测目标是有效测试的前提。目标应遵循 SMART 原则:具体、可衡量、可达成、相关、有时限。常见压测目标分类如下:

目标类型 示例描述 适用场景
容量目标 系统在 1000 并发用户下,QPS ≥ 5000 授权服务峰值流量评估
延迟目标 P99 响应时间 ≤ 200ms API 网关、认证接口
资源目标 CPU 使用率 ≤ 70%,内存 ≤ 80% Kubernetes Pod 资源限制验证
稳定性目标 持续压测 30 分钟,无错误率上升趋势 长稳测试、内存泄漏检测

1.3 关键性能指标详解

压测中必须关注的四大核心指标:QPS、TPS、RT、P99。理解它们的定义与关系是分析压测结果的基础。

  • QPS(Queries Per Second):每秒查询数,衡量系统处理查询请求的能力。适用于读多写少的场景,如授权策略查询。
  • TPS(Transactions Per Second):每秒事务数,衡量系统完成完整业务事务的能力。一个事务可能包含多个请求,如登录授权流程(认证 + Token 签发 + 权限校验)。
  • RT(Response Time):响应时间,从发送请求到收到完整响应所经过的时间。通常关注平均 RT 和百分位 RT。
  • P99(99th Percentile):99% 的请求响应时间低于该值。P99 能有效反映系统在极端情况下的延迟表现,比平均值更敏感。
指标关系速记: QPS/TPS 越高越好,RT/P99 越低越好。在授权测试中,P99 比平均 RT 更能暴露偶发慢请求;在 Kubernetes 资源限制调优中,QPS 拐点往往对应 CPU Throttling 开始点。
关键性能指标关系图 关键性能指标关系图 QPS 每秒查询数 TPS 每秒事务数 RT 响应时间 P99 99% 分位延迟 指标关联说明: • QPS/TPS 反映系统吞吐能力,是容量规划的核心依据。 • RT 反映单次请求速度,P99 反映尾部延迟,两者共同决定用户体验。 • 在授权测试中,QPS 与 P99 通常呈反比:负载升高 → P99 上升 → 系统接近瓶颈。 • Kubernetes 资源限制过小时,CPU Throttling 会导致 RT 抖动,P99 急剧恶化。

1.4 压测环境搭建

一个标准化的压测环境是结果可信的保障。环境搭建包含以下关键步骤:

  1. 环境隔离:压测环境应与生产、开发环境物理或逻辑隔离,避免数据污染和相互影响。
  2. 硬件与资源规格:记录被测服务的 CPU 核数、内存大小、磁盘类型(SSD/HDD)、网络带宽。在 Kubernetes 中,明确 Pod 的 requests 和 limits 配置。
  3. 压测工具部署:推荐使用 wrk(轻量 HTTP 压测)、k6(脚本化、支持 Kubernetes)、Locust(Python 生态)。工具节点应独立部署,避免与被测服务争抢资源。
  4. 监控系统集成:部署 Prometheus + Grafana 采集 CPU、内存、网络、GC 等指标。授权服务需额外监控 JWT 签发耗时、Redis/DB 连接池状态。
  5. 基线数据采集:在无负载时记录系统空闲指标,作为后续对比的基准。
常见陷阱: 压测工具所在节点与被测服务共享同一台宿主机,会导致“资源争抢”使压测结果失真。在 Kubernetes 环境中,务必使用 nodeSelector 或 taints 将压测工具调度到独立节点。
压测环境架构图 压测环境架构图 压测工具节点 wrk / k6 / Locust 独立宿主机 / 独立 Node HTTP 请求 被测服务 (Pod) 授权服务 / API 网关 CPU: 2 core, Mem: 4Gi limits: 2 core / 4Gi 依赖调用 依赖服务 Redis / MySQL / OPA 独立部署或同集群 监控系统 Prometheus + Grafana | 指标:CPU / Mem / RT / QPS / GC 指标采集

1.5 压测脚本示例(k6)

以下是一个简单的 k6 压测脚本,用于对授权服务的 /auth/validate 接口进行负载测试:

import http from 'k6/http';
import { check, sleep } from 'k6';

export const options = {
  stages: [
    { duration: '30s', target: 50 },   // 逐步增加到 50 并发
    { duration: '1m', target: 50 },    // 保持 50 并发 1 分钟
    { duration: '30s', target: 0 },    // 逐步降为 0
  ],
  thresholds: {
    http_req_duration: ['p(99)<200'], // P99 必须小于 200ms
    http_req_failed: ['rate<0.01'],   // 错误率小于 1%
  },
};

export default function () {
  const payload = JSON.stringify({
    token: 'Bearer eyJhbGciOiJSUzI1NiIs...',
    resource: 'api/v1/orders',
    action: 'read',
  });

  const params = {
    headers: { 'Content-Type': 'application/json' },
  };

  const res = http.post('http://auth-service:8080/auth/validate', payload, params);

  check(res, {
    'status is 200': (r) => r.status === 200,
    'response time < 500ms': (r) => r.timings.duration < 500,
  });

  sleep(1);
}
关键配置说明: stages 用于模拟真实流量渐变,避免瞬间高并发导致服务雪崩;thresholds 在测试结束后自动判定是否达标,适合 CI/CD 集成。

1.6 压测执行与数据记录规范

每次压测执行后,必须记录以下信息,确保结果可复现:

记录项 说明 示例
测试编号 唯一标识一次压测 PERF-2025-001
环境快照 Kubernetes 版本、Pod 资源规格、镜像版本 K8s v1.28, Pod: 2c4g, image: auth:v2.1
压测参数 并发数、持续时间、请求体大小 50 并发, 2min, 512B payload
结果摘要 QPS、P99、错误率、CPU/Mem 峰值 QPS: 3200, P99: 185ms, Err: 0.2%
结论 是否达标,瓶颈点描述 达标;CPU 接近 75%,建议扩容
最佳实践: 使用版本控制工具(如 Git)管理压测脚本和结果记录,每次压测提交一个 commit,方便回溯对比。在 Kubernetes 环境中,建议同时记录 kubectl top pod 和 kubectl describe pod 的输出。