110 lines
7.0 KiB
Markdown
110 lines
7.0 KiB
Markdown
# Sense 本地 16 路容量与批量收敛基线
|
||
|
||
> T-014 正式证据,运行日期:2026-08-10。本文只证明固定主机、固定版本和低码率合成负载下的本地软件基线,不是生产 SLA。
|
||
|
||
## 1. 结论
|
||
|
||
在 24 个逻辑处理器、15.78 GiB 内存的 Windows 主机上,提交 `d029067aa750ad75a2d79ef8e6c51b6bad55096d` 使用隔离 PostgreSQL、真实 Sense Control API、两套独立 MediaMTX 和 16 个独立 FFmpeg publisher 完成正式验收:
|
||
|
||
- 16 个 disabled 视频设备创建后,三轮 16 项批量操作全部成功,生产 MediaMTX 配置 Path 数按 `16 → 0 → 16` 收敛。
|
||
- 16 路 enabled 后,第 17 路 enabled 创建稳定返回 `quota_exceeded`,设备台账仍为 16 项;disabled 项不冒充已占用视频通道。
|
||
- 同时停止固定第 5~8 路后,精确 4 路受影响、其余 12 路保持在线;恢复后 5.1 秒回到 16 路在线和 `unconverged=0`。
|
||
- 正式稳定窗口为 1800.1 秒,每 10 秒绝对节拍采样,共 180 个样本;最大与最终未收敛数均为 0,最终在线 Path 为 16,入站帧错误增量为 0。
|
||
|
||
因此,默认 16 路的 Sense/PostgreSQL/MediaMTX 控制面与拉流闭环具备可重复的本地软件基线。该结论不证明 16 台真实摄像头、客户网络、录像、下游观看、AI 解码/推理、GPU、64/128 路分片或生产 SLA,也不解除 T-007/T-013。
|
||
|
||
## 2. 固定环境与负载
|
||
|
||
| 项目 | 正式值 |
|
||
| --- | --- |
|
||
| 仓库提交 | `d029067aa750ad75a2d79ef8e6c51b6bad55096d` |
|
||
| Sense 二进制 SHA-256 | `e6fa01991152cf7e9f2a1e420422a12d474dfe7be10530ff2924671d46cc7871` |
|
||
| Go | `go1.26.5 windows/amd64`(在 `Sense/` 模块上下文读取) |
|
||
| PostgreSQL | `17.10`,单次运行隔离临时集群 |
|
||
| MediaMTX | `v1.19.3` |
|
||
| MediaMTX Windows amd64 ZIP SHA-256 | `5d82148d1032a6a190d9909a2997d9989457aaadf49af87dd02cd4512d31bebe` |
|
||
| MediaMTX EXE SHA-256 | `1cda85249312cb9463f9f94c5a712b9f160c9af3fd9490f0d4723911d7880e05` |
|
||
| FFmpeg | `8.1.2-full_build-www.gyan.dev` |
|
||
| 主机 | Windows,24 logical processors,15.78 GiB memory |
|
||
| 单路夹具 | 640×360、10 fps、H.264、无音频、无人物 |
|
||
| 发布方式 | 16 个独立 FFmpeg 进程,各自循环预编码夹具并以 `-c copy` 发布独立 RTSP Path |
|
||
|
||
预编码 copy 发布是为了不把 16 路软件编码负载混入 Sense/MediaMTX 基线。它仍产生 16 个可独立停止和恢复的发布进程,但不能代表真实摄像头编码器、复杂 GOP、高码率、音频或公网抖动。
|
||
|
||
## 3. 运行方法与安全边界
|
||
|
||
从仓库根目录执行:
|
||
|
||
```powershell
|
||
./Sense/scripts/t014-capacity.ps1 -PgRoot D:\pgsql17 -PreflightOnly
|
||
./Sense/scripts/t014-capacity.ps1 -PgRoot D:\pgsql17 -OutputPath (Join-Path $env:TEMP 'yovision-t014-formal-final.json')
|
||
```
|
||
|
||
调试可显式传入 `-ObservationMinutes 1`,但输出固定标记 `formal_eligible=false`,不能作为正式验收。
|
||
|
||
脚本在系统临时目录生成媒体、Sense 二进制、凭据文件和 PGDATA,只绑定随机回环端口;migration 读取 `001`~`011` 并重复回放,不读取或修改 `D:\pgsql17\data`。结果 JSON 不包含 token、DSN、临时端口、设备 ID、Path/source URI 或凭据引用。正式退出后复查 session、FFmpeg、MediaMTX 和 Sense 数量均为 0,本机现有 5432 listener 前后未变化。
|
||
|
||
## 4. 功能与时序结果
|
||
|
||
| 门禁 | 正式结果 |
|
||
| --- | ---: |
|
||
| 16 个独立 publisher 就绪 | 7.6 s |
|
||
| 首轮 enable batch | `succeeded`,16 项,请求 0.041 s |
|
||
| 首轮 enable 收敛 | 3.1 s |
|
||
| 第 17 路 enabled | 拒绝,`quota_exceeded` |
|
||
| disable batch | `succeeded`,16 项,请求 0.015 s |
|
||
| disable 收敛 | 1.0 s |
|
||
| 第二轮 enable batch | `succeeded`,16 项,请求 0.046 s |
|
||
| 第二轮 enable 收敛 | 3.1 s |
|
||
| 配置 Path | `16 → 0 → 16` |
|
||
| 四路故障检测 | 1.0 s,影响 4 路,其余 12 路在线 |
|
||
| 四路恢复 | 5.1 s,最终未收敛 0 |
|
||
|
||
批量启停使用真实 `/api/v1/sites/{site_id}/devices:batchDesiredState`,每轮提交前重新读取各设备最新 ETag;不能用创建响应中的旧 ETag 与后台调和竞速。每轮 operation 必须为 `succeeded` 且 16 个逐项结果全部成功。
|
||
|
||
## 5. 30 分钟稳定性与资源观测
|
||
|
||
| 指标 | 正式结果 |
|
||
| --- | ---: |
|
||
| 观察时长 | 1800.1 s |
|
||
| 采样节拍 / 样本 | 10 s / 180 |
|
||
| 最大未收敛数 | 0 |
|
||
| 最终未收敛数 | 0 |
|
||
| 最终在线 Path | 16 |
|
||
| 聚合入站码率 | 15.443 Mbps |
|
||
| 入站帧错误增量 | 0 |
|
||
| Sense CPU 总时间 | 5.594 s |
|
||
| Sense working set 峰值 | 69.99 MiB |
|
||
| Sense private bytes 峰值 | 57.58 MiB |
|
||
| Sense handle 峰值 | 228 |
|
||
| 生产 MediaMTX CPU 总时间 | 26.812 s |
|
||
| 生产 MediaMTX working set 峰值 | 45.27 MiB |
|
||
| 生产 MediaMTX private bytes 峰值 | 79.23 MiB |
|
||
| 生产 MediaMTX handle 峰值 | 295 |
|
||
| PostgreSQL 业务库连接峰值 | 3 |
|
||
| PostgreSQL 数据库大小 | 8.90 MiB |
|
||
|
||
归一化 CPU 平均值与峰值在 24 逻辑处理器主机上四舍五入到三位小数后为 0.000%,因此报告保留进程 CPU 总秒数作为低负载证据;不能据此推导通用硬件下限。
|
||
|
||
## 6. 失败记录与工具修正
|
||
|
||
正式结论只取最后一次完整成功运行。研发过程中保留以下失败,不拼接为成功证据:
|
||
|
||
1. MediaMTX 发布 ZIP 与解压后 EXE 的 SHA-256 不同,脚本分别冻结并校验两者。
|
||
2. disabled 设备不消耗视频通道;第 17 路门禁改为在 16 路 enabled 后创建 enabled 设备,符合实际配额语义。
|
||
3. PowerShell 读取 `application/problem+json` 时可能得到 byte array;脚本显式按 UTF-8 解码后校验稳定错误码。
|
||
4. 把 `pg_ctl start` 接入 PowerShell 输出管道会让 PostgreSQL 继承管道句柄并阻塞;启动改为直接执行并检查退出码。
|
||
5. Windows 退出时 `sense-api.exe` 曾短暂持有文件锁;清理改为共享截止时间内终止全部进程、完成异步输出读取、释放 `Process` 句柄并重试删除。
|
||
6. “固定睡 10 秒再查询”会把查询耗时累计进采样间隔,30 分钟不足 180 个样本;改为按绝对时间点调度第 1~180 个样本。
|
||
7. 根目录 Go launcher 为 1.23.0,但 `Sense/go.mod` 冻结并实际构建使用 1.26.5;版本证据改为在 `Sense/` 模块上下文读取。
|
||
8. 首轮 batch 曾复用创建响应 ETag,与后台调和的资源版本更新竞速;现在三轮 batch 都在提交前读取最新 ETag,失败诊断只输出状态/错误码计数。
|
||
|
||
每次失败都没有生成正式成功 JSON,且相关临时 PostgreSQL、媒体和 Sense 进程已停止,单次 session 已清理。
|
||
|
||
## 7. 后续验收
|
||
|
||
- T-007 仍需至少 5 条独立真实摄像头上游与现场网络,才能形成真实多路故障隔离和生产试点证据。
|
||
- T-013 等客户网络拓扑、地址规划和部署权限具备后,再验证 WireGuard 与断网补传。
|
||
- 64/128 路必须在后续任务中分别验证媒体分片、带宽、解码、AI/GPU、证据存储和单分片故障域;本报告不外推这些结论。
|
||
- 进入 M3 前应优先冻结并实现 Bell 事件不可变存储,以及 Sense Outbox 到 Bell 全局审计的 relay 边界。
|