Shared Memory¶
The following tests have been performed by executing the RTI Perftest C++98 benchmark application between two applications within the same node. The communication has been set to use Shared Memory (SHMEM).
Find the information about the hardware, network and command-line parameters after each of the tests.
Unkeyed, Shared Memory, C++98¶
The graph below shows the one-way latency without load between a Publisher and a Subscriber running in two processes within a single node. The numbers are for best-effort as well as strict reliable reliability scenarios.
Note
We use the median (50th percentile) instead of the average in order to get a more stable measurement that does not account for spurious outliers. We also calculate the average value and other percentile values, which can be seen in the Detailed Statistics section below.
Detailed Statistics
The following tables contain the raw numbers presented by RTI Perftest. These numbers are the exact output with no further processing.
Best Effort
Sample Size (Bytes) |
Avg (μs) |
Std (μs) |
Min (μs) |
Max (μs) |
50% (μs) |
90% (μs) |
99% (μs) |
99.99% (μs) |
99.9999% (μs) |
---|---|---|---|---|---|---|---|---|---|
32 |
10 |
0.5 |
9 |
34 |
9 |
10 |
11 |
17 |
29 |
64 |
10 |
0.6 |
9 |
36 |
9 |
10 |
11 |
17 |
29 |
128 |
10 |
0.5 |
9 |
31 |
9 |
10 |
11 |
17 |
31 |
256 |
10 |
0.5 |
9 |
36 |
9 |
10 |
11 |
17 |
31 |
512 |
10 |
0.4 |
9 |
35 |
9 |
10 |
11 |
17 |
30 |
1024 |
10 |
0.4 |
9 |
41 |
9 |
10 |
11 |
17 |
33 |
8192 |
11 |
0.4 |
10 |
43 |
11 |
11 |
12 |
19 |
39 |
63000 |
18 |
0.9 |
17 |
91 |
18 |
19 |
21 |
58 |
91 |
Reliable
Sample Size (Bytes) |
Avg (μs) |
Std (μs) |
Min (μs) |
Max (μs) |
50% (μs) |
90% (μs) |
99% (μs) |
99.99% (μs) |
99.9999% (μs) |
---|---|---|---|---|---|---|---|---|---|
32 |
11 |
1.2 |
9 |
37 |
11 |
14 |
18 |
21 |
35 |
64 |
11 |
1.1 |
9 |
39 |
11 |
14 |
16 |
22 |
35 |
128 |
11 |
1.3 |
9 |
36 |
11 |
14 |
18 |
21 |
35 |
256 |
11 |
1.2 |
10 |
38 |
11 |
14 |
16 |
22 |
37 |
512 |
11 |
1.2 |
9 |
47 |
11 |
13 |
18 |
21 |
41 |
1024 |
11 |
1.3 |
10 |
146 |
11 |
14 |
18 |
22 |
42 |
8192 |
12 |
1.4 |
11 |
45 |
12 |
14 |
19 |
24 |
45 |
63000 |
22 |
1.7 |
19 |
94 |
21 |
22 |
31 |
69 |
94 |
100000 |
31 |
2.0 |
27 |
166 |
30 |
31 |
40 |
105 |
166 |
500000 |
129 |
39.5 |
89 |
709 |
104 |
178 |
218 |
528 |
709 |
1048576 |
357 |
85.6 |
184 |
1452 |
368 |
378 |
673 |
1015 |
1452 |
1548576 |
571 |
112.0 |
306 |
2132 |
587 |
686 |
843 |
1508 |
2132 |
4194304 |
1684 |
314.3 |
1154 |
5797 |
1866 |
1938 |
1978 |
5797 |
5797 |
10485760 |
3923 |
384.8 |
3849 |
15913 |
3900 |
3930 |
3962 |
15913 |
15913 |
Perftest Scripts
To produce these tests, we executed RTI Perftest for C++98. The exact commands used can be found here:
Publisher Side
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | sudo /set_lat_mode.sh
echo EXECUTABLE IS $1
export executable=$1
echo OUTPUT PATH IS $2
export output_folder=$2
export exec_time=30
export pub_string="-pub \
-transport SHMEM \
-noPrint \
-noOutputHeaders \
-exec $exec_time \
-noXML\
-latencyTest"
mkdir -p $output_folder
echo ">> UNKEYED BE"
export my_file=$output_folder/lat_shmem_pub_unkeyed_be.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="\
$executable -best -datalen $DATALEN $pub_string"
echo $command
$command >> $my_file;
sleep 3;
done
sleep 5;
echo ">> UNKEYED REL"
export my_file=$output_folder/lat_shmem_pub_unkeyed_rel.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000 100000 500000 1048576 1548576 4194304 10485760; do
export command="\
$executable -datalen $DATALEN $pub_string"
echo $command
$command >> $my_file;
sleep 3;
done
sleep 5;
echo ">> KEYED BE"
export my_file=$output_folder/lat_shmem_pub_keyed_be.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="\
$executable -best -keyed -instances 100000 -datalen $DATALEN $pub_string"
echo $command
$command >> $my_file;
sleep 3;
done
sleep 5;
echo ">> KEYED REL"
export my_file=$output_folder/lat_shmem_pub_keyed_rel.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="\
$executable -keyed -instances 100000 -datalen $DATALEN $pub_string"
echo $command
$command >> $my_file;
sleep 3;
done
|
Subscriber Side
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | sudo /set_lat_mode.sh
echo EXECUTABLE IS $1
export executable=$1
echo OUTPUT PATH IS $2
export output_folder=$2
export nic=172.16.0.2
export sub_string="-sub \
-transport SHMEM \
-nic $nic \
-noPrint \
-noOutputHeaders \
-noXML"
mkdir -p $output_folder
echo ">> UNKEYED BE"
export my_file=$output_folder/lat_shmem_sub_unkeyed_be.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="\
$executable -best $sub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 10;
done
sleep 5;
echo ">> UNKEYED REL"
export my_file=$output_folder/lat_shmem_sub_unkeyed_rel.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000 100000 500000 1048576 1548576 4194304 10485760; do
export command="\
$executable $sub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 10;
done
sleep 5;
echo ">> KEYED BE"
export my_file=$output_folder/lat_shmem_sub_keyed_be.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="\
$executable -best -keyed -instances 100000 $sub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 10;
done
sleep 5;
echo ">> KEYED REL"
export my_file=$output_folder/lat_shmem_sub_keyed_rel.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="\
$executable -keyed -instances 100000 $sub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 10;
done
|
Test Hardware
The following hardware was used to perform these tests:
Linux Nodes
Processor: Intel® Xeon® E-2186G 3.8GHz, 12M cache, 6C/12T, turbo (95W)
RAM: 16GB 2666MT/s DDR4 ECC UDIMM
NIC 1: Intel X550 Dual Port 10GbE BASE-T Adapter, PCIe Full Height
NIC 2: Intel Ethernet I350 Dual Port 1GbE BASE-T Adapter, PCIe Low Profile
OS: Ubuntu 18.04 -- gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
Switch
Dell Networking S4048T-ON, 48x 10GBASE-T and 6x 40GbE QSFP+ ports, IO to PSU air, 2x AC PSU, OS9
The graph below shows the expected throughput behavior when performing a 1-1 communication between two processes within a single node. The numbers are for best-effort as well as strict reliable reliability scenarios.
Note
By default, RTI Perftest enables batching when performing a Maximum Throughput test. The batching feature allows sending more than one data sample per RTPS packet, improving network performance for small data sizes. See the RTI Connext DDS Core Libraries User’s Manual for more information on batching.
The batch maximum size is set by RTI Perftest to be 8192 bytes; after 8192 bytes, batching is not enabled.
Detailed Statistics
This table contains the raw numbers presented by RTI Perftest. These numbers are the exact output with no further processing.
Best Effort
Sample Size (Bytes) |
Total Samples |
Avg Samples/s |
Avg Mbps |
Lost Samples |
Lost Samples (%) |
---|---|---|---|---|---|
32 |
100000000 |
5090582 |
1303.2 |
0 |
0.00 |
64 |
100000000 |
4707893 |
2410.4 |
0 |
0.00 |
128 |
100000000 |
4123275 |
4222.2 |
0 |
0.00 |
256 |
96195318 |
3203861 |
6561.5 |
0 |
0.00 |
512 |
66028944 |
2199393 |
9008.7 |
0 |
0.00 |
1024 |
42849257 |
1427264 |
11692.2 |
0 |
0.00 |
8192 |
7658321 |
255087 |
16717.4 |
0 |
0.00 |
63000 |
3983741 |
132692 |
66877.3 |
0 |
0.00 |
Reliable
Sample Size (Bytes) |
Total Samples |
Avg Samples/s |
Avg Mbps |
Lost Samples |
Lost Samples (%) |
---|---|---|---|---|---|
32 |
100000000 |
4794683 |
1227.4 |
0 |
0.00 |
64 |
100000000 |
4442583 |
2274.6 |
0 |
0.00 |
128 |
100000000 |
3695793 |
3784.5 |
0 |
0.00 |
256 |
84308804 |
2807970 |
5750.7 |
0 |
0.00 |
512 |
57629402 |
1919457 |
7862.1 |
0 |
0.00 |
1024 |
34218599 |
1139710 |
9336.5 |
0 |
0.00 |
8192 |
5326602 |
177400 |
11626.1 |
0 |
0.00 |
63000 |
3085047 |
102753 |
51788.0 |
0 |
0.00 |
100000 |
1332510 |
44375 |
35500.6 |
0 |
0.00 |
500000 |
403972 |
13454 |
53818.1 |
0 |
0.00 |
1048576 |
213264 |
7103 |
59584.3 |
0 |
0.00 |
1548576 |
140897 |
4692 |
58138.3 |
0 |
0.00 |
4194304 |
22242 |
740 |
24860.1 |
0 |
0.00 |
10485760 |
7833 |
261 |
21896.5 |
0 |
0.00 |
Perftest Scripts
To produce these tests, we executed RTI Perftest for C++98. The exact commands used can be found here:
Publisher Side
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | sudo /set_thr_mode.sh
echo EXECUTABLE IS $1
export executable=$1
echo OUTPUT PATH IS $2
export output_folder=$2
export exec_time=30
export nic=172.16.0.1
export pub_string="-pub \
-transport SHMEM \
-nic $nic \
-noPrint \
-noOutputHeaders \
-exec $exec_time \
-noXML"
mkdir -p $output_folder
echo ">> UNKEYED BE"
export my_file=$output_folder/thr_shmem_pub_unkeyed_be.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="\
$executable -best $pub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 3;
done
sleep 5;
echo ">> UNKEYED REL"
export my_file=$output_folder/thr_shmem_pub_unkeyed_rel.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000 100000 500000 1048576 1548576 4194304 10485760; do
export command="\
$executable $pub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 3;
done
sleep 5;
echo ">> KEYED BE"
export my_file=$output_folder/thr_shmem_pub_keyed_be.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="\
$executable -best -keyed -instances 100000 $pub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 3;
done
sleep 5;
echo ">> KEYED REL"
export my_file=$output_folder/thr_shmem_pub_keyed_rel.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="\
$executable -keyed -instances 100000 $pub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 3;
done
|
Subscriber Side
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | sudo /set_thr_mode.sh
echo EXECUTABLE IS $1
export executable=$1
echo OUTPUT PATH IS $2
export output_folder=$2
export nic=172.16.0.2
export sub_string="-sub \
-transport SHMEM \
-noPrint \
-noOutputHeaders \
-noXML"
mkdir -p $output_folder
echo ">> UNKEYED BE"
export my_file=$output_folder/thr_shmem_sub_unkeyed_be.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="\
$executable -best $sub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 10;
done
sleep 5;
echo ">> UNKEYED REL"
export my_file=$output_folder/thr_shmem_sub_unkeyed_rel.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000 100000 500000 1048576 1548576 4194304 10485760; do
export command="\
$executable $sub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 10;
done
sleep 5;
echo ">> KEYED BE"
export my_file=$output_folder/thr_shmem_sub_keyed_be.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="\
$executable -best -keyed -instances 100000 $sub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 10;
done
sleep 5;
echo ">> KEYED REL"
touch $my_file
export my_file=$output_folder/thr_shmem_sub_keyed.csv
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="\
$executable -keyed -instances 100000 $sub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 10;
done
|
Test Hardware
The following hardware was used to perform these tests:
Linux Nodes
Processor: Intel® Xeon® E-2186G 3.8GHz, 12M cache, 6C/12T, turbo (95W)
RAM: 16GB 2666MT/s DDR4 ECC UDIMM
NIC 1: Intel X550 Dual Port 10GbE BASE-T Adapter, PCIe Full Height
NIC 2: Intel Ethernet I350 Dual Port 1GbE BASE-T Adapter, PCIe Low Profile
OS: Ubuntu 18.04 -- gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
Switch
Dell Networking S4048T-ON, 48x 10GBASE-T and 6x 40GbE QSFP+ ports, IO to PSU air, 2x AC PSU, OS9
The graph below shows the one-way latency without load between a Publisher and a Subscriber running in two processes within a single node. The numbers are for best-effort as well as strict reliable reliability scenarios.
Note
We use the median (50th percentile) instead of the average in order to get a more stable measurement that does not account for spurious outliers. We also calculate the average value and other percentile values, which can be seen in the Detailed Statistics section below.
Detailed Statistics
The following tables contain the raw numbers presented by RTI Perftest. These numbers are the exact output with no further processing.
Best Effort
Sample Size (Bytes) |
Avg (μs) |
Std (μs) |
Min (μs) |
Max (μs) |
50% (μs) |
90% (μs) |
99% (μs) |
99.99% (μs) |
99.9999% (μs) |
---|---|---|---|---|---|---|---|---|---|
32 |
64 |
4.8 |
59 |
403 |
63 |
65 |
81 |
185 |
403 |
64 |
64 |
4.3 |
60 |
272 |
64 |
65 |
79 |
181 |
272 |
128 |
66 |
6.3 |
61 |
2003 |
65 |
66 |
82 |
187 |
2003 |
256 |
65 |
4.9 |
60 |
283 |
64 |
66 |
87 |
187 |
283 |
512 |
65 |
5.9 |
61 |
1050 |
64 |
66 |
86 |
212 |
1050 |
1024 |
69 |
6.2 |
63 |
1057 |
68 |
70 |
90 |
214 |
1057 |
8192 |
76 |
7.1 |
70 |
467 |
75 |
77 |
95 |
290 |
467 |
63000 |
153 |
20.3 |
141 |
1263 |
151 |
159 |
185 |
918 |
1263 |
Reliable
Sample Size (Bytes) |
Avg (μs) |
Std (μs) |
Min (μs) |
Max (μs) |
50% (μs) |
90% (μs) |
99% (μs) |
99.99% (μs) |
99.9999% (μs) |
---|---|---|---|---|---|---|---|---|---|
32 |
76 |
10.1 |
68 |
1371 |
73 |
89 |
116 |
231 |
1371 |
64 |
78 |
11.6 |
68 |
2054 |
74 |
91 |
118 |
230 |
2054 |
128 |
78 |
10.2 |
69 |
1117 |
74 |
91 |
119 |
229 |
1117 |
256 |
76 |
10.1 |
68 |
310 |
73 |
88 |
122 |
234 |
310 |
512 |
79 |
11.3 |
70 |
2002 |
75 |
94 |
118 |
239 |
2002 |
1024 |
78 |
10.4 |
69 |
307 |
74 |
91 |
120 |
240 |
307 |
8192 |
93 |
13.4 |
80 |
452 |
88 |
110 |
140 |
343 |
452 |
63000 |
187 |
26.2 |
167 |
1363 |
183 |
200 |
254 |
1083 |
1363 |
100000 |
380 |
66.5 |
282 |
2431 |
401 |
434 |
466 |
1699 |
2431 |
500000 |
1222 |
337.8 |
939 |
10626 |
1036 |
1536 |
1622 |
8297 |
10626 |
1048576 |
3927 |
774.9 |
3670 |
22446 |
3805 |
3892 |
7911 |
22446 |
22446 |
1548576 |
5588 |
1154.7 |
5242 |
27957 |
5337 |
5618 |
11364 |
27957 |
27957 |
4194304 |
14518 |
3054.6 |
13573 |
60029 |
13930 |
14340 |
30420 |
60029 |
60029 |
10485760 |
35296 |
7938.9 |
33162 |
123280 |
33994 |
34840 |
75632 |
123280 |
123280 |
Perftest Scripts
To produce these tests, we executed RTI Perftest for C++98. The exact commands used can be found here:
Publisher Side
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | sudo /set_lat_mode.sh
echo EXECUTABLE IS $1
export executable=$1
echo OUTPUT PATH IS $2
export output_folder=$2
export exec_time=30
export pub_string="-pub \
-transport SHMEM \
-noPrint \
-noOutputHeaders \
-exec $exec_time \
-noXML\
-latencyTest"
mkdir -p $output_folder
echo ">> UNKEYED BE"
export my_file=$output_folder/lat_shmem_pub_unkeyed_be.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="\
$executable -best -datalen $DATALEN $pub_string"
echo $command
$command >> $my_file;
sleep 3;
done
sleep 5;
echo ">> UNKEYED REL"
export my_file=$output_folder/lat_shmem_pub_unkeyed_rel.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000 100000 500000 1048576 1548576 4194304 10485760; do
export command="\
$executable -datalen $DATALEN $pub_string"
echo $command
$command >> $my_file;
sleep 3;
done
sleep 5;
echo ">> KEYED BE"
export my_file=$output_folder/lat_shmem_pub_keyed_be.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="\
$executable -best -keyed -instances 100000 -datalen $DATALEN $pub_string"
echo $command
$command >> $my_file;
sleep 3;
done
sleep 5;
echo ">> KEYED REL"
export my_file=$output_folder/lat_shmem_pub_keyed_rel.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="\
$executable -keyed -instances 100000 -datalen $DATALEN $pub_string"
echo $command
$command >> $my_file;
sleep 3;
done
|
Subscriber Side
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | sudo /set_lat_mode.sh
echo EXECUTABLE IS $1
export executable=$1
echo OUTPUT PATH IS $2
export output_folder=$2
export nic=172.16.0.2
export sub_string="-sub \
-transport SHMEM \
-nic $nic \
-noPrint \
-noOutputHeaders \
-noXML"
mkdir -p $output_folder
echo ">> UNKEYED BE"
export my_file=$output_folder/lat_shmem_sub_unkeyed_be.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="\
$executable -best $sub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 10;
done
sleep 5;
echo ">> UNKEYED REL"
export my_file=$output_folder/lat_shmem_sub_unkeyed_rel.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000 100000 500000 1048576 1548576 4194304 10485760; do
export command="\
$executable $sub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 10;
done
sleep 5;
echo ">> KEYED BE"
export my_file=$output_folder/lat_shmem_sub_keyed_be.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="\
$executable -best -keyed -instances 100000 $sub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 10;
done
sleep 5;
echo ">> KEYED REL"
export my_file=$output_folder/lat_shmem_sub_keyed_rel.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="\
$executable -keyed -instances 100000 $sub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 10;
done
|
Test Hardware
The following hardware was used to perform these tests:
Raspberry Pi 4 Model B
Processor: Broadcom BCM2711, Quad core Cortex-A72 (ARM v8) 64-bit SoC @ 1.5GHz
RAM: 4GB LPDDR4-3200 SDRAM
NIC 1: Gigabit Ethernet
OS: Raspbian (x32)
.. Note::
These machines are using the most popular OS in a Raspberry, which is
**Raspbian** (Devian for Raspberry). This however is not the ideal choice
in terms of performance, as it is a 32 bits OS in a 64 bits CPU.
Switch
Dell Networking S4048T-ON, 48x 10GBASE-T and 6x 40GbE QSFP+ ports, IO to PSU air, 2x AC PSU, OS9
The graph below shows the expected throughput behavior when performing a 1-1 communication between two processes within a single node. The numbers are for best-effort as well as strict reliable reliability scenarios.
Note
By default, RTI Perftest enables batching when performing a Maximum Throughput test. The batching feature allows sending more than one data sample per RTPS packet, improving network performance for small data sizes. See the RTI Connext DDS Core Libraries User’s Manual for more information on batching.
The batch maximum size is set by RTI Perftest to be 8192 bytes; after 8192 bytes, batching is not enabled.
Detailed Statistics
This table contains the raw numbers presented by RTI Perftest. These numbers are the exact output with no further processing.
Best Effort
Sample Size (Bytes) |
Total Samples |
Avg Samples/s |
Avg Mbps |
Lost Samples |
Lost Samples (%) |
---|---|---|---|---|---|
32 |
10533573 |
351263 |
89.9 |
0 |
0.00 |
64 |
10212864 |
340207 |
174.2 |
0 |
0.00 |
128 |
9403198 |
313251 |
320.8 |
0 |
0.00 |
256 |
7621508 |
253890 |
520.0 |
0 |
0.00 |
512 |
5857491 |
195127 |
799.2 |
0 |
0.00 |
1024 |
4033616 |
134344 |
1100.6 |
0 |
0.00 |
8192 |
841698 |
28038 |
1837.5 |
61619 |
6.82 |
63000 |
403117 |
13425 |
6766.5 |
0 |
0.00 |
Reliable
Sample Size (Bytes) |
Total Samples |
Avg Samples/s |
Avg Mbps |
Lost Samples |
Lost Samples (%) |
---|---|---|---|---|---|
32 |
11250443 |
374772 |
95.9 |
0 |
0.00 |
64 |
10120192 |
337116 |
172.6 |
0 |
0.00 |
128 |
8847936 |
294721 |
301.8 |
0 |
0.00 |
256 |
6802880 |
226593 |
464.1 |
0 |
0.00 |
512 |
4792800 |
159651 |
653.9 |
0 |
0.00 |
1024 |
3120360 |
103937 |
851.5 |
0 |
0.00 |
8192 |
611373 |
20365 |
1334.7 |
0 |
0.00 |
63000 |
237560 |
7914 |
3989.0 |
0 |
0.00 |
100000 |
124653 |
4153 |
3322.6 |
0 |
0.00 |
500000 |
30261 |
1008 |
4033.8 |
0 |
0.00 |
1048576 |
7884 |
262 |
2205.0 |
0 |
0.00 |
1548576 |
5404 |
180 |
2234.2 |
0 |
0.00 |
4194304 |
2089 |
69 |
2345.0 |
0 |
0.00 |
10485760 |
868 |
29 |
2437.1 |
0 |
0.00 |
Perftest Scripts
To produce these tests, we executed RTI Perftest for C++98. The exact commands used can be found here:
Publisher Side
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | sudo /set_thr_mode.sh
echo EXECUTABLE IS $1
export executable=$1
echo OUTPUT PATH IS $2
export output_folder=$2
export exec_time=30
export pub_string="-pub \
-transport SHMEM \
-noPrint \
-noOutputHeaders \
-exec $exec_time \
-noXML"
echo ">> UNKEYED BE"
export my_file=$output_folder/thr_shmem_pub_unkeyed_be.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="taskset -c 0 \
$executable -best $pub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 3;
done
sleep 5;
echo ">> UNKEYED REL"
export my_file=$output_folder/thr_shmem_pub_unkeyed_rel.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000 100000 500000 1048576 1548576 4194304 10485760; do
export command="taskset -c 0 \
$executable $pub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 3;
done
sleep 5;
echo ">> KEYED BE"
export my_file=$output_folder/thr_shmem_pub_keyed_be.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="taskset -c 0 \
$executable -best -keyed -instances 100000 $pub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 3;
done
sleep 5;
echo ">> KEYED REL"
export my_file=$output_folder/thr_shmem_pub_keyed_rel.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="taskset -c 0 \
$executable -keyed -instances 100000 $pub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 3;
done
|
Subscriber Side
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | sudo /set_thr_mode.sh
echo EXECUTABLE IS $1
export executable=$1
echo OUTPUT PATH IS $2
export output_folder=$2
export sub_string="-sub \
-transport SHMEM \
-noPrint \
-noOutputHeaders \
-noXML"
mkdir -p $output_folder
echo ">> UNKEYED BE"
export my_file=$output_folder/thr_shmem_sub_unkeyed_be.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="taskset -c 1 \
$executable -best $sub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 10;
done
sleep 5;
echo ">> UNKEYED REL"
export my_file=$output_folder/thr_shmem_sub_unkeyed_rel.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000 100000 500000 1048576 1548576 4194304 10485760; do
export command="taskset -c 1 \
$executable $sub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 10;
done
sleep 5;
echo ">> KEYED BE"
export my_file=$output_folder/thr_shmem_sub_keyed_be.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="taskset -c 1 \
$executable -best -keyed -instances 100000 $sub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 10;
done
sleep 5;
echo ">> KEYED REL"
touch $my_file
export my_file=$output_folder/thr_shmem_sub_keyed.csv
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="taskset -c 1 \
$executable -keyed -instances 100000 $sub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 10;
done
|
Test Hardware
The following hardware was used to perform these tests:
Raspberry Pi 4 Model B
Processor: Broadcom BCM2711, Quad core Cortex-A72 (ARM v8) 64-bit SoC @ 1.5GHz
RAM: 4GB LPDDR4-3200 SDRAM
NIC 1: Gigabit Ethernet
OS: Raspbian (x32)
.. Note::
These machines are using the most popular OS in a Raspberry, which is
**Raspbian** (Devian for Raspberry). This however is not the ideal choice
in terms of performance, as it is a 32 bits OS in a 64 bits CPU.
Switch
Dell Networking S4048T-ON, 48x 10GBASE-T and 6x 40GbE QSFP+ ports, IO to PSU air, 2x AC PSU, OS9
Keyed, Shared Memory, C++98¶
The graph below shows the one-way latency without load between a Publisher and a Subscriber running in two processes within a single node. The numbers are for best-effort as well as strict reliable reliability scenarios.
Note
We use the median (50th percentile) instead of the average in order to get a more stable measurement that does not account for spurious outliers. We also calculate the average value and other percentile values, which can be seen in the Detailed Statistics section below.
Detailed Statistics
The following tables contain the raw numbers presented by RTI Perftest. These numbers are the exact output with no further processing.
Best Effort
Sample Size (Bytes) |
Avg (μs) |
Std (μs) |
Min (μs) |
Max (μs) |
50% (μs) |
90% (μs) |
99% (μs) |
99.99% (μs) |
99.9999% (μs) |
---|---|---|---|---|---|---|---|---|---|
32 |
11 |
0.6 |
10 |
139 |
11 |
12 |
13 |
20 |
90 |
64 |
11 |
0.6 |
10 |
139 |
11 |
12 |
13 |
20 |
81 |
128 |
11 |
0.6 |
10 |
141 |
11 |
12 |
13 |
20 |
80 |
256 |
11 |
0.6 |
10 |
139 |
11 |
12 |
13 |
20 |
81 |
512 |
11 |
0.7 |
11 |
196 |
11 |
12 |
13 |
20 |
139 |
1024 |
12 |
0.7 |
11 |
140 |
11 |
12 |
13 |
20 |
80 |
8192 |
12 |
0.7 |
11 |
141 |
12 |
13 |
14 |
21 |
141 |
63000 |
20 |
0.9 |
19 |
150 |
20 |
21 |
23 |
31 |
150 |
Reliable
Sample Size (Bytes) |
Avg (μs) |
Std (μs) |
Min (μs) |
Max (μs) |
50% (μs) |
90% (μs) |
99% (μs) |
99.99% (μs) |
99.9999% (μs) |
---|---|---|---|---|---|---|---|---|---|
32 |
14 |
1.1 |
12 |
213 |
13 |
15 |
18 |
24 |
213 |
64 |
14 |
1.1 |
12 |
213 |
13 |
15 |
18 |
24 |
213 |
128 |
14 |
1.1 |
12 |
213 |
13 |
15 |
18 |
24 |
213 |
256 |
14 |
1.1 |
12 |
225 |
13 |
15 |
18 |
24 |
225 |
512 |
14 |
1.2 |
12 |
213 |
13 |
15 |
18 |
24 |
213 |
1024 |
13 |
1.1 |
13 |
215 |
13 |
15 |
18 |
25 |
215 |
8192 |
15 |
1.1 |
13 |
217 |
15 |
16 |
19 |
26 |
217 |
63000 |
24 |
2.0 |
21 |
231 |
24 |
25 |
38 |
44 |
231 |
Perftest Scripts
To produce these tests, we executed RTI Perftest for C++98. The exact commands used can be found here:
Publisher Side
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | sudo /set_lat_mode.sh
echo EXECUTABLE IS $1
export executable=$1
echo OUTPUT PATH IS $2
export output_folder=$2
export exec_time=30
export pub_string="-pub \
-transport SHMEM \
-noPrint \
-noOutputHeaders \
-exec $exec_time \
-noXML\
-latencyTest"
mkdir -p $output_folder
echo ">> UNKEYED BE"
export my_file=$output_folder/lat_shmem_pub_unkeyed_be.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="\
$executable -best -datalen $DATALEN $pub_string"
echo $command
$command >> $my_file;
sleep 3;
done
sleep 5;
echo ">> UNKEYED REL"
export my_file=$output_folder/lat_shmem_pub_unkeyed_rel.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000 100000 500000 1048576 1548576 4194304 10485760; do
export command="\
$executable -datalen $DATALEN $pub_string"
echo $command
$command >> $my_file;
sleep 3;
done
sleep 5;
echo ">> KEYED BE"
export my_file=$output_folder/lat_shmem_pub_keyed_be.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="\
$executable -best -keyed -instances 100000 -datalen $DATALEN $pub_string"
echo $command
$command >> $my_file;
sleep 3;
done
sleep 5;
echo ">> KEYED REL"
export my_file=$output_folder/lat_shmem_pub_keyed_rel.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="\
$executable -keyed -instances 100000 -datalen $DATALEN $pub_string"
echo $command
$command >> $my_file;
sleep 3;
done
|
Subscriber Side
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | sudo /set_lat_mode.sh
echo EXECUTABLE IS $1
export executable=$1
echo OUTPUT PATH IS $2
export output_folder=$2
export nic=172.16.0.2
export sub_string="-sub \
-transport SHMEM \
-nic $nic \
-noPrint \
-noOutputHeaders \
-noXML"
mkdir -p $output_folder
echo ">> UNKEYED BE"
export my_file=$output_folder/lat_shmem_sub_unkeyed_be.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="\
$executable -best $sub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 10;
done
sleep 5;
echo ">> UNKEYED REL"
export my_file=$output_folder/lat_shmem_sub_unkeyed_rel.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000 100000 500000 1048576 1548576 4194304 10485760; do
export command="\
$executable $sub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 10;
done
sleep 5;
echo ">> KEYED BE"
export my_file=$output_folder/lat_shmem_sub_keyed_be.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="\
$executable -best -keyed -instances 100000 $sub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 10;
done
sleep 5;
echo ">> KEYED REL"
export my_file=$output_folder/lat_shmem_sub_keyed_rel.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="\
$executable -keyed -instances 100000 $sub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 10;
done
|
Test Hardware
The following hardware was used to perform these tests:
Linux Nodes
Processor: Intel® Xeon® E-2186G 3.8GHz, 12M cache, 6C/12T, turbo (95W)
RAM: 16GB 2666MT/s DDR4 ECC UDIMM
NIC 1: Intel X550 Dual Port 10GbE BASE-T Adapter, PCIe Full Height
NIC 2: Intel Ethernet I350 Dual Port 1GbE BASE-T Adapter, PCIe Low Profile
OS: Ubuntu 18.04 -- gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
Switch
Dell Networking S4048T-ON, 48x 10GBASE-T and 6x 40GbE QSFP+ ports, IO to PSU air, 2x AC PSU, OS9
The graph below shows the expected throughput behavior when performing a 1-1 communication between two processes within a single node. The numbers are for best-effort as well as strict reliable reliability scenarios.
Note
By default, RTI Perftest enables batching when performing a Maximum Throughput test. The batching feature allows sending more than one data sample per RTPS packet, improving network performance for small data sizes. See the RTI Connext DDS Core Libraries User’s Manual for more information on batching.
The batch maximum size is set by RTI Perftest to be 8192 bytes; after 8192 bytes, batching is not enabled.
Detailed Statistics
This table contains the raw numbers presented by RTI Perftest. These numbers are the exact output with no further processing.
Best Effort
Sample Size (Bytes) |
Total Samples |
Avg Samples/s |
Avg Mbps |
Lost Samples |
Lost Samples (%) |
---|---|---|---|---|---|
32 |
35100672 |
1169508 |
299.4 |
14592 |
0.04 |
64 |
34762112 |
1158086 |
592.9 |
33536 |
0.10 |
128 |
33372288 |
1111891 |
1138.6 |
28928 |
0.09 |
256 |
30617248 |
1019947 |
2088.9 |
21440 |
0.07 |
512 |
26564720 |
884815 |
3624.2 |
17552 |
0.07 |
1024 |
21336871 |
710832 |
5823.1 |
9920 |
0.05 |
8192 |
6827457 |
227479 |
14908.1 |
0 |
0.00 |
63000 |
3656316 |
121817 |
61396.2 |
0 |
0.00 |
Reliable
Sample Size (Bytes) |
Total Samples |
Avg Samples/s |
Avg Mbps |
Lost Samples |
Lost Samples (%) |
---|---|---|---|---|---|
32 |
30402644 |
1012273 |
259.1 |
0 |
0.00 |
64 |
30520960 |
1016322 |
520.4 |
0 |
0.00 |
128 |
30883008 |
1028847 |
1053.5 |
0 |
0.00 |
256 |
28278371 |
942136 |
1929.5 |
0 |
0.00 |
512 |
24151109 |
804309 |
3294.4 |
0 |
0.00 |
1024 |
18565080 |
618280 |
5065.0 |
0 |
0.00 |
8192 |
5025494 |
167434 |
10973.0 |
0 |
0.00 |
63000 |
2808652 |
93579 |
47164.3 |
0 |
0.00 |
Perftest Scripts
To produce these tests, we executed RTI Perftest for C++98. The exact commands used can be found here:
Publisher Side
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | sudo /set_thr_mode.sh
echo EXECUTABLE IS $1
export executable=$1
echo OUTPUT PATH IS $2
export output_folder=$2
export exec_time=30
export nic=172.16.0.1
export pub_string="-pub \
-transport SHMEM \
-nic $nic \
-noPrint \
-noOutputHeaders \
-exec $exec_time \
-noXML"
mkdir -p $output_folder
echo ">> UNKEYED BE"
export my_file=$output_folder/thr_shmem_pub_unkeyed_be.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="\
$executable -best $pub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 3;
done
sleep 5;
echo ">> UNKEYED REL"
export my_file=$output_folder/thr_shmem_pub_unkeyed_rel.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000 100000 500000 1048576 1548576 4194304 10485760; do
export command="\
$executable $pub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 3;
done
sleep 5;
echo ">> KEYED BE"
export my_file=$output_folder/thr_shmem_pub_keyed_be.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="\
$executable -best -keyed -instances 100000 $pub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 3;
done
sleep 5;
echo ">> KEYED REL"
export my_file=$output_folder/thr_shmem_pub_keyed_rel.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="\
$executable -keyed -instances 100000 $pub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 3;
done
|
Subscriber Side
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | sudo /set_thr_mode.sh
echo EXECUTABLE IS $1
export executable=$1
echo OUTPUT PATH IS $2
export output_folder=$2
export nic=172.16.0.2
export sub_string="-sub \
-transport SHMEM \
-noPrint \
-noOutputHeaders \
-noXML"
mkdir -p $output_folder
echo ">> UNKEYED BE"
export my_file=$output_folder/thr_shmem_sub_unkeyed_be.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="\
$executable -best $sub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 10;
done
sleep 5;
echo ">> UNKEYED REL"
export my_file=$output_folder/thr_shmem_sub_unkeyed_rel.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000 100000 500000 1048576 1548576 4194304 10485760; do
export command="\
$executable $sub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 10;
done
sleep 5;
echo ">> KEYED BE"
export my_file=$output_folder/thr_shmem_sub_keyed_be.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="\
$executable -best -keyed -instances 100000 $sub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 10;
done
sleep 5;
echo ">> KEYED REL"
touch $my_file
export my_file=$output_folder/thr_shmem_sub_keyed.csv
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="\
$executable -keyed -instances 100000 $sub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 10;
done
|
Test Hardware
The following hardware was used to perform these tests:
Linux Nodes
Processor: Intel® Xeon® E-2186G 3.8GHz, 12M cache, 6C/12T, turbo (95W)
RAM: 16GB 2666MT/s DDR4 ECC UDIMM
NIC 1: Intel X550 Dual Port 10GbE BASE-T Adapter, PCIe Full Height
NIC 2: Intel Ethernet I350 Dual Port 1GbE BASE-T Adapter, PCIe Low Profile
OS: Ubuntu 18.04 -- gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
Switch
Dell Networking S4048T-ON, 48x 10GBASE-T and 6x 40GbE QSFP+ ports, IO to PSU air, 2x AC PSU, OS9
The graph below shows the one-way latency without load between a Publisher and a Subscriber running in two processes within a single node. The numbers are for best-effort as well as strict reliable reliability scenarios.
Note
We use the median (50th percentile) instead of the average in order to get a more stable measurement that does not account for spurious outliers. We also calculate the average value and other percentile values, which can be seen in the Detailed Statistics section below.
Detailed Statistics
The following tables contain the raw numbers presented by RTI Perftest. These numbers are the exact output with no further processing.
Best Effort
Sample Size (Bytes) |
Avg (μs) |
Std (μs) |
Min (μs) |
Max (μs) |
50% (μs) |
90% (μs) |
99% (μs) |
99.99% (μs) |
99.9999% (μs) |
---|---|---|---|---|---|---|---|---|---|
32 |
81 |
10.0 |
72 |
2450 |
79 |
88 |
104 |
232 |
2450 |
64 |
81 |
8.0 |
73 |
1086 |
79 |
88 |
104 |
243 |
1086 |
128 |
80 |
8.0 |
72 |
910 |
78 |
86 |
102 |
226 |
910 |
256 |
86 |
8.2 |
76 |
869 |
84 |
93 |
108 |
242 |
869 |
512 |
83 |
8.0 |
74 |
888 |
82 |
90 |
106 |
239 |
888 |
1024 |
86 |
9.7 |
77 |
2009 |
84 |
93 |
109 |
248 |
2009 |
8192 |
91 |
8.3 |
81 |
929 |
89 |
99 |
115 |
253 |
929 |
63000 |
187 |
12.2 |
171 |
608 |
184 |
199 |
221 |
417 |
608 |
Reliable
Sample Size (Bytes) |
Avg (μs) |
Std (μs) |
Min (μs) |
Max (μs) |
50% (μs) |
90% (μs) |
99% (μs) |
99.99% (μs) |
99.9999% (μs) |
---|---|---|---|---|---|---|---|---|---|
32 |
94 |
12.9 |
80 |
1149 |
90 |
106 |
141 |
291 |
1149 |
64 |
96 |
12.1 |
82 |
874 |
92 |
107 |
139 |
285 |
874 |
128 |
94 |
12.6 |
80 |
875 |
90 |
107 |
141 |
282 |
875 |
256 |
96 |
12.7 |
81 |
909 |
91 |
107 |
144 |
284 |
909 |
512 |
96 |
12.8 |
82 |
876 |
91 |
110 |
147 |
252 |
876 |
1024 |
94 |
13.2 |
81 |
955 |
90 |
108 |
148 |
271 |
955 |
8192 |
110 |
13.9 |
94 |
896 |
105 |
125 |
162 |
306 |
896 |
63000 |
230 |
18.9 |
207 |
1285 |
225 |
251 |
282 |
711 |
1285 |
Perftest Scripts
To produce these tests, we executed RTI Perftest for C++98. The exact commands used can be found here:
Publisher Side
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | sudo /set_lat_mode.sh
echo EXECUTABLE IS $1
export executable=$1
echo OUTPUT PATH IS $2
export output_folder=$2
export exec_time=30
export pub_string="-pub \
-transport SHMEM \
-noPrint \
-noOutputHeaders \
-exec $exec_time \
-noXML\
-latencyTest"
mkdir -p $output_folder
echo ">> UNKEYED BE"
export my_file=$output_folder/lat_shmem_pub_unkeyed_be.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="\
$executable -best -datalen $DATALEN $pub_string"
echo $command
$command >> $my_file;
sleep 3;
done
sleep 5;
echo ">> UNKEYED REL"
export my_file=$output_folder/lat_shmem_pub_unkeyed_rel.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000 100000 500000 1048576 1548576 4194304 10485760; do
export command="\
$executable -datalen $DATALEN $pub_string"
echo $command
$command >> $my_file;
sleep 3;
done
sleep 5;
echo ">> KEYED BE"
export my_file=$output_folder/lat_shmem_pub_keyed_be.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="\
$executable -best -keyed -instances 100000 -datalen $DATALEN $pub_string"
echo $command
$command >> $my_file;
sleep 3;
done
sleep 5;
echo ">> KEYED REL"
export my_file=$output_folder/lat_shmem_pub_keyed_rel.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="\
$executable -keyed -instances 100000 -datalen $DATALEN $pub_string"
echo $command
$command >> $my_file;
sleep 3;
done
|
Subscriber Side
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | sudo /set_lat_mode.sh
echo EXECUTABLE IS $1
export executable=$1
echo OUTPUT PATH IS $2
export output_folder=$2
export nic=172.16.0.2
export sub_string="-sub \
-transport SHMEM \
-nic $nic \
-noPrint \
-noOutputHeaders \
-noXML"
mkdir -p $output_folder
echo ">> UNKEYED BE"
export my_file=$output_folder/lat_shmem_sub_unkeyed_be.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="\
$executable -best $sub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 10;
done
sleep 5;
echo ">> UNKEYED REL"
export my_file=$output_folder/lat_shmem_sub_unkeyed_rel.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000 100000 500000 1048576 1548576 4194304 10485760; do
export command="\
$executable $sub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 10;
done
sleep 5;
echo ">> KEYED BE"
export my_file=$output_folder/lat_shmem_sub_keyed_be.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="\
$executable -best -keyed -instances 100000 $sub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 10;
done
sleep 5;
echo ">> KEYED REL"
export my_file=$output_folder/lat_shmem_sub_keyed_rel.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="\
$executable -keyed -instances 100000 $sub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 10;
done
|
Test Hardware
The following hardware was used to perform these tests:
Raspberry Pi 4 Model B
Processor: Broadcom BCM2711, Quad core Cortex-A72 (ARM v8) 64-bit SoC @ 1.5GHz
RAM: 4GB LPDDR4-3200 SDRAM
NIC 1: Gigabit Ethernet
OS: Raspbian (x32)
.. Note::
These machines are using the most popular OS in a Raspberry, which is
**Raspbian** (Devian for Raspberry). This however is not the ideal choice
in terms of performance, as it is a 32 bits OS in a 64 bits CPU.
Switch
Dell Networking S4048T-ON, 48x 10GBASE-T and 6x 40GbE QSFP+ ports, IO to PSU air, 2x AC PSU, OS9
The graph below shows the expected throughput behavior when performing a 1-1 communication between two processes within a single node. The numbers are for best-effort as well as strict reliable reliability scenarios.
Note
By default, RTI Perftest enables batching when performing a Maximum Throughput test. The batching feature allows sending more than one data sample per RTPS packet, improving network performance for small data sizes. See the RTI Connext DDS Core Libraries User’s Manual for more information on batching.
The batch maximum size is set by RTI Perftest to be 8192 bytes; after 8192 bytes, batching is not enabled.
Detailed Statistics
This table contains the raw numbers presented by RTI Perftest. These numbers are the exact output with no further processing.
Best Effort
Sample Size (Bytes) |
Total Samples |
Avg Samples/s |
Avg Mbps |
Lost Samples |
Lost Samples (%) |
---|---|---|---|---|---|
32 |
3506681 |
116927 |
29.9 |
7680 |
0.22 |
64 |
3569431 |
118925 |
60.9 |
16896 |
0.47 |
128 |
3580096 |
119234 |
122.1 |
21440 |
0.60 |
256 |
3271072 |
108972 |
223.2 |
19968 |
0.61 |
512 |
2848752 |
94868 |
388.6 |
20304 |
0.71 |
1024 |
2278256 |
75869 |
621.5 |
16560 |
0.72 |
8192 |
684104 |
22783 |
1493.2 |
112612 |
14.13 |
63000 |
336912 |
11225 |
5657.6 |
22185 |
6.18 |
Reliable
Sample Size (Bytes) |
Total Samples |
Avg Samples/s |
Avg Mbps |
Lost Samples |
Lost Samples (%) |
---|---|---|---|---|---|
32 |
2008525 |
66998 |
17.2 |
0 |
0.00 |
64 |
2297217 |
76611 |
39.2 |
0 |
0.00 |
128 |
2263104 |
75477 |
77.3 |
0 |
0.00 |
256 |
2251392 |
75088 |
153.8 |
0 |
0.00 |
512 |
1852136 |
61772 |
253.0 |
0 |
0.00 |
1024 |
1444752 |
48210 |
394.9 |
0 |
0.00 |
8192 |
521493 |
17371 |
1138.4 |
0 |
0.00 |
63000 |
215369 |
7174 |
3615.9 |
0 |
0.00 |
Perftest Scripts
To produce these tests, we executed RTI Perftest for C++98. The exact commands used can be found here:
Publisher Side
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | sudo /set_thr_mode.sh
echo EXECUTABLE IS $1
export executable=$1
echo OUTPUT PATH IS $2
export output_folder=$2
export exec_time=30
export pub_string="-pub \
-transport SHMEM \
-noPrint \
-noOutputHeaders \
-exec $exec_time \
-noXML"
echo ">> UNKEYED BE"
export my_file=$output_folder/thr_shmem_pub_unkeyed_be.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="taskset -c 0 \
$executable -best $pub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 3;
done
sleep 5;
echo ">> UNKEYED REL"
export my_file=$output_folder/thr_shmem_pub_unkeyed_rel.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000 100000 500000 1048576 1548576 4194304 10485760; do
export command="taskset -c 0 \
$executable $pub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 3;
done
sleep 5;
echo ">> KEYED BE"
export my_file=$output_folder/thr_shmem_pub_keyed_be.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="taskset -c 0 \
$executable -best -keyed -instances 100000 $pub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 3;
done
sleep 5;
echo ">> KEYED REL"
export my_file=$output_folder/thr_shmem_pub_keyed_rel.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="taskset -c 0 \
$executable -keyed -instances 100000 $pub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 3;
done
|
Subscriber Side
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | sudo /set_thr_mode.sh
echo EXECUTABLE IS $1
export executable=$1
echo OUTPUT PATH IS $2
export output_folder=$2
export sub_string="-sub \
-transport SHMEM \
-noPrint \
-noOutputHeaders \
-noXML"
mkdir -p $output_folder
echo ">> UNKEYED BE"
export my_file=$output_folder/thr_shmem_sub_unkeyed_be.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="taskset -c 1 \
$executable -best $sub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 10;
done
sleep 5;
echo ">> UNKEYED REL"
export my_file=$output_folder/thr_shmem_sub_unkeyed_rel.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000 100000 500000 1048576 1548576 4194304 10485760; do
export command="taskset -c 1 \
$executable $sub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 10;
done
sleep 5;
echo ">> KEYED BE"
export my_file=$output_folder/thr_shmem_sub_keyed_be.csv
touch $my_file
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="taskset -c 1 \
$executable -best -keyed -instances 100000 $sub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 10;
done
sleep 5;
echo ">> KEYED REL"
touch $my_file
export my_file=$output_folder/thr_shmem_sub_keyed.csv
for DATALEN in 32 64 128 256 512 1024 8192 63000; do
export command="taskset -c 1 \
$executable -keyed -instances 100000 $sub_string -datalen $DATALEN"
echo $command
$command >> $my_file;
sleep 10;
done
|
Test Hardware
The following hardware was used to perform these tests:
Raspberry Pi 4 Model B
Processor: Broadcom BCM2711, Quad core Cortex-A72 (ARM v8) 64-bit SoC @ 1.5GHz
RAM: 4GB LPDDR4-3200 SDRAM
NIC 1: Gigabit Ethernet
OS: Raspbian (x32)
.. Note::
These machines are using the most popular OS in a Raspberry, which is
**Raspbian** (Devian for Raspberry). This however is not the ideal choice
in terms of performance, as it is a 32 bits OS in a 64 bits CPU.
Switch
Dell Networking S4048T-ON, 48x 10GBASE-T and 6x 40GbE QSFP+ ports, IO to PSU air, 2x AC PSU, OS9