Performance / Latency / CPU

Back to overview

The pain

Beyond outright failures, DDS in ROS 2 has performance sharp edges (19 reports): large messages blocking unrelated work, latency that gets worse at low publish rates, and CPU/bandwidth spent on traffic that shouldn’t exist.

  • Publishing a large message blocks all callback groups — one big sample stalls the whole executor.
  • Latency increases for low-frequency data (warm-path assumptions).
  • Even alternative middlewares show high latency / lost messages at high publish rates, so this is not unique to one vendor.
  • Stacks send unnecessary packets through the network, burning bandwidth and CPU.

Most recent example

rmw_cyclonedds#559 — “Publishing large message blocks all callback groups” (2026-03-03). A single large publish blocks every callback group — a head-of-line stall that couples unrelated parts of the application through the middleware.

Reference list (most recent)

Date Source Problem
2026-03-03 rmw_cyclonedds#559 Large publish blocks all callback groups
2025-04-12 cyclonedds#2256 Latency increases for low-frequency data
2024-06-07 rmw_zenoh#198 High latency / lost messages at high pub rate (even on Zenoh)
2024-04-19 rmw_cyclonedds#489 Sends unnecessary packets through the network

How ZeroDDS solves it

Low, consistent latency from an event-driven core; large data on its own path so it doesn’t stall everything else.

  • Measured low latency. Round-trip latency on loopback is p50 = 40 µs / p99 = 83 µs (256 B, 200 samples, 0 lost). The number is reproducible from the open latency_ping / latency_pong examples — not a slide.
  • Event-driven, no busy-poll. Receive and wait paths use listeners/condvars/wakers, never spin loops, so there is no “latency gets worse when idle / low-frequency” warm-path artifact and no core burned waiting.
  • Large data on a dedicated fragmentation path. Big samples go through the DATA_FRAG / NACK_FRAG path with explicit caps; they don’t monopolize the small-message fast path, which is the mechanism behind “one large publish blocks everything.”
  • No gratuitous traffic. Multicast-free unicast means packets go to the peers that asked for them — no broadcast discovery chatter consuming bandwidth and CPU on every node.
  • Efficient by construction. Pure Rust, no_std + alloc core (~1.6 MB on Cortex-M4F) — the same code path from MCU to server, without a garbage collector or a heavyweight runtime.

Honest status: the loopback latency, WiFi throughput (10.8 MiB/s) and scaling numbers are verified. Head-to-head latency/throughput comparison tables against each vendor on identical hardware are still being produced — that is exactly the kind of measurement we want open-source validators to run and publish.

Why it no longer has to be a pain

The performance cluster is coupling (large data stalling small data), warm-path assumptions (idle latency), and gratuitous traffic. ZeroDDS keeps paths decoupled, stays event-driven, and only sends unicast to real peers — so performance is predictable rather than full of sharp edges.

Reproduce it yourself

# Loopback RTT distribution (p50/p90/p99), 256 B, 200 samples:
crates/dcps/examples/latency_ping   # + latency_pong

Back to overview · Next: Migration

Performance / Latenz / CPU

Zurück zur Übersicht

Der Schmerz

Jenseits von Totalausfällen hat DDS in ROS 2 scharfe Performance-Kanten (19 Reports): große Nachrichten, die unverwandte Arbeit blockieren, Latenz, die bei niedrigen Publish-Raten schlechter wird, und CPU/Bandbreite, die für Traffic verbraucht werden, der nicht existieren sollte.

  • Das Publizieren einer großen Nachricht blockiert alle Callback-Groups — ein großes Sample stallt den ganzen Executor.
  • Latenz steigt für niederfrequente Daten (Warm-Path-Annahmen).
  • Selbst alternative Middlewares zeigen hohe Latenz / verlorene Nachrichten bei hohen Publish-Raten, das ist also nicht auf einen Vendor beschränkt.
  • Stacks senden unnötige Pakete durchs Netz und verbrennen Bandbreite und CPU.

Jüngstes Beispiel

rmw_cyclonedds#559 — „Publishing large message blocks all callback groups” (2026-03-03). Ein einziges großes Publish blockiert jede Callback-Group — ein Head-of-Line-Stall, der unverwandte Teile der Anwendung durch die Middleware koppelt.

Referenzliste (jüngste zuerst)

Datum Quelle Problem
2026-03-03 rmw_cyclonedds#559 Großes Publish blockiert alle Callback-Groups
2025-04-12 cyclonedds#2256 Latenz steigt für niederfrequente Daten
2024-06-07 rmw_zenoh#198 Hohe Latenz / verlorene Nachrichten bei hoher Pub-Rate (sogar auf Zenoh)
2024-04-19 rmw_cyclonedds#489 Sendet unnötige Pakete durchs Netz

Wie ZeroDDS es löst

Niedrige, konsistente Latenz aus einem event-getriebenen Kern; Large-Data auf eigenem Pfad, sodass es nicht alles andere stallt.

  • Gemessene niedrige Latenz. Roundtrip-Latenz auf Loopback ist p50 = 40 µs / p99 = 83 µs (256 B, 200 Samples, 0 verloren). Die Zahl ist aus den offenen latency_ping- / latency_pong-Examples reproduzierbar — kein Slide.
  • Event-getrieben, kein Busy-Poll. Empfangs- und Warte-Pfade nutzen Listener/Condvars/Waker, nie Spinloops, sodass es kein „Latenz wird schlechter im Idle / niederfrequent”-Warm-Path-Artefakt und keinen verbrannten Kern beim Warten gibt.
  • Large-Data auf einem dedizierten Fragmentierungs-Pfad. Große Samples gehen durch den DATA_FRAG- / NACK_FRAG-Pfad mit expliziten Caps; sie monopolisieren nicht den Small-Message-Fast-Path, was der Mechanismus hinter „ein großes Publish blockiert alles” ist.
  • Kein gratuiter Traffic. Multicast-frei Unicast bedeutet, dass Pakete an die Peers gehen, die sie angefragt haben — kein Broadcast-Discovery-Chatter, der Bandbreite und CPU auf jedem Node verbraucht.
  • Effizient by construction. Pure-Rust, no_std + alloc-Kern (~1,6 MB auf Cortex-M4F) — derselbe Code-Pfad vom MCU bis zum Server, ohne Garbage-Collector oder schwergewichtige Runtime.

Ehrlicher Status: die Loopback-Latenz, der WiFi-Durchsatz (10,8 MiB/s) und die Scaling-Zahlen sind verifiziert. Head-to-head-Latenz-/Durchsatz-Vergleichstabellen gegen jeden Vendor auf identischer Hardware werden noch produziert — genau die Art Messung, die wir Open-Source-Validatoren fahren und publizieren sehen wollen.

Warum es kein Schmerz mehr sein muss

Der Performance-Cluster ist Kopplung (Large-Data stallt Small-Data), Warm-Path-Annahmen (Idle-Latenz) und gratuiter Traffic. ZeroDDS hält Pfade entkoppelt, bleibt event-getrieben und sendet nur Unicast an echte Peers — sodass Performance vorhersehbar ist statt voller scharfer Kanten.

Selbst reproduzieren

# Loopback-RTT-Verteilung (p50/p90/p99), 256 B, 200 Samples:
crates/dcps/examples/latency_ping   # + latency_pong

Zurück zur Übersicht · Weiter: Migration