72 lines
6.7 KiB
Markdown
72 lines
6.7 KiB
Markdown
# 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的正式发布结论。定时集中触发、流程推进和长期积压已有独立样本(见[定时报告](phase-6-schedule-load.md)、[流程报告](phase-6-workflow-load.md)、[积压报告](phase-6-backlog.md));下一步补慢消费者/重连风暴、目标硬件资源曲线,生产HA、复制切换与RPO/RTO仍需目标拓扑证据。
|