1. 测试环境
Rockchip RK3588s
- CPU 架构:ARM Cortex-A55 × 4 + A76 × 4 (big.LITTLE)
- CPU 特性:A55 顺序执行 / A76 乱序执行
- 核心数:8 核 (4+4)
- 内存:3.8 GB DDR
- 操作系统:Linux 5.10.209 (aarch64)
- Go 工具链:交叉编译 CGO_ENABLED=0
- 测试方式:SSH 远程执行 (root@192.168.3.230)
Intel Core i5-13500H
- CPU 架构:Raptor Lake (Golden Cove P-core)
- CPU 特性:乱序执行 / 超线程 / AVX2
- 核心数:12 核 (4P+8E) / 16 逻辑线程
- 内存:32 GB DDR5
- 操作系统:Windows 11 (amd64)
- Go 工具链:go1.26.4 windows/amd64
- 测试方式:本地 PowerShell 直接执行
架构差异说明:Cortex-A55 为顺序执行核心,IPC 和分支预测能力显著弱于 i5-13500H 的 Golden Cove 性能核。因此 2–5 倍的纯 CPU 性能差距属于正常范围。本报告聚焦于 EdgeX 工业网关在两类硬件上的 SLA 达标能力和实际部署表现,而非纯 CPU 性能竞赛。
测试矩阵
| 测试项 | 测试用例 | ARM64 时长 | x86 时长 | 关键指标 |
|---|---|---|---|---|
| Q3 万 Tag 压测 | TestQ3_TenThousandTagBenchmark | 70.18s | 73.90s | P95 lag, 吞吐量, 内存漂移 |
| G007 设备吞吐量 | TestG007_DeviceThroughputBenchmark | 40.02s | 40.24s | 设备/秒, P95 lag, 背压拒绝 |
| 微基准测试 | Benchmark* (6 项 × 3 轮) | ~20s | 65.59s | ns/op, B/op, allocs/op |
| Core 单元测试 | ./internal/core/... -short | ~30s | ~40s | PASS/FAIL 计数 |
| Integration 测试 | ./internal/integration/... -short | ~15s | 5.71s | PASS/FAIL/SKIP 计数 |
| Driver 测试 | ./internal/driver/... -short | ~10s | ~120s | PASS/FAIL 计数 |
2. Q3 万 Tag 压测对比
验证 ScanEngine + ShadowCore + DataPipeline 在 100 设备 × 100 点位 = 10,000 Tag、1s Scan Class 规模下的调度 SLA 和内存稳定性。
| 指标 | SLA 目标 | ARM64 (Cortex-A55) | x86 (i5-13500H) | 对比 |
|---|---|---|---|---|
| 任务执行数 | — | 5,934 | 5,393 | ARM +10.0% |
| 任务成功数 | 100% | 5,934 | 5,393 | ✅ 0 失败 |
| 任务失败数 | 0 | 0 | 0 | ✅ |
| Scan lag avg | — | 0.58 ms | 0.65 ms | ARM -10.8% |
| Scan lag P95 | ≤ 100 ms | 1.10 ms | 0.99 ms | 近乎持平 |
| Scan lag max | — | 3.04 ms | 53.80 ms | ARM 稳定性更优 |
| Scan drift avg | — | 0.00 ms | 0.00 ms | ✅ |
| Miss deadline | 0 | 0 | 0 | ✅ |
| Pipeline 吞吐量 | — | 9,890 pts/s | 8,988 pts/s | ARM +10.0% |
| 内存漂移 (heap) | < 5% | -8.28% | -3.89% | ✅ 均通过 |
| GC pause max | < 20 ms | 0.22 ms | 0.58 ms | ✅ |
| Goroutine 泄漏 | 无 | 140→3 | 140→3 | ✅ 无泄漏 |
关键发现:ARM64 在 Q3 压测中表现出略优于 x86 的吞吐量(9890 vs 8988 pts/s),且 max lag 稳定性更优(3.04ms vs 53.80ms)。这主要归因于:(1) RK3588s 的 4×A76 大核在内存密集型操作中表现优异;(2) Linux 调度器相比 Windows 在处理大量 goroutine 时延迟抖动更低;(3) 零 I/O 的 mock driver 场景下,纯 CPU 调度受 OS 开销影响更大。两平台均远超 SLA 要求(P95 ≤ 100ms,实际 < 2ms)。
3. G007 设备吞吐量对比
验证 §2.5.5 调度吞吐量 ≥ 950 devices/sec。1000 设备、1s 扫描间隔、mock driver(零 I/O)。
| 指标 | SLA 目标 | ARM64 (Cortex-A55) | x86 (i5-13500H) | 对比 |
|---|---|---|---|---|
| 任务执行数 | — | 29,872 | 29,158 | ARM +2.4% |
| 任务成功数 | 100% | 29,872 | 29,158 | ✅ 0 失败 |
| 吞吐量 | ≥ 950 dev/s | 996 dev/s | 972 dev/s | ARM +2.5% |
| P95 lag | — | 1.19 ms | 1.76 ms | ARM -32.4% |
| Miss deadline | 0 | 0 | 0 | ✅ |
| 背压拒绝 | 0 | 0 | 0 | ✅ |
| Goroutine | 无泄漏 | 1040→2 | 1040→2 | ✅ |
分析:G007 场景下两平台性能高度接近(差异仅 2.5%),均远超 950 devices/s 的 SLA 门禁。这表明在高并发、轻负载的调度密集型场景中,ARM64 的 Go 运行时表现与 x86 相当。1000 设备的 goroutine 调度开销在两类平台上均被有效控制。
4. 微基准测试对比
ShadowCore 和 ScanEngine 热路径函数的微基准测试,每项 3 轮取最优值,衡量 ns/op、B/op、allocs/op。
| Benchmark | ARM64 (ns/op) | x86 (ns/op) | ARM/x86 比率 | ARM64 (allocs) | x86 (allocs) |
|---|---|---|---|---|---|
| LoadPoints_Pooled | 183.6 | 183.7 | 1.00× | 0 | 0 |
| ApplyCollectToShadow_Pooled | 58,584 | 61,590 | 0.95× | 16 | 16 |
| WriteShadowDevice | 6,494 | 7,665 | 0.85× | 14 | 14 |
| WriteShadowDevice_MultiPoint | 26,144 | 25,390 | 1.03× | 45 | 45 |
| GetShadowDevice | 816.7 | 591.1 | 1.38× | 2 | 2 |
| NotifySubscribers | 6,260 | 7,020 | 0.89× | 14 | 14 |
| GetShadowDevice_COW | 373.4 | 288.5 | 1.29× | 1 | 1 |
关键发现:ARM64 在写路径(WriteShadowDevice、NotifySubscribers)上表现优于 x86(0.85–0.89×),而 x86 在读路径(GetShadowDevice、GetShadowDevice_COW)上表现更优(1.29–1.38×)。这符合预期:写路径受内存延迟影响更大,ARM64 的紧密耦合内存架构在此场景下具有优势;读路径则受益于 x86 的乱序执行和更高的单核 IPC。内存分配次数(allocs/op)在两平台上完全一致,证明 Go 编译器交叉编译的代码质量一致。
5. 单元测试与集成测试通过率
两平台运行完全相同的测试二进制(ARM64 为交叉编译产物),验证代码在不同架构上的行为一致性。
全部通过
- Core 单元测试:ALL PASS
- Integration 测试:14 PASS · 5 SKIP
- Driver 测试:ALL PASS
- 总测试数:~150+ tests
- 失败数:0
- Panic/Crash:无
全部通过
- Core 单元测试:ALL PASS
- Integration 测试:14 PASS · 5 SKIP
- Driver 测试:ALL PASS
- 总测试数:~150+ tests
- 失败数:0
- Panic/Crash:无
结论:两平台测试结果完全一致 — 所有核心测试通过,5 个集成测试正确跳过(需要真实硬件设备的测试在 short 模式下被跳过),无 panic、无崩溃、无 goroutine 泄漏。这证明 EdgeX 代码库在 ARM64 和 x86 架构上具有完全的行为一致性。
跳过的集成测试 (expected skips)
| 测试用例 | 跳过原因 |
|---|---|
| TestModbusPLC_PressureMultiSlaveIsolation | 需要真实 Modbus PLC 硬件 |
| TestModbusProtocol_CBRecoveryCycles | 需要真实 Modbus 设备 |
| TestOpcuaProtocol_SessionFramework | 需要 OPC UA 服务器 |
| TestS7Protocol_SessionFramework | 需要 Siemens S7 PLC |
| TestSoak_ScanEngineShortGate | short 模式下跳过 |
6. 综合分析与结论
6.1 性能对比总结
| 测试类别 | ARM64 表现 | x86 表现 | 关键差异 |
|---|---|---|---|
| Q3 万 Tag 压测 | 9890 pts/s | 8988 pts/s | ARM 吞吐量 +10%,max lag 稳定性更优 |
| G007 设备吞吐量 | 996 dev/s | 972 dev/s | 差异仅 2.5%,近乎持平 |
| 写路径微基准 | 6,260–6,494 ns | 7,020–7,665 ns | ARM 快 11–15% |
| 读路径微基准 | 374–817 ns | 289–591 ns | x86 快 29–38% |
| 单元/集成测试 | 全部通过 | 全部通过 | 完全一致 |
| SLA 达标 | 全部达标 | 全部达标 | 两平台均远超 SLA 要求 |
6.2 架构差异分析
ARM64
ARM64 在 WriteShadowDevice、NotifySubscribers 等写操作上表现更优(0.85–0.89×)。内存写入延迟在 ARM64 的紧密耦合内存架构中更低;Linux 内核的写操作缓存策略相比 Windows 更高效;big.LITTLE 架构的 A76 大核在内存带宽密集型操作中表现优异。
x86
x86 在 GetShadowDevice、GetShadowDevice_COW 等读操作上表现更优(1.29–1.38×)。Golden Cove P-core 的单核 IPC 显著高于 Cortex-A55/A76;乱序执行和更好的分支预测器在读路径的指针追踪模式中发挥优势;更大的 L3 缓存(18MB)减少了读操作的 cache miss。
6.3 发布门禁评估
| 门禁 | 要求 | ARM64 状态 | x86 状态 |
|---|---|---|---|
| 稳定性 | 0 panic / 0 crash / 无 goroutine 泄漏 | ✅ PASS | ✅ PASS |
| 工业级验证 | 全部单元测试通过 | ✅ PASS | ✅ PASS |
| 性能 | Q3 P95 ≤ 100ms, G007 ≥ 950 dev/s | ✅ PASS | ✅ PASS |
| 轻量化 | 内存漂移 < 5%, GC pause < 20ms | ✅ PASS | ✅ PASS |
6.4 部署建议
ARM64 工业网关部署完全可行。RK3588s (Cortex-A55 + A76) 在 EdgeX 的所有核心场景中均满足 SLA 要求,且在实际吞吐量上甚至略优于开发机 i5-13500H。考虑到工业网关的典型负载(真实 I/O 等待 >> CPU 计算),ARM64 的性能裕量充足。
对于纯计算密集型边缘规则(如复杂表达式求值),建议评估实际规则复杂度后决定是否需要在 ARM64 上增加 CPU 资源或优化规则表达式。对于I/O 密集型采集场景(Modbus、OPC UA、BACnet 等),ARM64 平台是性价比极高的选择。
7. 测试复现命令
ARM64 交叉编译
# 交叉编译测试二进制
$env:GOOS='linux'; $env:GOARCH='arm64'; $env:CGO_ENABLED='0'
go test -tags=bench -c ./internal/core/ -o edgex-bench-arm64.test
go test -c ./internal/core/ -o edgex-core-arm64.test
go test -c ./internal/integration/ -o edgex-integration-arm64.test
go test -c ./internal/driver/ -o edgex-driver-arm64.test
# 推送到 ARM64 目标板
scp *.test root@192.168.3.230:/tmp/edgex-tests/
# SSH 到目标板执行
ssh root@192.168.3.230
Q3_BENCH_DURATION=60 /tmp/edgex-tests/edgex-bench-arm64.test -test.run TestQ3_TenThousandTagBenchmark -test.v
G007_BENCH_DURATION=30 /tmp/edgex-tests/edgex-bench-arm64.test -test.run TestG007_DeviceThroughputBenchmark -test.v
x86 本地执行
# Q3 万 Tag 压测
$env:Q3_BENCH_DURATION="60"
go test ./internal/core/ -run TestQ3_TenThousandTagBenchmark -count=1 -timeout=15m -v
# G007 设备吞吐量
$env:G007_BENCH_DURATION="30"
go test ./internal/core/ -run TestG007_DeviceThroughputBenchmark -count=1 -timeout=5m -v
# 微基准
go test ./internal/core/ -run '^$' -bench 'Benchmark(Write|Get|Notify|Apply|Load)' -benchmem -benchtime=2s -count=3
# 完整测试
go test ./internal/core/... -short -count=1 -timeout=10m
go test ./internal/integration/... -short -count=1 -timeout=10m
go test ./internal/driver/... -short -count=1 -timeout=10m