稳定性与实时性能
抖动测试总是比别人差怎么办?
抖动(Jitter)是影响 EtherCAT 实时性能的关键指标。如果你的系统在抖动测试中表现不佳,按以下顺序逐步优化:
1. 精简系统
移除一切非必要的驱动,后台程序和服务,减少 CPU 被抢占的概率。
使用批量克隆方式分发设备副本
Windows:
- 使用 NTLite/组策略/DISM 在 IoT Enterprise LTSC 等精简版本 再次进行精简
- 最终系统只保留 .NET 运行时 + 网卡驱动 + 应用程序 + 必要驱动
- 启动时直接启动应用 , 不启动资源管理器
Linux:
- 使用最小化安装,不安装桌面环境
- 禁用不必要的服务
- 使用 PREEMPT_RT 实时内核补丁
- 通过
isolcpus内核参数隔离 CPU 核心给 EtherCAT 专用
2. 关闭 CPU 电源管理
CPU 节能功能会导致核心从低功耗状态唤醒时产生额外延迟(数十到数百微秒)。
BIOS 设置:
- 禁用 C-States(C1E、C3、C6 等深度睡眠状态)
- 禁用 SpeedStep(Intel)/ Cool'n'Quiet(AMD)
- 设置 CPU 性能模式为 Maximum Performance
Windows 系统层:
:: 禁用动态时钟
bcdedit /set disabledynamictick yes
bcdedit /set useplatformtick yes
:: 强制 TSC 同步策略
bcdedit /set tscsyncpolicy enhanced
Linux 内核参数:
# /etc/default/grub 中添加
GRUB_CMDLINE_LINUX="idle=poll processor.max_cstate=0 intel_idle.max_cstate=0"
3. 关闭网卡电源管理
网卡的节能和中断合并功能会直接增加帧收发延迟。
Windows(PowerShell):
# 关闭中断合并 —— 对延迟影响最大
Set-NetAdapterAdvancedProperty -Name "你的网卡" -RegistryKeyword "*InterruptModeration" -RegistryValue 0
# 关闭节能以太网
Set-NetAdapterAdvancedProperty -Name "你的网卡" -RegistryKeyword "*EEE" -RegistryValue 0
# 关闭电源管理
Disable-NetAdapterPowerManagement -Name "你的网卡"
Linux:
# 关闭中断合并
sudo ethtool -C eth0 rx-usecs 0 tx-usecs 0
# 关闭节能
sudo ethtool --set-eee eth0 eee off
# 固定网卡速率,关闭自协商
sudo ethtool -s eth0 speed 1000 duplex full autoneg off
4. 尽可能管理系统调度
将 NIC 中断和 EtherCAT 线程绑定到同一个核心,避免跨核调度开销。
Windows:
# 关闭 RSS,强制 NIC 中断走固定核心
Set-NetAdapterRss -Name "你的网卡" -Enabled $false
也可以通过注册表绑定中断亲和:
HKLM\SYSTEM\CurrentControlSet\Enum\<设备路径>\Device Parameters\Interrupt Management\Affinity Policy
DevicePolicy = 4 (IrqPolicySpecifiedProcessors)
AssignmentSetOverride = 0x04 (core 2 的掩码)
Linux:
# 隔离 CPU 核心 2、3 给 EtherCAT 专用
# /etc/default/grub
GRUB_CMDLINE_LINUX="isolcpus=2,3 nohz_full=2,3 rcu_nocbs=2,3"
# 绑定 NIC 中断到核心 2
echo 4 > /proc/irq/<网卡IRQ号>/smp_affinity
# 绑定 EtherCAT 进程到核心 2
taskset -c 2 ./your-application
5. 消除 NMI / SMI 干扰(Linux 进阶)
即使使用了 isolcpus + local_irq_save,仍有两类中断无法被操作系统屏蔽:
NMI(不可屏蔽中断)
local_irq_save 只能屏蔽普通 IRQ,NMI 会穿透它。通过内核参数可消除主要来源:
# /etc/default/grub 追加
GRUB_CMDLINE_LINUX="nmi_watchdog=0 nosoftlockup"
nmi_watchdog=0— 关闭 NMI 看门狗(最常见的 NMI 来源)nosoftlockup— 关闭 softlockup 检测器
剩余的 NMI 来源(MCE 硬件错误)极其罕见,正常运行时几乎不会触发。
SMI(系统管理中断)
SMI 比 NMI 更底层 — CPU 直接进入 SMM 模式执行 BIOS/UEFI 代码,对操作系统完全不可见。一次 SMI 可造成 50μs ~ 数 ms 的延迟尖峰。无论 DarraRT、IgH + Xenomai 还是 RTAI,都无法阻止 SMI。
缓解手段(按效果排序):
| 手段 | 效果 | 说明 |
|---|---|---|
| BIOS 关闭 USB Legacy | 高 | USB 传统模式是最大 SMI 来源,关闭后可消除周期性 SMI |
| BIOS 关闭不必要的 SMI 源 | 高 | 关闭 ACPI 热管理 SMI、电源管理 SMI 等 |
| 禁用深度 C-states | 中 | 内核参数 intel_idle.max_cstate=0 processor.max_cstate=0 |
使用 hwlatdetect 验证 | — | 测量 SMI 残余延迟,确认优化效果 |
# 推荐的完整实时优化内核参数
GRUB_CMDLINE_LINUX="isolcpus=N nohz_full=N rcu_nocbs=N nmi_watchdog=0 nosoftlockup intel_idle.max_cstate=0 processor.max_cstate=0 idle=poll"
经过以上优化后,SMI 残留通常 < 10μs 且频率极低(每秒不到 1 次),对 EtherCAT 周期的实际影响可忽略。
如需彻底消除 SMI,需要定制固件(修改 UEFI 移除所有 SMI handler)或选用无 SMM 机制的平台(部分 ARM/RISC-V)。部分工业主板厂商提供此选项。
上述优化步骤中,常规应用只需完成第 2、3 步(关闭 CPU 和网卡电源管理)即可获得良好的实时性能,无需逐条配置所有参数。
配合 DarraRT 驱动,足以满足包括人形机器人、常规 CNC 在内的 99% 项目场景。
如果高度可靠、高度同步是刚需(如高速多轴插补、安全功能等),建议采用高端 FPGA 板卡方案以获得硬件级确定性。
如需将现有程序移植到类 TwinCAT 软PLC 的完整内核硬实时方案,请联系我们获取定制方案。