1.1.3. Memory Performance
This document describes memory usage for RTI Connext 7.5.0. The goal is to provide an idea of how much memory is used by the libraries and the DDS entities. This document does not provide exact formulas and numbers for every possible configuration of the software.
1.1.3.1. Platforms and Libraries
Our measurements have been gathered for Linux, x64 Ubuntu 20.04, using
RTI Connext Professional release target libraries for x64Linux4gcc7.3.0
.
1.1.3.2. Program Memory
These numbers reflect the memory required to load the dynamic libraries when executing code that includes RTI Connext Professional.
We measured the text size by calling the size
command for each library.
Library |
Size (bytes) |
Text (bytes) |
Data (bytes) |
---|---|---|---|
liblua.so |
265325 |
258981 |
6336 |
libnddsc.so |
7033314 |
6886490 |
140864 |
libnddscore.so |
8597418 |
8493986 |
100224 |
libnddscpp.so |
1832846 |
1764078 |
68048 |
libnddscpp2.so |
1447194 |
1417290 |
24688 |
libnddsctesthelpers.so |
6303326 |
6042886 |
245240 |
libnddsjava.so |
899703 |
886647 |
10472 |
libnddsmetp.so |
113628 |
110004 |
2992 |
libnddsrwt.so |
1762 |
1306 |
452 |
libnddsspy.so |
329992 |
320208 |
9776 |
libnddstransporttcp.so |
274673 |
269021 |
5636 |
librtiapputilsc.so |
56863 |
54039 |
1936 |
librticlouddiscoveryservice.so |
1872147 |
1808659 |
61064 |
librticollectorservice.so |
2121934 |
2003654 |
58048 |
librticonnextmsgc.so |
61232 |
56300 |
4140 |
librticonnextmsgcpp.so |
152219 |
146715 |
5496 |
librticonnextmsgcpp2.so |
214960 |
207496 |
6368 |
librtiddsconnector.so |
473240 |
462296 |
10936 |
librtiddsconnectorlua.so |
213856 |
208360 |
5488 |
librtiddstypeutils.so |
15521931 |
15277931 |
234840 |
librtidlc.so |
529254 |
506058 |
22148 |
librtidlcpp.so |
16785 |
15669 |
1100 |
librtidlcpp2.so |
177038 |
168774 |
8184 |
librtijniroutingservice.so |
15661 |
14837 |
816 |
librtilbedisc.so |
65243 |
62587 |
2648 |
librtilbpdisc.so |
252022 |
241150 |
10528 |
librtilbrtps.so |
33187 |
31571 |
1612 |
librtilvdds.so |
23508395 |
22879667 |
593840 |
librtimonitoring.so |
7238694 |
6879014 |
334992 |
librtimonitoring2.so |
5473851 |
4984939 |
453704 |
librtipersistenceservice.so |
1235497 |
1206645 |
28068 |
librtiqueuingservicecore.so |
1891117 |
1841021 |
47680 |
librtirecordingservicecore.so |
8038526 |
7794810 |
203468 |
librtiroutingservice.so |
3916536 |
3810320 |
101360 |
librtirsassigntransf.so |
35997 |
34565 |
1424 |
librtirsinfrastructure.so |
25562 |
22978 |
2040 |
librtirsjniadapter.so |
102881 |
99681 |
2648 |
librtiserviceadmincpp.so |
339235 |
302379 |
27984 |
librtisqlite.so |
1305995 |
1260179 |
42936 |
librtistorageutils.so |
196871 |
190815 |
4288 |
librtitest.so |
45040 |
42524 |
1324 |
librtixml2.so |
1979125 |
1925197 |
48008 |
librtizrtps.so |
221652 |
215136 |
6484 |
openssl-3.0/libnddslightweightsecurity.so |
466807 |
||
openssl-3.0/libnddssecurity.so |
961692 |
||
openssl-3.0/libnddstls.so |
37701 |
||
wolfssl-5.5/libnddslightweightsecurity.so |
458567 |
||
wolfssl-5.5/libnddssecurity.so |
905101 |
Note
The libraries tested are the release versions. These can be found in the
<$NDDSHOME>/lib/<$ARCHITECTURE>
folder.
1.1.3.3. Heap Usage of Connext Entities
RTI has designed and implemented a benchmark application that measures the memory
that is directly allocated by the middleware using malloc()
. Additionally,
the Connext libraries also request the OS to allocate other memory, including:
Socket buffers (see RTI Transports)
Shared memory regions (see RTI Transports)
Thread stacks (see see RTI Threads)
All the memory allocated by the OS can be tuned using QoS parameters or DDS transport properties.
The following tables report the average heap allocation for the different DDS entities that can be used in a Connext application.
The amount of memory required for an entity depends on the value of different QoS policies. For this benchmark, RTI has used a QoS profile that minimizes the memory usage. The profile is provided in a separate XML file and is described in Minimum QoS Settings.
Entity |
Size (Bytes) |
---|---|
Participant |
2005358 |
Type |
1467 |
Topic |
2630 |
Subscriber |
9584 |
Publisher |
3792 |
DataReader |
75604 |
DataWriter |
45757 |
Instances |
664 |
Sample |
1403 |
Remote DR |
8031 |
Remote DW |
16004 |
The memory reported for samples and instances does not include the user data, only the meta-data.
Note
To efficiently manage the creation and deletion of DDS entities and samples, Connext implements its own memory manager. The memory manager allocates and manages multiple buffers to avoid continuous memory allocation. Therefore, the memory growth does not necessarily follow linearly with the creation of DDS entities and samples. The pre-allocation scheme of the memory manager is configurable.
1.1.3.4. RTI Threads
Note
This section is not available in 7.5.0. Refer to the RTI Threads 7.3.0 section to see the latest updated numbers for these tests.
1.1.3.5. RTI Transports
Note
This section is not available in 7.5.0. Refer to the RTI Transports 7.3.0 section to see the latest updated numbers for these tests.
1.1.3.6. Minimum QoS Settings
To obtain the results mentioned above, we used the MinimalMemoryFootPrint
profile, included in the builtin profiles. This profile minimizes the use of memory,
and can be seen below:
<domain_participant_qos>
<transport_builtin>
<mask>UDPv4</mask>
</transport_builtin>
<discovery_config>
<publication_reader_resource_limits>
<initial_samples>1</initial_samples>
<max_samples>LENGTH_UNLIMITED</max_samples>
<max_samples_per_read>1</max_samples_per_read>
<dynamically_allocate_fragmented_samples>true</dynamically_allocate_fragmented_samples>
<initial_infos>1</initial_infos>
<initial_outstanding_reads>1</initial_outstanding_reads>
<initial_fragmented_samples>1</initial_fragmented_samples>
</publication_reader_resource_limits>
<subscription_reader_resource_limits>
<initial_samples>1</initial_samples>
<max_samples>LENGTH_UNLIMITED</max_samples>
<max_samples_per_read>1</max_samples_per_read>
<dynamically_allocate_fragmented_samples>true</dynamically_allocate_fragmented_samples>
<initial_infos>1</initial_infos>
<initial_outstanding_reads>1</initial_outstanding_reads>
<initial_fragmented_samples>1</initial_fragmented_samples>
</subscription_reader_resource_limits>
<participant_reader_resource_limits>
<initial_samples>1</initial_samples>
<max_samples>LENGTH_UNLIMITED</max_samples>
<max_samples_per_read>1</max_samples_per_read>
<dynamically_allocate_fragmented_samples>true</dynamically_allocate_fragmented_samples>
<initial_infos>1</initial_infos>
<initial_outstanding_reads>1</initial_outstanding_reads>
<initial_fragmented_samples>1</initial_fragmented_samples>
</participant_reader_resource_limits>
</discovery_config>
<resource_limits>
<transport_info_list_max_length>0</transport_info_list_max_length>
<local_writer_allocation>
<incremental_count>1</incremental_count>
<initial_count>1</initial_count>
<max_count>LENGTH_UNLIMITED</max_count>
</local_writer_allocation>
<local_reader_allocation>
<incremental_count>1</incremental_count>
<initial_count>1</initial_count>
<max_count>LENGTH_UNLIMITED</max_count>
</local_reader_allocation>
<local_publisher_allocation>
<incremental_count>1</incremental_count>
<initial_count>1</initial_count>
<max_count>LENGTH_UNLIMITED</max_count>
</local_publisher_allocation>
<local_subscriber_allocation>
<incremental_count>1</incremental_count>
<initial_count>1</initial_count>
<max_count>LENGTH_UNLIMITED</max_count>
</local_subscriber_allocation>
<local_topic_allocation>
<incremental_count>1</incremental_count>
<initial_count>1</initial_count>
<max_count>LENGTH_UNLIMITED</max_count>
</local_topic_allocation>
<remote_writer_allocation>
<incremental_count>1</incremental_count>
<initial_count>1</initial_count>
<max_count>LENGTH_UNLIMITED</max_count>
</remote_writer_allocation>
<remote_reader_allocation>
<incremental_count>1</incremental_count>
<initial_count>1</initial_count>
<max_count>LENGTH_UNLIMITED</max_count>
</remote_reader_allocation>
<remote_participant_allocation>
<incremental_count>1</incremental_count>
<initial_count>1</initial_count>
<max_count>LENGTH_UNLIMITED</max_count>
</remote_participant_allocation>
<matching_writer_reader_pair_allocation>
<incremental_count>1</incremental_count>
<initial_count>1</initial_count>
<max_count>LENGTH_UNLIMITED</max_count>
</matching_writer_reader_pair_allocation>
<matching_reader_writer_pair_allocation>
<incremental_count>1</incremental_count>
<initial_count>1</initial_count>
<max_count>LENGTH_UNLIMITED</max_count>
</matching_reader_writer_pair_allocation>
<ignored_entity_allocation>
<incremental_count>1</incremental_count>
<initial_count>1</initial_count>
<max_count>LENGTH_UNLIMITED</max_count>
</ignored_entity_allocation>
<content_filter_allocation>
<incremental_count>1</incremental_count>
<initial_count>1</initial_count>
<max_count>LENGTH_UNLIMITED</max_count>
</content_filter_allocation>
<content_filtered_topic_allocation>
<incremental_count>1</incremental_count>
<initial_count>1</initial_count>
<max_count>LENGTH_UNLIMITED</max_count>
</content_filtered_topic_allocation>
<read_condition_allocation>
<incremental_count>1</incremental_count>
<initial_count>1</initial_count>
<max_count>LENGTH_UNLIMITED</max_count>
</read_condition_allocation>
<query_condition_allocation>
<incremental_count>1</incremental_count>
<initial_count>1</initial_count>
<max_count>LENGTH_UNLIMITED</max_count>
</query_condition_allocation>
<outstanding_asynchronous_sample_allocation>
<incremental_count>1</incremental_count>
<initial_count>1</initial_count>
<max_count>LENGTH_UNLIMITED</max_count>
</outstanding_asynchronous_sample_allocation>
<flow_controller_allocation>
<incremental_count>1</incremental_count>
<initial_count>4</initial_count>
<max_count>LENGTH_UNLIMITED</max_count>
</flow_controller_allocation>
<local_writer_hash_buckets>1</local_writer_hash_buckets>
<local_reader_hash_buckets>1</local_reader_hash_buckets>
<local_publisher_hash_buckets>1</local_publisher_hash_buckets>
<local_subscriber_hash_buckets>1</local_subscriber_hash_buckets>
<local_topic_hash_buckets>1</local_topic_hash_buckets>
<remote_writer_hash_buckets>1</remote_writer_hash_buckets>
<remote_reader_hash_buckets>1</remote_reader_hash_buckets>
<remote_participant_hash_buckets>1</remote_participant_hash_buckets>
<matching_reader_writer_pair_hash_buckets>1</matching_reader_writer_pair_hash_buckets>
<matching_writer_reader_pair_hash_buckets>1</matching_writer_reader_pair_hash_buckets>
<ignored_entity_hash_buckets>1</ignored_entity_hash_buckets>
<content_filter_hash_buckets>1</content_filter_hash_buckets>
<content_filtered_topic_hash_buckets>1</content_filtered_topic_hash_buckets>
<flow_controller_hash_buckets>1</flow_controller_hash_buckets>
<max_gather_destinations>16</max_gather_destinations>
<participant_user_data_max_length>8</participant_user_data_max_length>
<topic_data_max_length>0</topic_data_max_length>
<publisher_group_data_max_length>0</publisher_group_data_max_length>
<subscriber_group_data_max_length>0</subscriber_group_data_max_length>
<writer_user_data_max_length>16</writer_user_data_max_length>
<reader_user_data_max_length>16</reader_user_data_max_length>
<max_partitions>0</max_partitions>
<max_partition_cumulative_characters>0</max_partition_cumulative_characters>
<type_code_max_serialized_length>0</type_code_max_serialized_length>
<type_object_max_deserialized_length>0</type_object_max_deserialized_length>
<type_object_max_serialized_length>0</type_object_max_serialized_length>
<deserialized_type_object_dynamic_allocation_threshold>0</deserialized_type_object_dynamic_allocation_threshold>
<serialized_type_object_dynamic_allocation_threshold>0</serialized_type_object_dynamic_allocation_threshold>
<contentfilter_property_max_length>1</contentfilter_property_max_length>
<participant_property_list_max_length>0</participant_property_list_max_length>
<participant_property_string_max_length>0</participant_property_string_max_length>
<writer_property_list_max_length>0</writer_property_list_max_length>
<writer_property_string_max_length>0</writer_property_string_max_length>
<max_endpoint_groups>0</max_endpoint_groups>
<max_endpoint_group_cumulative_characters>0</max_endpoint_group_cumulative_characters>
<channel_seq_max_length>0</channel_seq_max_length>
<channel_filter_expression_max_length>0</channel_filter_expression_max_length>
<writer_data_tag_list_max_length>0</writer_data_tag_list_max_length>
<writer_data_tag_string_max_length>0</writer_data_tag_string_max_length>
<reader_data_tag_list_max_length>0</reader_data_tag_list_max_length>
<reader_data_tag_string_max_length>0</reader_data_tag_string_max_length>
</resource_limits>
<database>
<initial_weak_references>256</initial_weak_references>
<max_weak_references>1000000</max_weak_references>
<shutdown_cleanup_period>
<sec>0</sec>
<nanosec>100000000</nanosec>
</shutdown_cleanup_period>
</database>
<property inherit="false">
<value>
</value>
</property>
</domain_participant_qos>
<datawriter_qos>
<reliability>
<kind>RELIABLE_RELIABILITY_QOS</kind>
</reliability>
<history>
<kind>KEEP_ALL_HISTORY_QOS</kind>
</history>
<resource_limits>
<initial_instances>1</initial_instances>
<initial_samples>1</initial_samples>
<instance_hash_buckets>1</instance_hash_buckets>
</resource_limits>
</datawriter_qos>
<datareader_qos>
<reliability>
<kind>RELIABLE_RELIABILITY_QOS</kind>
</reliability>
<history>
<kind>KEEP_ALL_HISTORY_QOS</kind>
</history>
<resource_limits>
<initial_instances>1</initial_instances>
<initial_samples>1</initial_samples>
</resource_limits>
<reader_resource_limits>
<max_samples_per_read>1</max_samples_per_read>
<initial_infos>1</initial_infos>
<initial_outstanding_reads>1</initial_outstanding_reads>
<initial_remote_writers>1</initial_remote_writers>
<initial_remote_writers_per_instance>1</initial_remote_writers_per_instance>
<initial_fragmented_samples>1</initial_fragmented_samples>
<dynamically_allocate_fragmented_samples>1</dynamically_allocate_fragmented_samples>
<initial_remote_virtual_writers>1</initial_remote_virtual_writers>
<initial_remote_virtual_writers_per_instance>1</initial_remote_virtual_writers_per_instance>
<max_query_condition_filters>0</max_query_condition_filters>
</reader_resource_limits>
</datareader_qos>
<topic_qos>
<resource_limits>
<initial_samples>1</initial_samples>
<initial_instances>1</initial_instances>
<instance_hash_buckets>1</instance_hash_buckets>
</resource_limits>
</topic_qos>
</qos_profile>