pyperformance-suite-run
Use when 正式运行 pyperformance 子集或全量并生成 run.json;单 worker 调试用 pyperformance-worker-run。
Files1
View on GitHubSKILL.mdplugins/cpython-optimize-skill/skills/pyperformance-suite-run/SKILL.md
GitHubpyperformance Suite Run
负责正式 pyperformance 运行。单 benchmark 调试先用 pyperformance-worker-run。
三类测试边界
- RuntimeTests 是功能测试。
- test_cinderx/lib test 是集成测试。
- pyperformance 是性能测试;正式性能测试前必须说明功能测试和集成测试是否已通过、跳过或仍待验证。
使用场景
- L3 相关子集
- L4 full 全量性能验证
- baseline/candidate 正式对照
- 生成
run.json
规则
- 用
python -m pyperformance run。 - 运行前必须读取
../using-cpython-optimize/references/pyperformance-env-contract.md,先列出 driver env、--inherit-environ、worker env 和 baseline/candidate 差异轴。 - 使用
--affinity前必须读取../using-cpython-optimize/references/pyperformance-affinity-guidance.md,说明它是 CPU 绑核参数;先检查当前可用 CPU,再把用户真实命令中的 affinity 映射到当前环境,不要逐字照抄不可用核号。 - CinderX JIT 口径必须证明真实 worker 启用 JIT:检查 CinderX
.pth、workerpyvenv.cfg/include-system-site-packages或等价PYTHONPATH、worker 内import cinderx/_cinderx、cinderx.__file__、cinderx.get_import_error()和cinderx.is_initialized()。 - 正式非 debug 命令形态必须包含
--affinity、--warmup、-b <benchmark-selector>(subset 时)、-o <result.json>和--inherit-environ。 --affinity必须落在当前nproc/lscpu/taskset -pc $$/ 容器 cpuset 显示的可用 CPU 内;高核号不可用时,重分配可用 CPU 并记录原始 affinity -> 实际 affinity。--inherit-environ至少覆盖代理、LD_LIBRARY_PATH、PYTHONPATH、插件开关和 JIT 关键变量。- 若
validation-skill-routerdeny 了 pyperformance 命令,不要把它当测试失败;先补齐pyperformance-env-contract.md要求的 worker venv /.pth/--inherit-environ/ JIT 初始化证据,再用CPYTHON_OPTIMIZE_HOOK_ACK=1前缀重试同一条正式命令。 - 不能在未完成前置证据时提前加
CPYTHON_OPTIMIZE_HOOK_ACK=1绕过 hook;ACK 只表示已经完成环境契约检查。 - 记录 warmup、loops、CPU affinity、容器线、Python、CinderX commit。
- 正式数据关闭 HIR/JIT dump、
--debug-single-value和临时诊断变量;这些只用于 L2 调试,不进入正式性能结论。 - subset/full 根据用户范围、受影响用例和已有证据选择;需扩大验证时再参考
validation-strategy。 - 可复用示例使用占位符;实际命令和报告记录真实 benchmark、参数与结果路径。
命令形态
目标集合正式性能测试:
<env-vars> <python> -m pyperformance run \
--affinity=<cpu-list-or-set> \
--warmup <n> \
-b <benchmark-selector> \
--inherit-environ <comma-separated-env-list> \
-o <result.json>
全量性能测试:去掉 -b <benchmark-selector>,在用户已要求 full 或预算覆盖时执行;否则按 validation-strategy 先明确是否需要扩大范围。
性能对比:
<python> -m pyperf compare_to <baseline.json> <candidate.json> --table -G
故障排查 Checklist
run.json缺失或损坏:先查 stdout/stderr、exit status、输出目录和 pyperformance worker 日志,不要立即重跑全量。--affinity核号不存在或被容器 cpuset 限制:按pyperformance-affinity-guidance.md重映射到可用 CPU;A/B CPU 不足时改串行或询问降级口径。- 环境变量不生效:先按
pyperformance-env-contract.md检查变量是否只到 driver、未进--inherit-environ,或在 worker/bench_command 子进程中丢失。 - worker 导入 CinderX 或 JIT 初始化失败:回到
pyperformance-worker-run检查.pth、系统 site-packages、pyvenv.cfg、PYTHONPATH、--inherit-environ和 worker 内cinderx.is_initialized()。 - 结果波动大:检查 CPU 绑核、governor、后台任务、容器资源隔离、warmup/loops 和 baseline/candidate 唯一差异轴。
- 正式运行中发现 debug 变量:丢弃该结果,重新用非 debug 命令运行。
反问 Gate
- 全量运行不在用户请求内,且预计显著增加成本时,说明子集方案并询问;已明确要求 full 时不重复确认。
- benchmark、baseline 含义或正式/调试目标查证后仍不明时询问。warmup、loops 沿用可比口径或工具默认值并记录,不要求用户选择内部参数。
- 可用 CPU 不足时默认串行并保持同一实际 affinity;无法满足用户明确固定的口径时再询问。
- 正式运行在命令局部关闭 HIR/JIT dump 和临时诊断变量,保留诊断产物,不为此再次索取授权。