Skip to main content
Version: 1.1.1

Diagnosing timing

Real-time EtherCAT depends on tight, predictable timing. The diag command group helps you measure how well your machine holds that timing and soak-test your CPU isolation. It has three subcommands: jitter, stress, and probe.

jitter and probe run on the isolated RT core at SCHED_FIFO priority inside the lxmaster-rt.slice cgroup, while stress deliberately loads only the non-RT cores so it never touches that core.

Measure wake-up latency​

Start by checking the wake-up latency your host achieves on the isolated CPU:

sudo lxmaster diag jitter

This runs cyclictest on your real-time CPU and summarizes the result.

What you'll see: a short report with the minimum, average, and maximum wake-up latency (in µs), the priority and interval used, the sample count, whether the kernel is PREEMPT_RT, and the path to a full log file:

=== LXMASTER RT jitter (cyclictest) ===
CPU 3
Priority 49
Interval 1000 µs
Samples 60000
PREEMPT_RT 1
Log /tmp/lxmaster-cyclictest-20260713-150501.log

Min latency 2 µs
Avg latency 3 µs
Max latency 9 µs

Lower and tighter numbers are better; the max is what matters most for real-time work. What counts as "good enough" depends on your hardware, kernel, and cycle time, so compare runs on your own machine rather than against a fixed target.

tip

Run for a fixed time instead of a sample count with --duration (for example --duration 5m), add --histogram 100 to see the latency distribution, or use --quiet for a one-line summary.

Prove that CPU isolation holds​

Good numbers on an idle machine are easy. To prove isolation works, load every other CPU while jitter runs. In one terminal, start the jitter test:

sudo lxmaster diag jitter

In a second terminal, saturate all the other CPUs for two minutes:

lxmaster diag stress --duration 120s

What you'll see: if isolation is working, the jitter numbers in the first terminal stay flat even while the rest of the machine is fully loaded.

Find a safe cycle time​

diag probe measures how well your host and bus can hold a given cycle, without ever driving a device. It brings the bus up to SAFE-OP (drives stay disabled), sweeps a range of candidate cycle times, and tells you which ones are safe.

It needs your ENI file, since that describes the devices and whether distributed clocks are used:

sudo lxmaster diag probe --eni network.eni.xml

What you'll see: host scheduler jitter and, on a live bus, DC-phase error for each candidate cycle, followed by a recommendation table that marks each cycle OK, RISK, or UNSAFE. Use it to choose (or confirm) the cycle time you pass to eni gen.

By default it tries a spread of common cycles (10 ms down to 250 µs) plus the cycle configured in your ENI. To test specific periods, pass a comma-separated list:

sudo lxmaster diag probe --eni network.eni.xml --cycle-ns 1000000,500000,250000
tip

Distributed-clock drives enforce a sync-error window that the ENI does not record. If you know it from your drive's datasheet, pass it with --sync-tolerance-us (for example --sync-tolerance-us 6) so the verdict reflects your hardware.