实时抖动分析
概述
"实时"不是"快", 是"准时"。DarraRT 以 1ms 周期抖动 < 20μs 为工控行业标杆, 这一指标在通用 Windows 上默认表现为 500μs ~ 数 ms, 必须通过核心隔离、SMI 抑制、 中断亲和配置、BIOS 电源管理等多重手段系统性压制。本文档拆解抖动来源、测量方法、 优化路径, 并给出 p95 / p99 / max 的长尾分析框架。
适用场景
- 新工控机上线基线测试
- 产线偶发"顿挫" (周期性但难以复现)
- 机器人轨迹抖动明显 (视觉可见)
- 对比不同 BIOS 设置的影响
前置条件与工具
| 工具 | 用途 |
|---|---|
DarraRT.sys | 内置抖动测量 + 隔离核 |
DbgView.exe | 观察 SMI 计数 |
| Windows Performance Analyzer (WPA) | 长期 .etl 分析 |
| BIOS Setup | 关闭 C-State / SpeedStep / USB Legacy |
bcdedit | 内核启动参数 |
抖动来源拆解
DarraRT 把抖动按来源分为六类, 每一类有独立的检测与抑制手段:
| 序 | 来源 | 量级 | 检测 | 抑制 |
|---|---|---|---|---|
| 1 | SMI 中断 | 10μs ~ 数百μs | SMI 计数器 | BIOS 关 USB Legacy/TPM |
| 2 | CPU 变频 | 数十μs | TSC 频率波动 | 关 SpeedStep/Turbo 或强制最高频 |
| 3 | 共享核抢占 | 数μs ~ ms | WPA CPU 图 | 核心隔离 |
| 4 | 缓存抖动 | 百 ns ~ μs | 硬件计数器 | 隔离核独占 L2 / L3 |
| 5 | 中断聚合 | 数 μs | DPC 统计 | 亲和到非隔离核 |
| 6 | 分页/TLB Miss | 百 ns ~ 数μs | Page Fault 计数 | 锁页 (AWE 或 VirtualLock) |
SMI (System Management Interrupt)
最隐蔽的抖动源。SMI 由 BIOS 触发, 进入 SMM (System Management Mode), 此时 CPU 不响应任何操作系统, 包括我们的隔离核。典型 SMI 时长 30μs ~ 200μs, 某些 BIOS 每 60 秒触发一次, 直接毁掉实时性。
DarraRT.sys 开机后会持续监控 SMI 计数:
[DarraRT] SMI CNT core0 = 12
[DarraRT] SMI CNT core0 = 12 (+0)
[DarraRT] SMI CNT core0 = 13 (+1) at T=60.001s
[DarraRT] SMI CNT core0 = 14 (+1) at T=120.002s
判定规则:
- 每分钟增量 = 0 → 优秀 (BIOS 已做好)
- 每分钟增量 1 ~ 5 → 可接受 (大部分 PC)
- 每分钟增量 > 10 → 差, 换 BIOS 或换主板
BIOS 强制设置清单
以下 BIOS 项必须手工确认 (每家 BIOS 名称不同, 功能等价即可):
| BIOS 项 | 目标值 | 原因 |
|---|---|---|
| CPU C-States | Disabled | C1/C3/C6 进出延迟 |
| Enhanced SpeedStep | Disabled | 动态变频 |
| Turbo Boost | Disabled | 动态变频 |
| Hyper-Threading | Disabled | 逻辑核抢 L1/L2 |
| USB Legacy Support | Disabled | USB SMI |
| Thermal Throttling | Disabled 或调高阈值 | 降频 |
| ErP / Wake on LAN | Disabled | PCIe 唤醒 SMI |
| Fan Control | Full Speed | 避免变速 SMI |
| TPM | 根据需要 | 可能 SMI |
| Watchdog | 根据需要 | IT IRQ 抖动 |
调整后建议运行 DarraRT.sys 自带基线测试, 输出 baseline_<BIOS>.log。
核心隔离原理
启用核心隔离
管理员 PowerShell:
bcdedit /set {current} numproc 4 # 只让 OS 用 4 核
# 或更新 Windows 后可用 ProcessorGroup
然后 DarraRT Service 启动时, 通过 IOCTL_DARRT_ISOLATE_CORE 通知 DarraRT.sys
把指定核标为隔离核:
[DarraRT] ISOLATE CORE mask=0x30 (core4,5)
[DarraRT] Redirecting all IRQ affinity away from 0x30 ... done
[DarraRT] Detaching DPC from 0x30 ... done
[DarraRT] Core isolation active
隔离核的工作方式
- 隔离核由
DarraRT_Eth.sys的 PDO 线程独占 - 无 Windows 调度器干预 (完全忙等)
- 任务管理器显示 100% 是正确状态
WPA上隔离核的时间线空空如也 = 优秀
验证隔离是否生效
诊断 → 实时 → 隔离核监视
core4: PLC 任务 ✓ (100% 忙等)
core5: EtherCAT PDO ✓ (100% 忙等)
最近 60s 其他进程占用隔离核:
0 次 <-- 合格
3 次 <-- 不合格, 有 DPC 漏网
诊断步骤 (测量)
步骤 1: 启用高精度抖动测量
IDE → 诊断 → 抖动测量 → 开始
· 周期: 1ms
· 时长: 60 秒
· 采样: 60 000 点
· 基准: TSC
步骤 2: 查看结果
抖动分布 (μs) 数量 累积占比
0 ~ 5 58 532 97.55%
5 ~ 10 1 312 99.73%
10 ~ 20 152 99.99%
20 ~ 50 4 100.00%
50 ~ 100 0
100+ 0
p50 (中位) = 2.1 μs
p95 = 4.8 μs
p99 = 7.3 μs
p99.9 = 14.5 μs
max = 32.1 μs
判定规则:
| 级别 | p99 | max | 适用 |
|---|---|---|---|
| 优秀 | < 10μs | < 30μs | 高精度机器人 |
| 良好 | < 20μs | < 50μs | 通用 PLC |
| 可用 | < 50μs | < 200μs | 非高速应用 |
| 不达标 | > 100μs | > 500μs | 不可投产 |
步骤 3: 长尾分析
p50 低、max 高 → 长尾问题, 通常由偶发事件引起。打开时序图视图:
抖动(μs)
|
50| ●
|
20| ●
|
5| ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
|___________________________________________________
0 15 30 60 t(s)
每个孤立高点都要定位。鼠标点击高点, 右侧显示详情:
抖动点 @ t=15.32s, 值 = 52.8μs
该时刻 SMI 计数: +1 <-- 根因!
步骤 4: WPA 深度分析
导出 .etl 文件, 用 WPA 打开, 看 Generic Events → DarraRT Jitter, 与
CPU Usage (Precise) 同屏对比。高抖动点在 CPU 图上通常能看到一个陌生 DPC 或
某内核线程短暂抢占。
诊断步骤 (优化)
步骤 1: 关闭所有 C-State (最大单项提升)
BIOS 层关闭后, 用以下命令再关一次 OS 层:
powercfg -setacvalueindex SCHEME_CURRENT SUB_PROCESSOR PROCTHROTTLEMAX 100
powercfg -setacvalueindex SCHEME_CURRENT SUB_PROCESSOR PROCTHROTTLEMIN 100
powercfg -setacvalueindex SCHEME_CURRENT SUB_PROCESSOR IDLEDISABLE 1
powercfg -setactive SCHEME_CURRENT
步骤 2: 固定 CPU 频率
# 确认频率固定
Get-CimInstance Win32_Processor | Select-Object CurrentClockSpeed, MaxClockSpeed
# 两者应相等
步骤 3: 中断亲和性
# 看 EtherCAT 网卡中断目前在哪个核
Get-NetAdapterRss -Name "EtherCAT"
# DarraRT Service 会自动把 EtherCAT NDIS 中断亲和到隔离核
# 手动验证: Get-NetAdapterAdvancedProperty
步骤 4: 锁定工作集页面
Service 在启动时对关键 buffer 调用 VirtualLock, 防止换页:
诊断 → 实时 → 工作集锁定状态
PLC VM (16MB): 已锁 ✓
GlobalIO : 已锁 ✓
PDO Buffer : 已锁 ✓
步骤 5: 调整 Timer 分辨率
# 不需要: DarraRT 不依赖 Windows Timer, 但建议不做 timeBeginPeriod(1) 干扰
异常模式速查表
| 现象 | 根因 | 定位方法 | 解决 |
|---|---|---|---|
| max > 500μs, 周期性 | SMI | SMI 计数器递增 | BIOS 关 USB Legacy |
| max > 100μs, 偶发 | DPC 抢占 | WPA DPC 统计 | 中断亲和 |
| p99 > 50μs | CPU 变频 | 频率不固定 | 关 SpeedStep |
| 所有点都 > 20μs | 未启用隔离核 | 隔离状态未激活 | 检查 bcdedit |
| max 10s 突然飙高 | 日志写盘 | 磁盘 IO 峰值 | 日志异步 / SSD |
| max 每 60s 一次 | 防病毒扫描 | 扫描计划 | 排除 DarraRT 目录 |
| p50 > 10μs | 时钟源错 | 检查 TSC | 确认 Invariant TSC |
| 整体右移 | 持续后台任务 | Process Explorer | 停掉 Windows Search 等 |
推荐硬件配置
| 部件 | 推荐 | 备注 |
|---|---|---|
| CPU | Intel i7-12700K+ / Xeon E-2300 | 有 Invariant TSC |
| 主板 | 工控级 (研华 / 研扬 / Congatec) | BIOS 可调 |
| 内存 | DDR4 ECC, 单 Rank 优先 | 避免刷新抖动 |
| SSD | NVMe Enterprise | 日志写不卡 |
| 网卡 | Intel i210 / i350 / X710 | NDIS 稳 |
| 电源 | 工业 24V, 带 UPS | 抖动少 |
高级技巧
- 抖动录像: Service 支持 24x7 连续记录抖动数据到
jitter_*.csv, 日后可用 pandas 做长期统计。 - 退化告警: 当 p99 超过阈值 (默认 20μs) 持续 10 秒, Service 会触发报警并自动保存
最近 1 分钟的 WPA
.etl快照, 便于事后分析。 - 双基线对比: 先跑"关全部实时优化"的 baseline, 再跑"全部优化开"的 baseline, 两者差值就是优化空间。
- Hyper-V 陷阱: 启用 Hyper-V 后所有 OS 运行在虚拟化层上, 抖动会恶化 1~2 个数量级。
必须
bcdedit /set hypervisorlaunchtype off。
相关文档
