2. 性能基准测试基础:定义性能指标、测试环境搭建原则与测试数据准备

性能基准测试是 Policy as Code 延迟优化的起点。没有可复现、可对比的基准,任何优化都只是猜测。本节将定义核心性能指标,确立环境搭建原则,并规范测试数据的准备流程。

2.1 核心性能指标定义

在 Policy as Code 场景中,我们关注三个核心指标:延迟、吞吐量和QPS。它们从不同维度刻画策略引擎的性能表现。

指标 定义 Policy as Code 中的典型含义 单位
延迟 从请求发出到收到完整响应所经过的时间 一次策略评估请求从入队到返回决策结果的耗时 ms(毫秒)
吞吐量 单位时间内系统成功处理的请求数量 策略引擎每秒能够完成的策略评估次数 req/s(请求/秒)
QPS 每秒查询率,与吞吐量同义但更强调查询类负载 策略引擎每秒处理的策略查询请求数 qps
关键区分:延迟关注单次请求的速度,吞吐量关注系统整体的处理能力。在 Policy as Code 中,延迟通常受策略规则复杂度、数据加载量影响;吞吐量则受并发模型、资源分配和引擎内部优化影响。

除了上述三个核心指标,在基准测试中还应关注以下衍生指标:

  • P99 延迟:99% 的请求延迟低于该值,用于衡量尾部延迟。
  • 错误率:因策略引擎内部错误或超时导致的失败请求占比。
  • 资源利用率:CPU、内存、网络 I/O 在测试过程中的消耗情况。

2.2 性能指标关系与测试视角

延迟与吞吐量之间存在典型的权衡关系。当系统负载增加时,延迟通常会上升,而吞吐量在达到饱和点后不再增长。下图展示了这一关系以及基准测试的关注区域。

延迟与吞吐量关系及基准测试关注区域 吞吐量 (req/s) 延迟 (ms) 延迟曲线 饱和点 基准测试关注区域 线性区:延迟稳定,吞吐量增长 ▲ 基准测试应在线性区进行,避免进入饱和区导致延迟剧烈抖动

2.3 测试环境搭建原则

环境一致性是基准测试可信度的基石。Policy as Code 测试环境搭建需遵循以下原则:

  1. 隔离性:测试环境与生产、开发环境物理或逻辑隔离,避免外部流量干扰。
  2. 可复现性:使用基础设施即代码(IaC)工具(如 Terraform、Ansible)定义环境,确保每次搭建结果一致。
  3. 硬件确定性:记录 CPU 型号、核心数、内存大小、磁盘类型(SSD/HDD)、网络带宽等硬件参数。
  4. 软件版本锁定:策略引擎版本、运行时(如 OPA、Kyverno、Rego 解释器)、操作系统内核版本均需固定。
  5. 最小化干扰:关闭不必要的系统服务、定时任务、监控代理,减少背景噪声。
常见陷阱:在笔记本电脑上运行基准测试,然后与生产环境数据对比。笔记本的 CPU 降频、散热限制、共享网络都会导致结果失真。始终使用专用测试机或云上同规格实例。

2.4 测试环境拓扑结构

典型的 Policy as Code 基准测试环境包含三个主要组件:负载生成器、策略引擎实例、数据存储。下图展示了它们之间的交互关系。

Policy as Code 基准测试环境拓扑 负载生成器 k6 / wrk / hey 策略引擎 OPA / Kyverno 数据存储 Redis / 本地文件 策略请求 数据查询 策略数据 决策结果 监控 & 采集 Prometheus / cAdvisor

2.5 测试数据准备

测试数据直接影响基准测试的有效性。Policy as Code 的测试数据分为三类:

数据类型 内容 准备方法 注意事项
策略规则 Rego / CEL 策略文件 从生产环境抽取典型策略,按复杂度分级 包含简单、中等、复杂三种规则集
输入数据 Kubernetes 资源对象、JSON 请求体 使用生产流量录制或合成生成 数据大小、嵌套深度需覆盖真实场景
外部数据 策略引用的外部数据(如 RBAC 配置、命名空间列表) 模拟数据存储中的缓存内容 数据量级需与生产环境一致
数据准备最佳实践:
  • 使用 opa bench 内置的测试数据生成能力,或编写自定义脚本生成不同规模的数据集。
  • 为每个测试场景准备至少 3 组不同规模的数据(小:100 条规则;中:1000 条规则;大:10000 条规则)。
  • 数据文件使用 JSON 格式,确保与策略引擎的输入接口一致。

2.6 测试数据规模示例

以下是一个典型的测试数据准备脚本片段,用于生成不同规模的策略输入数据:

#!/bin/bash
# 生成不同规模的测试数据
# 用法: ./gen_test_data.sh <规模> <输出文件>

SCALE=${1:-100}
OUTPUT=${2:-test_data.json}

echo '{
  "kind": "Pod",
  "apiVersion": "v1",
  "metadata": {
    "name": "test-pod",
    "namespace": "default",
    "labels": {
      "app": "benchmark",
      "tier": "backend"
    }
  },
  "spec": {
    "containers": [' > $OUTPUT

for i in $(seq 1 $SCALE); do
  if [ $i -eq $SCALE ]; then
    echo "      { \"name\": \"container-$i\", \"image\": \"nginx:$i\", \"resources\": { \"limits\": { \"cpu\": \"500m\", \"memory\": \"256Mi\" } } }" >> $OUTPUT
  else
    echo "      { \"name\": \"container-$i\", \"image\": \"nginx:$i\", \"resources\": { \"limits\": { \"cpu\": \"500m\", \"memory\": \"256Mi\" } } }," >> $OUTPUT
  fi
done

echo '    ]
  }
}' >> $OUTPUT

echo "Generated $OUTPUT with $SCALE containers"
提示:测试数据应包含边界情况,例如空容器列表、超大标签、嵌套深度超过 10 层的 JSON 结构。这些边界情况往往能暴露策略引擎的性能瓶颈。

2.7 基准测试流程清单

在开始正式测试前,请对照以下清单确认准备工作完成:

  • ✅ 环境已隔离,无其他负载干扰
  • ✅ 硬件参数已记录(CPU 型号、核心数、内存、磁盘类型)
  • ✅ 策略引擎版本已锁定,并记录在测试报告中
  • ✅ 测试数据已按规模分级(小/中/大)
  • ✅ 负载生成工具已配置,预热请求已执行
  • ✅ 监控采集已启动,确保能捕获 CPU、内存、延迟数据
  • ✅ 测试脚本可重复执行,结果可复现