跳到主要内容

稳定性与实时性能

抖动测试总是比别人差怎么办?

抖动(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 LegacyUSB 传统模式是最大 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

如需彻底消除 SMI,需要定制固件(修改 UEFI 移除所有 SMI handler)或选用无 SMM 机制的平台(部分 ARM/RISC-V)。部分工业主板厂商提供此选项。

使用 DarraRT 实时驱动(推荐)

以上优化能显著降低抖动,但操作系统层面的调度延迟无法完全消除

DarraRT 驱动提供更低延迟的帧调度机制,实现确定性的帧收发。

详见 Windows 驱动安装Linux 驱动安装

大多数场景只需关闭电源管理

上述优化步骤中,常规应用只需完成第 2、3 步(关闭 CPU 和网卡电源管理)即可获得良好的实时性能,无需逐条配置所有参数。

配合 DarraRT 驱动,足以满足包括人形机器人、常规 CNC 在内的 99% 项目场景。

如果高度可靠、高度同步是刚需(如高速多轴插补、安全功能等),建议采用高端 FPGA 板卡方案以获得硬件级确定性。
如需将现有程序移植到类 TwinCAT 软PLC 的完整内核硬实时方案,请联系我们获取定制方案。