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 开始点。
1.4 压测环境搭建
一个标准化的压测环境是结果可信的保障。环境搭建包含以下关键步骤:
- 环境隔离:压测环境应与生产、开发环境物理或逻辑隔离,避免数据污染和相互影响。
- 硬件与资源规格:记录被测服务的 CPU 核数、内存大小、磁盘类型(SSD/HDD)、网络带宽。在 Kubernetes 中,明确 Pod 的
requests和limits配置。 - 压测工具部署:推荐使用 wrk(轻量 HTTP 压测)、k6(脚本化、支持 Kubernetes)、Locust(Python 生态)。工具节点应独立部署,避免与被测服务争抢资源。
- 监控系统集成:部署 Prometheus + Grafana 采集 CPU、内存、网络、GC 等指标。授权服务需额外监控 JWT 签发耗时、Redis/DB 连接池状态。
- 基线数据采集:在无负载时记录系统空闲指标,作为后续对比的基准。
常见陷阱: 压测工具所在节点与被测服务共享同一台宿主机,会导致“资源争抢”使压测结果失真。在 Kubernetes 环境中,务必使用
nodeSelector 或 taints 将压测工具调度到独立节点。
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 的输出。