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 性能指标关系与测试视角
延迟与吞吐量之间存在典型的权衡关系。当系统负载增加时,延迟通常会上升,而吞吐量在达到饱和点后不再增长。下图展示了这一关系以及基准测试的关注区域。
2.3 测试环境搭建原则
环境一致性是基准测试可信度的基石。Policy as Code 测试环境搭建需遵循以下原则:
- 隔离性:测试环境与生产、开发环境物理或逻辑隔离,避免外部流量干扰。
- 可复现性:使用基础设施即代码(IaC)工具(如 Terraform、Ansible)定义环境,确保每次搭建结果一致。
- 硬件确定性:记录 CPU 型号、核心数、内存大小、磁盘类型(SSD/HDD)、网络带宽等硬件参数。
- 软件版本锁定:策略引擎版本、运行时(如 OPA、Kyverno、Rego 解释器)、操作系统内核版本均需固定。
- 最小化干扰:关闭不必要的系统服务、定时任务、监控代理,减少背景噪声。
常见陷阱:在笔记本电脑上运行基准测试,然后与生产环境数据对比。笔记本的 CPU 降频、散热限制、共享网络都会导致结果失真。始终使用专用测试机或云上同规格实例。
2.4 测试环境拓扑结构
典型的 Policy as Code 基准测试环境包含三个主要组件:负载生成器、策略引擎实例、数据存储。下图展示了它们之间的交互关系。
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、内存、延迟数据
- ✅ 测试脚本可重复执行,结果可复现