Files
yovision/docs/research/sense-16-stream-capacity.md
QiuSW b9e21a95d1
Harness governance / validate (push) Has been cancelled
Harness governance / validate (pull_request) Has been cancelled
docs(task): record T-014 16-stream baseline
2026-08-10 23:16:12 +08:00

7.0 KiB
Raw Permalink Blame History

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. 运行方法与安全边界

从仓库根目录执行:

./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 边界。