跳到主要内容

实时抖动分析

概述

"实时"不是"快", 是"准时"。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 把抖动按来源分为六类, 每一类有独立的检测与抑制手段:

来源量级检测抑制
1SMI 中断10μs ~ 数百μsSMI 计数器BIOS 关 USB Legacy/TPM
2CPU 变频数十μsTSC 频率波动关 SpeedStep/Turbo 或强制最高频
3共享核抢占数μs ~ msWPA CPU 图核心隔离
4缓存抖动百 ns ~ μs硬件计数器隔离核独占 L2 / L3
5中断聚合数 μsDPC 统计亲和到非隔离核
6分页/TLB Miss百 ns ~ 数μsPage 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-StatesDisabledC1/C3/C6 进出延迟
Enhanced SpeedStepDisabled动态变频
Turbo BoostDisabled动态变频
Hyper-ThreadingDisabled逻辑核抢 L1/L2
USB Legacy SupportDisabledUSB SMI
Thermal ThrottlingDisabled 或调高阈值降频
ErP / Wake on LANDisabledPCIe 唤醒 SMI
Fan ControlFull 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

判定规则:

级别p99max适用
优秀< 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, 周期性SMISMI 计数器递增BIOS 关 USB Legacy
max > 100μs, 偶发DPC 抢占WPA DPC 统计中断亲和
p99 > 50μsCPU 变频频率不固定关 SpeedStep
所有点都 > 20μs未启用隔离核隔离状态未激活检查 bcdedit
max 10s 突然飙高日志写盘磁盘 IO 峰值日志异步 / SSD
max 每 60s 一次防病毒扫描扫描计划排除 DarraRT 目录
p50 > 10μs时钟源错检查 TSC确认 Invariant TSC
整体右移持续后台任务Process Explorer停掉 Windows Search 等

推荐硬件配置

部件推荐备注
CPUIntel i7-12700K+ / Xeon E-2300Invariant TSC
主板工控级 (研华 / 研扬 / Congatec)BIOS 可调
内存DDR4 ECC, 单 Rank 优先避免刷新抖动
SSDNVMe Enterprise日志写不卡
网卡Intel i210 / i350 / X710NDIS 稳
电源工业 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

相关文档

抖动直方图