Files
orbit/docs/reports/phase-6-execution-load.md

72 lines
6.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# P6:真实 Worker 任务执行测量
日期:2026-09-20(Asia/Shanghai,原始报告时间为UTC)。新增独立命令 `sdk/go/cmd/orbit-exec-load`,保留原 `orbit-load` 的纯受理边界。完整参数、权限、错误退出、分母和时钟定义见[执行测量手册](../api/execution-load.md)。本批交付短/混合/中长任务的可运行测量及正确性核验,不代表生产容量验收。
## 实现和核验
负载程序在业务侧独立SDK模块运行,与Orbit服务进程分离,只使用HTTP/WSS公共接口;没有数据库驱动或服务端内部依赖。每次使用独立处理器、固定序号/时长/输入、唯一提交键。HTTP提交不自动重试,任务最多一次尝试,Worker按现有协议心跳、续租、重连和收尾。
成功数量来自持久化任务及尝试历史的读取,逐项核验状态、输入/结果、队列/版本/业务键、单次尝试、授权/结束时间及单次处理器调用。SDK收到控制确认、处理器返回nil和本地事件都不能单独计为成功。截止或任一错配必须以 `complete=false` 和非零退出码结束;没有完成样本时百分位为null。
## 最终环境
原始配置及当前测量源码SHA-256保存在[环境清单](data/phase-6-execution-load/environment.json)。
| 项目 | 实际值 |
| --- | --- |
| 主机/运行环境 | macOS arm64、Docker Linux/arm64;共享VM可见12 CPU、12529274880字节内存,未独占硬件 |
| 工具链 | 实际 `go1.25.14`,仅临时modfile替换Go指令;仓库仍声明Go 1.27.1 |
| 拓扑 | 一次性MySQL 8.4.10,1个Orbit进程,1个负载进程内2条Worker连接,每条capacity=4 |
| 网络 | Go运行容器共享MySQL容器网络命名空间;HTTP/WSS和MySQL均走loopback |
| MySQL | `innodb_flush_log_at_trx_commit=1`、`sync_binlog=1`、buffer pool=128MiB、max_connections=151 |
| 隔离级别 | MySQL全局REPEATABLE-READ;Orbit写事务显式READ COMMITTED |
| Orbit | 数据库连接池max_open=20、max_idle=5;鉴权和持久事件/审计启用;metrics未启用 |
| 队列 | max_concurrency=4、rate_per_second=10、max_unfinished_tasks=100000;工具未更改配置 |
| 核验 | 每个HTTP请求5秒上限、单核验器250ms间隔,核验器最多与提交并发数相同 |
| 数据量 | 空库初始化;short/mixed/long/deadline顺序运行,开始时已有任务数分别0/96/192/198;各运行身份隔离 |
最后 `orbit-admin verify` 返回 schema=28、migration_count=28、foreign_key_count=0、required_index_count=6、complete=true。测试容器退出后销毁一次性数据库和凭据。
## 原始结果
前三组均在2分钟整体预算内完整通过,退出0。三个阶段分布的分母分别为96、96、6;都没有重复处理器调用、无回执调用或Worker重连。
| 样本 | 任务/处理器时长 | 受理p99 ms | 排队p99 ms | 授权执行p99 ms | 任务完成p99 ms | 持久成功/计划数 |
| --- | --- | --- | --- | --- | --- | --- |
| [short原始JSON](data/phase-6-execution-load/short.json) | 96项,0ms | 54.678 | 13752.092 | 28.838 | 13768.327 | 96/96 |
| [mixed原始JSON](data/phase-6-execution-load/mixed.json) | 96项,0/100/1000ms循环,各32项 | 40.274 | 41024.973 | 1042.773 | 42047.090 | 96/96 |
| [long原始JSON](data/phase-6-execution-load/long.json) | 6项,每项35000ms | 28.028 | 38015.493 | 35024.585 | 73040.078 | 6/6 |
长任务总计18次续租确认,最终仍为每项一次尝试、一次调用。该数字验证了此次实际续租路径,不表示节点/网络故障已经发生。
排队分布包含当前4并发/每秒10次开始的队列约束及调度扫描;Worker声明8个槽不会绕过队列限制。这组数字不能视为去掉配额后的最大吞吐。
`authorized_execution` 和 `task_completion` 用持久化数据库时间戳计算;终点是结束事务内部取时点,未包含其后COMMIT及确认延迟。已提交事实由后续读取核验。客户端核验顺序不计入这些分布,但查询负载会影响服务资源消耗。没有收集独占CPU/内存/磁盘/锁等待曲线,也没有多轮稳态和生产指标开启后的对照。
## 失败语义实测
[deadline原始JSON](data/phase-6-execution-load/deadline.json):24项、4并发提交、1个Worker/1个槽、每项1秒、整体预算2秒。命令按预期退出1,`accepted=24`、`verified_success=0`、`unverified=24`、`complete=false`;本地只有1次处理器调用。读取观察到1项NEEDS_REVIEW,23项未能在截止前验证,三种完成阶段的分布均为 `count=0` / 百分位null。
错误计数保留 `RUN_TIMEOUT`、`TASK_NEEDS_REVIEW`、`VERIFY_TIMEOUT` 和 `INVOCATION_MISMATCH`。这些计数含运行级及交叠的核验错误,不能求和当成失败任务总数。工具没有删除、强制成功或重新提交这些任务;未观察到终态不等于数据库确认失败,剩余状态留在原身份下供核查。
## 复现和回归
按[手册](../api/execution-load.md)准备一次性数据库、当前迁移、带Worker权限的凭据及真实Orbit进程,然后在 `sdk/go` 运行:
```sh
go run ./cmd/orbit-exec-load -requests 96 -concurrency 8 -workers 2 -capacity 4 -durations 0ms -run-timeout 2m
go run ./cmd/orbit-exec-load -requests 96 -concurrency 8 -workers 2 -capacity 4 -durations 0ms,100ms,1s -run-timeout 2m
go run ./cmd/orbit-exec-load -requests 6 -concurrency 3 -workers 2 -capacity 4 -durations 35s -run-timeout 2m
# 此项应失败;必须读取JSON确认是预算不足,不应仅判断任意非零退出。
go run ./cmd/orbit-exec-load -requests 24 -concurrency 4 -workers 1 -capacity 1 -durations 1s -run-timeout 2s
```
本轮在上述Docker环境使用临时modfile构建真实Linux二进制,执行了四条等价命令及下列检查:
- SDK全模块 `go test -race ./...`、`go vet ./...`、`go build ./...` 通过;没有设置原SDK集成凭据的普通单测不冒充全量集成。
- 新增单测覆盖:错配/缺失/空字段结果、未知效果、第二次尝试、悬空历史、时间逆序、提交超时/429不重报、整次取消、核查不算成功、读取失败、重复调用、无权限预检及错误脱敏。
- SDK完整依赖图218项中,服务端内部/模型/模块和MySQL驱动依赖均为0。
- `scripts/test-mysql.sh` 已加入6项真实执行命令冒烟,shell语法检查通过。本轮运行的是四个独立真实样本,未重新执行整个 `make integration`。
当前不把临时Go 1.25兼容回归升级为声明Go 1.27.1的正式发布结论。下一批继续定时集中触发、流程推进、长期积压、慢消费者/重连风暴及资源曲线,生产HA、复制切换与RPO/RTO仍需目标拓扑证据。