Skip to main content

System Limits

This page documents the hard limits and recommended values for HDDS configuration.

Domain & Participant Limits

LimitValueNotes
Domain ID range0-232233 domains max (RTPS spec)
Participants per domain0-119120 participants max
Total participants27,960233 × 120

Stress Test Results

Validated on real hardware:

TestParticipantsTopicsTimeMemoryStatus
Scalability100100011.2s1.3 GB
TestDurationMessagesRateCrashesLeaksStatus
Endurance12 hours4,290,25699.3 msg/s00
Reconnection20 min1000 cycles0.8 cyc/s00
Network partition30s blackout701 totalImmediate recovery00
TCP transportLayer test5+6 msgsBidirectional00

Endurance test memory profile:

  • Initial: 4 MB → Peak: 18 MB → Final: 18 MB
  • Growth: 14 MB over 12 hours = no memory leak

Memory per participant: ~13 MB (includes discovery, history cache, RTPS state)

Memory Planning

For large deployments, estimate memory as:

Total RAM ≈ Participants × 13 MB + Topics × 0.5 MB

Port Ranges

Port TypeFormulaDomain 0, Participant 0
SPDP Multicast7400 + (250 × domainId)7400
SEDP Unicast7410 + (250 × domainId) + (2 × participantId)7410
User Unicast7411 + (250 × domainId) + (2 × participantId)7411
Data Multicast7401 + (250 × domainId)7401

Port range per domain: 7400-7469 (70 ports)

Resource Limits (Default)

ResourceDefaultMaximum
max_samples100,000Platform memory
max_instances1Platform memory
max_samples_per_instance100,000≤ max_samples
max_quota_bytes100 MBPlatform memory

Message Size Limits

LimitValueNotes
Max CDR payload16 MBPer message
Max UDP datagram65,507 bytesFragmented if larger
RTPS fragment size64 KBDefault fragmentation

Discovery Timing

ParameterDefaultAdjustable
SPDP announcement period3 secondsYes
SPDP aggressive phase200 ms × 5First 5 announcements
Participant lease duration30 secondsYes
Lease check interval1 secondInternal

History Limits

ConfigurationConstraint
KEEP_LAST depth> 0
KEEP_ALLLimited by ResourceLimits
Queue validationmax_samples ≥ max_samples_per_instance × max_instances

Identifier Limits

LimitValue
Topic name length256 characters
Type name length256 characters
Partition name256 characters
UserData size64 KB

IDL Limits (hdds_gen)

LimitValue
Identifier length255 characters
Collection nesting depth5 levels
Reserved keywords34 words
Supported annotations26 standard

Shared Memory Transport

Experimental

Shared memory transport is experimental with significant limitations.

ParameterDefault
Ring buffer slots256 (power of 2)
Payload size per slot4 KB
Writer push latency< 200 ns
Reader poll latency< 100 ns

SHM Limitations

LimitationDescription
QoS SupportBestEffort only - no ACK/NACK/retransmission
PlatformsLinux/macOS (POSIX shm_open) - Windows not supported
Data LossPossible overrun if reader is slow (lock-free ring buffer)
Cross-VendorNo interop with other DDS vendors (Iceoryx, RTI SHM)
SecurityCryptoPlugin bypassed on SHM path

When to Use SHM

Good for:

  • High-frequency sensor data (same host)
  • BestEffort acceptable scenarios
  • Maximum performance (< 1μs latency)
  • Single-process / intra-process communication

Not for:

  • Reliable delivery requirements
  • Cross-host communication
  • Mixed vendor environments
  • Security-critical data

Message Fragmentation (DATA_FRAG)

ParameterValue
Default fragment size1024 bytes
Max unfragmented payload8192 bytes (8 KB)
Max reassembly size~64 KB
Fragment buffer timeout10 seconds

Tested Payload Sizes

PayloadFragmentsLatencyStatus
64 B1 (DATA)~1.1 msSupported
16 KB16~1.1 msSupported
64 KB64~2.3 msSupported
128 KB128N/AExceeds buffer
Large Messages

For payloads > 64 KB, consider increasing the fragment buffer size or using a different transport (TCP, QUIC).

Performance Benchmarks

MetricValue
Write latency (best)257 ns
Throughput4.48 M msg/s
Memory (idle)< 100 KB
Memory (per topic)< 50 KB

hdds_viewer Limits

LimitValue
Frame table buffer10,000 messages
Timeline buffer10,000 messages
Undo history100 levels
Write throughput625 MB/s
Ingestion rate41 M msg/s

High Frequency Topics (> 1000 Hz)

use hdds::QoS;

let qos = QoS::best_effort().keep_last(1);

Large Messages (> 64 KB)

use hdds::QoS;
use std::time::Duration;

let qos = QoS::reliable()
.max_blocking_time(Duration::from_secs(5))
.max_quota_bytes(500 * 1024 * 1024); // 500 MB

Many Instances (> 1000)

use hdds::QoS;

let qos = QoS::reliable()
.max_instances(10_000)
.max_samples_per_instance(10)
.max_samples(100_000);