4. 性能压测基础理论:容量、吞吐量、延迟、并发、QPS/TPS、资源利用率、SLA/SLO 定义

在 Kubernetes 环境进行容量规划与性能压测之前,必须建立一套统一的度量体系。本章将定义压测领域的七个核心概念,并解释它们之间的数学关系与工程约束。这些指标是后续巡检脚本编排、故障排查与容量评估的量化基础。

4.1 核心指标定义与对比

下表从定义、单位、典型场景三个维度对比七个核心指标,帮助建立清晰的认知边界:

指标 定义 常用单位 K8s 典型场景
容量 (Capacity) 系统在满足 SLO 前提下能承载的最大负载量 并发用户数、RPS、Pod 副本数 集群最大可调度 Pod 数、Node 资源上限
吞吐量 (Throughput) 单位时间内成功处理的请求/事务数 RPS (Requests Per Second)、TPS Ingress Controller 每秒转发请求数
延迟 (Latency) 从请求发出到收到完整响应的时间间隔 ms、μs Service Mesh 边车代理引入的额外延迟
并发 (Concurrency) 同一时刻系统正在处理中的请求/连接数 并发数 (Connections/Users) WebSocket 连接数、gRPC 流数量
QPS / TPS 每秒查询数 / 每秒事务数 QPS、TPS API Server 请求速率、数据库事务速率
资源利用率 已使用资源量占资源总量的百分比 % CPU 使用率、内存使用率、网络带宽占用
SLA / SLO 服务等级协议 / 服务等级目标 百分比 (如 99.9%) Pod 可用性 ≥ 99.95%、P99 延迟 ≤ 200ms
工程提示: 在 K8s 压测中,容量 通常由 资源利用率 和 延迟 共同决定。当 CPU 利用率超过 80% 或 P99 延迟超过 SLO 阈值时,即认为达到容量上限。

4.2 指标间的数学关系与压测模型

理解指标间的依赖关系是设计压测场景的前提。以下公式与模型是编排巡检脚本时的计算基础:

  • Little's Law(利特尔法则): 并发数 = 吞吐量 × 平均延迟。在 K8s 环境中,该公式用于估算维持目标吞吐量所需的 Pod 副本数。
  • 资源利用率与容量: 容量上限 = 资源总量 × 目标利用率阈值。例如,集群总 CPU 为 100 核,目标利用率阈值为 75%,则有效容量为 75 核。
  • SLO 违约点: 当 实际延迟 > SLO 延迟阈值 或 实际可用性 < SLO 可用性目标 时,触发容量告警。
# 压测脚本中常用的容量估算逻辑(伪代码)
total_cpu = sum(node_cpu_capacity)
target_utilization = 0.75
effective_capacity = total_cpu * target_utilization

# 根据单 Pod 平均 CPU 消耗计算最大副本数
pod_cpu_avg = 0.5  # 核
max_replicas = int(effective_capacity / pod_cpu_avg)
print(f"集群有效容量: {effective_capacity} 核, 最大副本数: {max_replicas}")

4.3 延迟分布与百分位指标

平均延迟(Avg Latency)具有欺骗性,在压测中必须关注延迟分布。K8s 巡检脚本通常采集以下百分位:

  • P50(中位数): 代表典型用户体验。
  • P95: 代表 5% 的慢请求,常用于排查尾部延迟。
  • P99: 代表 1% 的最慢请求,是 SLO 的常见锚点。
  • P999: 代表 0.1% 的极端延迟,通常由 GC、网络抖动或资源争抢引起。
K8s 巡检要点: 在压测期间,使用 kubectl top pod 配合 Prometheus Histogram 指标(如 http_request_duration_seconds)实时观察 P99 延迟变化。当 P99 延迟突然陡增时,优先检查 Node 资源压力与 Pod 驱逐事件。

4.4 容量、吞吐量与延迟的三角关系

下图展示了在固定资源条件下,容量、吞吐量与延迟之间的典型非线性关系。这是压测脚本编排时判断系统是否进入“过载区”的依据。

容量-吞吐量-延迟 三角关系图 吞吐量 vs 延迟 吞吐量 (RPS) 延迟 (ms) 低负载区 拐点区 过载区 容量上限 并发 vs 资源利用率 并发数 CPU 利用率 (%) 80% 阈值 线性区 非线性区 饱和区 压测目标:在“拐点区”之前找到容量上限,确保系统运行在“低负载区”或“线性区”

