What is the maximum message size supported by RTI Connext 4.x and above?
Note: Applies to RTI Connext 4.x and above.
Prior to RTI Data Distribution Service 4.1d, the maximum message size supported by RTI Data Distribution Service was determined by the installed transports. Each transport may impose a maximum message size. The maximum message size supported by a transport is configured using the transport properties.
Starting with 4.1d, the 'large data' feature is supported. When the middleware needs to send data which is larger than the maximum data size supported by the transport, the middleware will automatically fragment the sample. Upon receiving all fragments, the middleware will automatically reassemble the fragments into one large data sample. Only when all fragments have been received will the data sample be provided to the user application.
For example, when sending a 1Mbyte file over UDP, the sample will be fragmented based on the maximum message set in the UDP transport. By default this is 9K. However, depending on the operating system, the UDP transport settings can be increased to about 64K fragments. To improve throughput, it is important to configure the transport to the maximum supported on your platform.
When sending the same data using multiple transports, the smallest limit among all the transports applies and a large data sample will be fragmented based upon the smallest limit.
RTI Connext 4.x and above installs two transports by default: UDPv4 and shared memory. The default transport properties limit the maximum message size to 9K. To increase this limit, you must modify the transport properties.
Note that it may not be possible to increase the maximum message size property to an arbitrary limit. The UDPv4 protocol, for example, limits the size of a single message to 64K. Hence, the UDPv4 transport cannot support messages larger than 64K. There is no built-in limitation to the maximum message size over shared memory.
Increasing the maximum message size property
To increase the maximum message size property, follow the instructions in the online (HTML) documentation (select Modules, Programming How-To's, Transport Use Cases).
For example, to increase the maximum message size supported by the built-in UDPv4 transport to 64K, use the following code snippet to modify the transport properties:
property.parent.message_size_max = 65535; property.recv_socket_buffer_size = 65535; property.send_socket_buffer_size = 65535;
In addition to changing the transport properties, you must also configure the maximum buffer size that will be loaned to the transport by the RTI Connext receive threads. This buffer is used by the transport to copy the raw data into, for further processing by RTI Connext (note this does not apply for transports that use zero-copy, as mentioned in the online documentation). The buffer size must be large enough to hold the maximum message size. To change the buffer size, modify the buffer_size in the DomainParticipant's ReceiverPool QoS policy before creating the DomainParticipant. Its default value is 9K. For example:
participant_qos.receiver_pool.buffer_size = 65535;
Attached is an XML file which shows how to specify the properties as part of an XML QoS profile to configure the DomainParticipant and transport properties. (applies to version 4.3 and higher)
<dds> <qos_library name="UDPv4TransportLibrary"> <qos_profile name="DefaultProfile" is_default_qos="true"> <participant_qos> <receiver_pool> <buffer_size>65535</buffer_size> </receiver_pool> <property> <value> <element> <name>dds.transport.UDPv4.builtin.parent.message_size_max</name> <value>65535</value> </element> <element> <name>dds.transport.UDPv4.builtin.send_socket_buffer_size </name> <value>65535</value> </element> <element> <name>dds.transport.UDPv4.builtin.recv_socket_buffer_size</name> <value>65535</value> </element> <element> <name>dds.transport.shmem.builtin.parent.message_size_max</name> <value>65535</value> </element> <element> <name>dds.transport.shmem.builtin.receive_buffer_size</name> <value>65535</value> </element> </value> </property> </participant_qos> </qos_profile> </qos_library> </dds>
If you are using RTI Data Distribution Service 4.3e, you must call DDSTheParticipantFactory->load_profiles()
before creating the DomainParticipant with a profile.
When using RTI Connext 4.4 and above, the XML file can be automatically loaded. If NDDS_QOS_PROFILES.xml is in the $NDDSHOME/resource/xml directory, it will be automatically loaded. Similarly, if USER_QOS_PROFILES.xml is in the working directory, it will be automatically loaded. See theCore Libraries and Utilities User’s Manual for more details on XML file loading.
When using version RTI Connext 4.4 and above, place the attached USER_QOS_PROFILES.xml file in the working directory. It specifies NoMulticastLibrary
as the default QoS profile and will be loaded when your DDS application starts.
Final notes
- If you see the message "
NDDS_Transport_UDPv4_receive_rEA:!precondition
" in the DDS logging output, it likely means thereceiver_pool.buffer_size
is not large enough to hold the maximum message size.
- RTI Connext will add a small amount of overhead to the user data. Therefore, the actual amount of user data that can be sent using RTI Connext in the above example is slightly smaller than 64K.
- Since version 5.0.0, discovery data can be sent using asynchronous writing. For more information about this, please refer to the solution http://community.rti.com/kb/how-send-big-typecodes-and-typeobjects.
Comments
iulianpopescu
Tue, 12/01/2015 - 15:56
Permalink
Sending 1MB of data
I'm trying to pass 1MB of data between a publisher and a subscriber using shared memory and the writer fails with the following message:
REDAFastBufferPool_growEmptyPoolEA: !allocate buffer of 68719745024 bytes
Based on my understanding of the content of this article that shouldn't have been a problem when using shared memory. Could you please help?
Gerardo Pardo
Tue, 12/01/2015 - 18:43
Permalink
This type of error is
This type of error is typically caused by data-types that have a very large "maximum size" combined with resource limits that preallocate many of those samples. This sometimes occurs when you have sequences that recursively nest other sequences. By default RTI Connext DDS will pre-allocate each sequence to its maximum specified size which can soon get very big. This is based on the maximum declared size of teh sequences (or a default if unspecified) even if your sample actually uses small sequence sizes.
The forum thread discusses how to determine if this is the issue and how to overcome it: https://community.rti.com/forum-topic/could-not-create-data-reader
And this section of the user manual discusses an approach using unbounded sequences and additional Qos settings: https://community.rti.com/static/documentation/connext-dds/5.2.0/doc/manuals/connext_dds/html_files/RTI_ConnextDDS_CoreLibraries_UsersManual/index.htm#UsersManual/Sequences.htm?Highlight=unbound
Please take a look at the above to see if it explains what you are seeing and if not maybe post a follow up question on the technical questions forum. I think your question will get more attention there.
Gerardo