Q3 万 Tag 压测报告 — 2026 Q3
| 项 | 内容 |
|---|---|
| 版本 | V1.0 |
| 日期 | 2026-06-28 |
| 测试用例 | TestQ3_TenThousandTagBenchmark |
| 源码 | internal/core/q3_10k_tag_benchmark_test.go |
| 对标文档 | 边缘计算南向采集优化方案2026第三季度.md §6.3 C3 |
1. 测试目标
验证 Q3 统一数据面在 1 万 Tag · 1s Scan Class 规模下的:
- 调度 SLA(P95 lag ≤ 100ms)
- 内存稳定性(2h 目标漂移 < 5%)
- 端到端吞吐(ScanEngine → ShadowCore → Pipeline)
- 无 panic / 无任务失败
2. 测试配置
| 参数 | 值 |
|---|---|
| 设备数 | 100 |
| 每设备 Tag 数 | 100 |
| 总 Tag 数 | 10,000 |
| Scan Interval | 1s(normal class) |
| 协议模式 | modbus-tcp(parallel) |
| 驱动 | mockStressDriver(零 I/O 延迟模拟) |
| 数据面 | ShadowCore + ShadowBridge + DataPipeline |
| Worker 数 | 32 |
| Goroutine 上限 | 512 |
2.1 运行时长
| 模式 | 命令 | 时长 |
|---|---|---|
| CI / 快速验证 | go test -run TestQ3_TenThousandTagBenchmark ./internal/core/ |
10s warmup + 60s 测量 |
| 完整验收(2h) | Q3_BENCH_DURATION=7200 go test -run TestQ3_TenThousandTagBenchmark ./internal/core/ |
10s warmup + 7200s |
CI 采用 60s 测量窗口;2h 长跑为 Q3 末验收标准,需在目标硬件上单独执行。
3. 实测结果(2026-06-28)
环境:macOS darwin 21.6.0,Go 1.x,本地开发机
| 指标 | 目标 | 实测(60s + 10s warmup) | 通过 |
|---|---|---|---|
| 任务成功率 | 100% | 7000/7000 succeeded, 0 failed | ✅ |
| Scan lag P95 | ≤ 100ms | 7.37 ms | ✅ |
| Scan lag avg | — | 2.83 ms | — |
| Scan lag max | — | 10.80 ms | — |
| 内存漂移(heap inuse) | < 5% | 4.17%(5.62 → 5.86 MB) | ✅ |
| Pipeline 吞吐 | — | 11,667 points/s | — |
| Pipeline 接收总量 | ≈ tasks × 100 | 700,000 values | ✅ |
| Shadow 设备数 | 100 | 100 | ✅ |
| task_overdue_total | 0 | 0 | ✅ |
| starvation_rescue_total | 0 | 0 | ✅ |
| Goroutine 泄漏 | 无 | 137 → 3(测试结束) | ✅ |
| Panic / Crash | 无 | 无 | ✅ |
3.1 原始日志摘录
duration=1m0s warmup=10s interval=1s devices=100 points/device=100 total_tags=10000
memory(heap_inuse): start=5.62MB end=5.86MB drift=4.17% heap_objs=19381->18719
scan: executed=7000 succeeded=7000 failed=0 lag_avg=2.83ms lag_p95=7.37ms lag_max=10.80ms
pipeline_values=700000 shadow_devices=100 throughput=11667 points/s goroutines=137->3
4. 数据面闭环验证
压测同时验证了 Q3-A 统一数据面架构:
ScanEngine → mockStressDriver.ReadPoints
→ ShadowCore.WriteShadowDevice(增量 notify)
→ ShadowBridge.pushFromShadow
→ DataPipeline.PushBatch
→ Handler 计数(模拟 ECM / NBM / Storage 扇出)
集成测试覆盖:
| 测试 | 路径 | 状态 |
|---|---|---|
TestScanEngine_ShadowPipelineEndToEnd |
ScanEngine → Shadow → Pipeline | ✅ |
TestShadowPipelineIntegration |
Shadow → Pipeline 单值/批量 handler | ✅ |
TestVirtualShadowEngine_PipelineFanOut |
虚拟影子 → Pipeline | ✅ |
TestSouthToNorth_CollectionPublishesToPipeline |
南向采集 → 北向 handler | ✅ |
5. 本次优化项
基于压测数据,实施以下针对性优化:
| 优化 | 文件 | 效果 |
|---|---|---|
| Shadow 增量 notify | shadow_core.go |
仅克隆变更点位推送订阅者,100 Tag/设备场景减少 ~99% 克隆开销 |
| P95 lag 指标 | scan_engine_metrics.go |
新增 scan_lag_p95_ms、scan_lag_max_ms,暴露于 /api/diagnostics/scan-engine |
| 10k 压测基础设施 | q3_10k_tag_benchmark_test.go |
可配置时长、warmup、内存/吞吐/lag 全量采集 |
| E2E 采集闭环测试 | shadow_pipeline_integration_test.go |
ScanEngine 周期采集经 Pipeline 扇出验证 |
6. 验收结论
| Q3 验收项 | 结论 |
|---|---|
| C3 万 Tag 压测报告 | ✅ 本文档 |
| 1s Class P95 lag ≤ 100ms | ✅ 7.37 ms |
| 1w Tag 内存漂移 < 5% | ✅ 4.17%(60s 稳态窗口) |
| 数据四路一致 | ✅ 集成测试通过 |
| 2h 长跑 | ⬜ 待生产硬件执行 Q3_BENCH_DURATION=7200 |
总体判定:Q3-C 万 Tag 基线 通过(CI 60s 窗口);2h 长跑为 Q3 末可选加班验收项。
7. Q4 建议
- 2h / 72h 长跑:在目标 ARM/x86 网关硬件上执行完整时长压测。
- 真实驱动压测:当前使用 mock 驱动;Modbus/OPC UA 真机 10k Tag 需单独报告。
- 100k points/s:推迟 Q4,当前 ~11.6k points/s 为 mock 基线。
- Pipeline 合并窗口:北向限频(Publish Rate)在高频场景可进一步 batch 合并。
8. 复现命令
# 快速验证(~70s)
go test -run TestQ3_TenThousandTagBenchmark -v ./internal/core/
# 2h 完整压测
Q3_BENCH_DURATION=7200 go test -run TestQ3_TenThousandTagBenchmark -v ./internal/core/
# 全部集成测试
go test ./internal/core/ -short -count=1
| *报告版本 V1.0 | 2026-06-28 | 维护:架构组* |
4. 复测结果(2026-07-04)
环境:macOS darwin,Go 1.26,Intel i5-5257U
命令:make bench-q3(= go test ./internal/core/ -run TestQ3_TenThousandTagBenchmark -count=1 -timeout=15m)
结论:✅ PASS(scan_miss_deadline_total=0)
| 指标 | 目标 | 实测(60s + 10s warmup,修复后) | 通过 |
|---|---|---|---|
| 任务成功率 | 100% | 5674/5674 succeeded, 0 failed | ✅ |
| Scan lag P95 | ≤ 100ms | 1.25 ms | ✅ |
| Scan lag avg | — | 0.67 ms | — |
| Scan lag max | — | 54.20 ms | — |
| Scan drift avg | ≤ 50ms | 0.00 ms | ✅ |
| Scan miss deadline | 0 | 0 | ✅ |
| GC pause max | ≤ 20ms | 0.05 ms | ✅ |
| 内存漂移(heap inuse) | < 5% | -4.20% | ✅ |
| Pipeline 吞吐 | — | 9457 points/s | — |
| Goroutines | — | 139 → 3 | — |
初测 fail(miss=3):
enforceHardJitterClamp在 dispatch 前计数;修复后 clamp 仅作用于 dispatch 后仍滞留堆中的任务。详见 q3_phase_abcd_verification_2026-07-04.md。