4.5 SLA 与 SLO 的工程定义

在 K8s 巡检与压测中,SLA 和 SLO 是判断系统是否“健康”的最终标准。两者区别如下:

维度 SLA (Service Level Agreement) SLO (Service Level Objective)
性质 合同约束,具有法律效力 内部目标,无法律约束
指标粒度 通常为可用性(如 99.9%) 可包含延迟、吞吐量、错误率等多维度
测量窗口 月度/季度 滚动窗口(如 28 天)
K8s 示例 集群整体可用性 ≥ 99.95% P99 延迟 ≤ 200ms,错误率 ≤ 0.1%
违约后果 赔偿或服务抵扣 触发告警与复盘,无赔偿
巡检脚本设计警告: 不要将 SLA 指标直接用于压测触发条件。SLA 的测量窗口过长(如月度),无法反映瞬时抖动。压测脚本应使用 SLO 作为通过/失败标准,例如:if p99_latency > 200ms then mark_scenario_failed。

4.6 压测指标在 K8s 巡检脚本中的映射

将上述理论指标映射到 K8s 巡检脚本的实际采集点,是编排自动化巡检的关键步骤:

  • 容量: 通过 kubectl describe node 获取 allocatable 资源,结合 kubectl top pod 计算剩余容量。
  • 吞吐量: 通过 Prometheus 查询 rate(http_requests_total[1m]) 或 Ingress Controller 的 nginx_ingress_controller_requests 指标。
  • 延迟: 使用 histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m])) 计算 P99 延迟。
  • 并发: 通过 kubectl get pods --field-selector=status.phase=Running | wc -l 统计运行中 Pod 数,或通过 Service Monitor 采集活跃连接数。
  • 资源利用率: 使用 kubectl top node 或 Prometheus node_cpu_seconds_total 指标。
  • SLO 合规: 在巡检脚本中定义 slo_budget 变量,计算滚动窗口内的错误预算消耗。
# 巡检脚本片段:采集并判断 SLO 合规性
#!/bin/bash
# 依赖:Prometheus API 或 kubectl

P99_THRESHOLD=200  # ms
ERROR_RATE_THRESHOLD=0.001  # 0.1%

# 采集 P99 延迟(示例使用 PromQL)
P99_LATENCY=$(curl -s 'http://prometheus:9090/api/v1/query?query=histogram_quantile(0.99, ...)' | jq -r '.data.result[0].value[1]')

# 采集错误率
ERROR_RATE=$(curl -s 'http://prometheus:9090/api/v1/query?query=sum(rate(http_requests_total{status=~"5.."}[5m]))/sum(rate(http_requests_total[5m]))' | jq -r '.data.result[0].value[1]')

# SLO 判断
if (( $(echo "$P99_LATENCY > $P99_THRESHOLD" | bc -l) )); then
  echo "SLO 违规: P99 延迟 ${P99_LATENCY}ms 超过阈值 ${P99_THRESHOLD}ms"
fi

if (( $(echo "$ERROR_RATE > $ERROR_RATE_THRESHOLD" | bc -l) )); then
  echo "SLO 违规: 错误率 ${ERROR_RATE} 超过阈值 ${ERROR_RATE_THRESHOLD}"
fi

4.7 压测场景编排的指标选择原则

在编排压测场景时,并非所有指标都需要同时监控。以下原则帮助聚焦关键度量:

  1. 面向 SLO 选指标: 每个压测场景必须绑定至少一个 SLO 指标(如 P99 延迟或错误率),作为通过/失败判据。
  2. 容量测试关注资源利用率: 容量压测时,以 CPU/内存利用率 80% 作为停止条件,而非等到延迟爆炸。
  3. 吞吐量测试关注拐点: 逐步增加并发,记录吞吐量变化曲线,找到“吞吐量不再随并发增加而线性增长”的拐点。
  4. 延迟测试关注尾部: 在低并发下先验证 P50 延迟基线,再在高并发下观察 P99 和 P999 的偏移量。
  5. 巡检脚本使用滚动窗口: 避免单点采样,使用 5 分钟或 10 分钟的滑动窗口计算指标,减少毛刺干扰。
实战建议: 在 K8s 环境中,优先使用 Prometheus + Grafana 作为指标采集与可视化平台。巡检脚本通过 PromQL 查询指标,并通过 curl 或 kubectl exec 注入压测负载,形成闭环的“压测-采集-判断”自动化流水线。