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 |
9 |
0.6 |
8 |
124 |
8 |
9 |
10 |
17 |
124 |
64 |
8 |
0.6 |
8 |
48 |
8 |
9 |
10 |
17 |
48 |
128 |
8 |
0.4 |
8 |
48 |
8 |
9 |
9 |
12 |
48 |
256 |
8 |
0.6 |
8 |
49 |
8 |
9 |
10 |
17 |
49 |
512 |
8 |
0.5 |
8 |
47 |
8 |
9 |
9 |
12 |
47 |
1024 |
8 |
0.6 |
8 |
49 |
8 |
9 |
9 |
12 |
49 |
2048 |
9 |
0.4 |
8 |
49 |
9 |
9 |
10 |
17 |
49 |
4096 |
9 |
0.4 |
8 |
58 |
9 |
9 |
10 |
18 |
58 |
8192 |
9 |
0.5 |
9 |
51 |
9 |
10 |
10 |
16 |
51 |
16384 |
11 |
0.6 |
10 |
49 |
10 |
11 |
11 |
21 |
49 |
32768 |
13 |
0.6 |
12 |
155 |
13 |
13 |
14 |
30 |
155 |
63000 |
16 |
0.7 |
15 |
67 |
16 |
17 |
18 |
47 |
67 |
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 |
10 |
1.1 |
9 |
48 |
10 |
12 |
14 |
17 |
48 |
64 |
10 |
1.1 |
9 |
48 |
9 |
12 |
14 |
20 |
48 |
128 |
10 |
1.3 |
8 |
91 |
9 |
12 |
17 |
20 |
91 |
256 |
10 |
1.0 |
9 |
48 |
10 |
12 |
14 |
18 |
48 |
512 |
10 |
1.1 |
9 |
55 |
10 |
12 |
17 |
20 |
55 |
1024 |
10 |
1.0 |
9 |
48 |
10 |
12 |
14 |
18 |
48 |
2048 |
10 |
1.0 |
9 |
97 |
10 |
13 |
14 |
18 |
97 |
4096 |
11 |
1.1 |
9 |
51 |
10 |
13 |
14 |
19 |
51 |
8192 |
11 |
1.0 |
9 |
49 |
11 |
13 |
15 |
21 |
49 |
16384 |
12 |
0.9 |
11 |
51 |
12 |
14 |
15 |
24 |
51 |
32768 |
15 |
1.2 |
13 |
125 |
14 |
16 |
19 |
36 |
125 |
63000 |
19 |
1.1 |
17 |
71 |
18 |
19 |
23 |
55 |
71 |
100000 |
28 |
3.8 |
25 |
130 |
27 |
28 |
46 |
83 |
130 |
500000 |
91 |
11.1 |
78 |
523 |
90 |
92 |
147 |
354 |
523 |
1048576 |
268 |
66.2 |
161 |
1077 |
285 |
294 |
530 |
742 |
1077 |
1548576 |
410 |
86.0 |
248 |
1570 |
434 |
446 |
639 |
1111 |
1570 |
4194304 |
1291 |
195.2 |
846 |
4250 |
1361 |
1385 |
1405 |
4250 |
4250 |
10485760 |
2692 |
446.6 |
2454 |
10956 |
2586 |
3547 |
3687 |
10956 |
10956 |
Perftest Scripts
To produce these tests, we executed RTI Perftest for C++98. The exact script used can be found here:
1echo EXECUTABLE IS $1
2export executable=$1
3export folder_base="$(dirname "${executable}")"/../../..
4
5echo OUTPUT PATH IS $2
6export output_folder=$2
7export pub_sub="pub"
8export lat_thr="lat"
9export num_reps="1 2 3 4"
10export dataLens="32 64 128 256 512 1024 2048 4096 8192 16384 32768 63000"
11export domain="2"
12
13if [[ -z "$3" ]]; then
14 echo "You need a third argument with publisher or subscriber"
15 exit -1
16else
17 if [[ "$3" == "publisher" ]]; then
18 echo "Publisher"
19 export pub_sub="pub"
20
21 elif [[ "$3" == "subscriber" ]]; then
22 echo "Subscriber"
23 export pub_sub="sub"
24 else
25 echo "It must be either publisher or subscriber"
26 exit -1
27 fi
28fi
29
30if [[ -z "$4" ]]; then
31 echo "You need a forth argument with lat or thr"
32 exit -1
33else
34 if [[ "$4" == "thr" ]]; then
35 echo "Throughput test"
36 export ${lat_thr}_thr="thr"
37
38 elif [[ "$4" == "lat" ]]; then
39 echo "Latency test"
40 export ${lat_thr}_thr="lat"
41 else
42 echo "It must be either lat or thr"
43 exit -1
44 fi
45fi
46
47sudo /set_${lat_thr}_mode.sh
48sleep 10
49
50export exec_time=20
51
52export pub_string="-pub \
53 -transport SHMEM \
54 -noPrint \
55 -exec $exec_time"
56
57if [[ ${lat_thr} == "lat" ]]; then
58 export pub_string="$pub_string \
59 -latencyTest"
60fi
61
62export sub_string="-sub \
63 -transport SHMEM \
64 -noPrint"
65
66if [[ "$pub_sub" == "pub" ]]; then
67 echo "Publisher side"
68 export commands_string=${pub_string}
69 export core=0
70else
71 echo "Subscriber side"
72 export commands_string=${sub_string}
73 export core=1
74fi
75
76mkdir -p $output_folder
77cd $folder_base
78
79export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel.csv
80touch $my_file
81export extra_args=""
82for index in ${num_reps}; do
83 for DATALEN in 32 64 128 256 512 1024 2048 4096 8192 16384 32768 63000 100000 500000 1048576 1548576 4194304 10485760; do
84 export command="taskset -c $core \
85 $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
86 echo $command ---- $index
87 $command >> $my_file;
88 if [[ "$domain" == "1" ]]; then
89 export domain="2"
90 else
91 export domain="1"
92 fi
93 export extra_args=" -noOutputHeaders "
94 done
95done
96
97export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be.csv
98touch $my_file
99export extra_args=""
100for index in ${num_reps}; do
101 for DATALEN in ${dataLens}; do
102 export command="taskset -c $core \
103 $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
104 echo $command ---- $index
105 $command >> $my_file;
106 if [[ "$domain" == "1" ]]; then
107 export domain="2"
108 else
109 export domain="1"
110 fi
111 export extra_args=" -noOutputHeaders "
112 done
113done
114
115export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_rel.csv
116touch $my_file
117export extra_args=""
118for index in ${num_reps}; do
119 for DATALEN in ${dataLens}; do
120 export command="taskset -c $core \
121 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 $commands_string $extra_args"
122 echo $command ---- $index
123 $command >> $my_file;
124 if [[ "$domain" == "1" ]]; then
125 export domain="2"
126 else
127 export domain="1"
128 fi
129 export extra_args=" -noOutputHeaders "
130 done
131done
132
133export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_be.csv
134touch $my_file
135export extra_args=""
136for index in ${num_reps}; do
137 for DATALEN in ${dataLens}; do
138 export command="taskset -c $core \
139 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 -best $commands_string $extra_args"
140 echo $command ---- $index
141 $command >> $my_file;
142 if [[ "$domain" == "1" ]]; then
143 export domain="2"
144 else
145 export domain="1"
146 fi
147 export extra_args=" -noOutputHeaders "
148 done
149done
150
151if [[ ${lat_thr} == "thr" ]]; then
152
153 if [[ "$pub_sub" == "pub" ]]; then
154 echo "Publisher side"
155 export commands_string="${commands_string} -batchSize 0"
156 fi
157
158 export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be_noBatch.csv
159 touch $my_file
160 export extra_args=""
161 for index in ${num_reps}; do
162 for DATALEN in ${dataLens}; do
163 export command="taskset -c $core \
164 $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
165 echo $command ---- $index
166 $command >> $my_file;
167 if [[ "$domain" == "1" ]]; then
168 export domain="2"
169 else
170 export domain="1"
171 fi
172 export extra_args=" -noOutputHeaders "
173 done
174 done
175
176 export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel_noBatch.csv
177 touch $my_file
178 export extra_args=""
179 for index in ${num_reps}; do
180 for DATALEN in ${dataLens}; do
181 export command="taskset -c $core \
182 $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
183 echo $command ---- $index
184 $command >> $my_file;
185 if [[ "$domain" == "1" ]]; then
186 export domain="2"
187 else
188 export domain="1"
189 fi
190 export extra_args=" -noOutputHeaders "
191 done
192 done
193
194fi
Test Hardware
The following hardware was used to perform these tests:
Linux Nodes
Dell R340 Servers (13 Units)
Processor: Intel Xeon E-2278G (3.4-5GHz, 8c/16t, 16MB cache, 2 memory channels @2666MHz)
RAM: 4x 16GB 2666MHz DIMM (64GB RAM)
HD: 480GB SATA SSD
NIC 1: Intel 710 dual port 10Gbps SFP
OS: Ubuntu 20.04 -- gcc 9.3.0
Switch
Dell 2048 -- 10Gbps switch
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 |
99201024 |
4981646 |
1275.3 |
798976 |
0.80 |
64 |
94041507 |
4697321 |
2405.0 |
1025408 |
1.08 |
128 |
82241889 |
4107849 |
4206.4 |
0 |
0.00 |
256 |
71301920 |
3561235 |
7293.4 |
0 |
0.00 |
512 |
53749373 |
2684450 |
10995.5 |
0 |
0.00 |
1024 |
35450202 |
1770469 |
14503.7 |
0 |
0.00 |
2048 |
21492504 |
1073494 |
17588.1 |
0 |
0.00 |
4096 |
11718852 |
585256 |
19177.7 |
0 |
0.00 |
8192 |
7188981 |
358896 |
23520.7 |
0 |
0.00 |
16384 |
5540042 |
276696 |
36267.1 |
0 |
0.00 |
32768 |
3872618 |
193334 |
50681.4 |
0 |
0.00 |
63000 |
2804412 |
140056 |
70588.7 |
0 |
0.00 |
Reliable
Sample Size (Bytes) |
Total Samples |
Avg Samples/s |
Avg Mbps |
Lost Samples |
Lost Samples (%) |
---|---|---|---|---|---|
32 |
97933861 |
4890509 |
1252.0 |
0 |
0.00 |
64 |
90840679 |
4537090 |
2323.0 |
0 |
0.00 |
128 |
78700519 |
3930719 |
4025.1 |
0 |
0.00 |
256 |
61905856 |
3091394 |
6331.2 |
0 |
0.00 |
512 |
44269984 |
2210784 |
9055.4 |
0 |
0.00 |
1024 |
27354984 |
1366183 |
11191.8 |
0 |
0.00 |
2048 |
14629028 |
730590 |
11970.0 |
0 |
0.00 |
4096 |
7837030 |
391387 |
12825.0 |
0 |
0.00 |
8192 |
4475372 |
223508 |
14647.9 |
0 |
0.00 |
16384 |
3820442 |
190798 |
25008.4 |
0 |
0.00 |
32768 |
2923950 |
146035 |
38282.4 |
0 |
0.00 |
63000 |
2215705 |
110668 |
55776.8 |
0 |
0.00 |
100000 |
961199 |
47998 |
38398.4 |
0 |
0.00 |
500000 |
294230 |
14694 |
58777.6 |
0 |
0.00 |
1048576 |
157487 |
7865 |
65982.2 |
0 |
0.00 |
1548576 |
108529 |
5420 |
67153.6 |
0 |
0.00 |
4194304 |
27223 |
1359 |
45629.5 |
0 |
0.00 |
10485760 |
7997 |
399 |
33524.5 |
0 |
0.00 |
Perftest Scripts
To produce these tests, we executed RTI Perftest for C++98. The exact script used can be found here:
1echo EXECUTABLE IS $1
2export executable=$1
3export folder_base="$(dirname "${executable}")"/../../..
4
5echo OUTPUT PATH IS $2
6export output_folder=$2
7export pub_sub="pub"
8export lat_thr="lat"
9export num_reps="1 2 3 4"
10export dataLens="32 64 128 256 512 1024 2048 4096 8192 16384 32768 63000"
11export domain="2"
12
13if [[ -z "$3" ]]; then
14 echo "You need a third argument with publisher or subscriber"
15 exit -1
16else
17 if [[ "$3" == "publisher" ]]; then
18 echo "Publisher"
19 export pub_sub="pub"
20
21 elif [[ "$3" == "subscriber" ]]; then
22 echo "Subscriber"
23 export pub_sub="sub"
24 else
25 echo "It must be either publisher or subscriber"
26 exit -1
27 fi
28fi
29
30if [[ -z "$4" ]]; then
31 echo "You need a forth argument with lat or thr"
32 exit -1
33else
34 if [[ "$4" == "thr" ]]; then
35 echo "Throughput test"
36 export ${lat_thr}_thr="thr"
37
38 elif [[ "$4" == "lat" ]]; then
39 echo "Latency test"
40 export ${lat_thr}_thr="lat"
41 else
42 echo "It must be either lat or thr"
43 exit -1
44 fi
45fi
46
47sudo /set_${lat_thr}_mode.sh
48sleep 10
49
50export exec_time=20
51
52export pub_string="-pub \
53 -transport SHMEM \
54 -noPrint \
55 -exec $exec_time"
56
57if [[ ${lat_thr} == "lat" ]]; then
58 export pub_string="$pub_string \
59 -latencyTest"
60fi
61
62export sub_string="-sub \
63 -transport SHMEM \
64 -noPrint"
65
66if [[ "$pub_sub" == "pub" ]]; then
67 echo "Publisher side"
68 export commands_string=${pub_string}
69 export core=0
70else
71 echo "Subscriber side"
72 export commands_string=${sub_string}
73 export core=1
74fi
75
76mkdir -p $output_folder
77cd $folder_base
78
79export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel.csv
80touch $my_file
81export extra_args=""
82for index in ${num_reps}; do
83 for DATALEN in 32 64 128 256 512 1024 2048 4096 8192 16384 32768 63000 100000 500000 1048576 1548576 4194304 10485760; do
84 export command="taskset -c $core \
85 $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
86 echo $command ---- $index
87 $command >> $my_file;
88 if [[ "$domain" == "1" ]]; then
89 export domain="2"
90 else
91 export domain="1"
92 fi
93 export extra_args=" -noOutputHeaders "
94 done
95done
96
97export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be.csv
98touch $my_file
99export extra_args=""
100for index in ${num_reps}; do
101 for DATALEN in ${dataLens}; do
102 export command="taskset -c $core \
103 $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
104 echo $command ---- $index
105 $command >> $my_file;
106 if [[ "$domain" == "1" ]]; then
107 export domain="2"
108 else
109 export domain="1"
110 fi
111 export extra_args=" -noOutputHeaders "
112 done
113done
114
115export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_rel.csv
116touch $my_file
117export extra_args=""
118for index in ${num_reps}; do
119 for DATALEN in ${dataLens}; do
120 export command="taskset -c $core \
121 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 $commands_string $extra_args"
122 echo $command ---- $index
123 $command >> $my_file;
124 if [[ "$domain" == "1" ]]; then
125 export domain="2"
126 else
127 export domain="1"
128 fi
129 export extra_args=" -noOutputHeaders "
130 done
131done
132
133export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_be.csv
134touch $my_file
135export extra_args=""
136for index in ${num_reps}; do
137 for DATALEN in ${dataLens}; do
138 export command="taskset -c $core \
139 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 -best $commands_string $extra_args"
140 echo $command ---- $index
141 $command >> $my_file;
142 if [[ "$domain" == "1" ]]; then
143 export domain="2"
144 else
145 export domain="1"
146 fi
147 export extra_args=" -noOutputHeaders "
148 done
149done
150
151if [[ ${lat_thr} == "thr" ]]; then
152
153 if [[ "$pub_sub" == "pub" ]]; then
154 echo "Publisher side"
155 export commands_string="${commands_string} -batchSize 0"
156 fi
157
158 export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be_noBatch.csv
159 touch $my_file
160 export extra_args=""
161 for index in ${num_reps}; do
162 for DATALEN in ${dataLens}; do
163 export command="taskset -c $core \
164 $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
165 echo $command ---- $index
166 $command >> $my_file;
167 if [[ "$domain" == "1" ]]; then
168 export domain="2"
169 else
170 export domain="1"
171 fi
172 export extra_args=" -noOutputHeaders "
173 done
174 done
175
176 export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel_noBatch.csv
177 touch $my_file
178 export extra_args=""
179 for index in ${num_reps}; do
180 for DATALEN in ${dataLens}; do
181 export command="taskset -c $core \
182 $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
183 echo $command ---- $index
184 $command >> $my_file;
185 if [[ "$domain" == "1" ]]; then
186 export domain="2"
187 else
188 export domain="1"
189 fi
190 export extra_args=" -noOutputHeaders "
191 done
192 done
193
194fi
Test Hardware
The following hardware was used to perform these tests:
Linux Nodes
Dell R340 Servers (13 Units)
Processor: Intel Xeon E-2278G (3.4-5GHz, 8c/16t, 16MB cache, 2 memory channels @2666MHz)
RAM: 4x 16GB 2666MHz DIMM (64GB RAM)
HD: 480GB SATA SSD
NIC 1: Intel 710 dual port 10Gbps SFP
OS: Ubuntu 20.04 -- gcc 9.3.0
Switch
Dell 2048 -- 10Gbps switch
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 |
86 |
8.2 |
82 |
328 |
84 |
88 |
111 |
247 |
328 |
64 |
85 |
8.3 |
80 |
313 |
84 |
87 |
111 |
245 |
313 |
128 |
86 |
7.9 |
82 |
384 |
84 |
88 |
110 |
245 |
384 |
256 |
86 |
8.2 |
82 |
312 |
84 |
87 |
111 |
249 |
312 |
512 |
87 |
8.4 |
83 |
333 |
85 |
89 |
111 |
255 |
333 |
1024 |
88 |
8.6 |
83 |
318 |
86 |
89 |
111 |
272 |
318 |
2048 |
88 |
9.3 |
84 |
339 |
86 |
89 |
115 |
288 |
339 |
4096 |
90 |
10.9 |
86 |
431 |
88 |
91 |
117 |
310 |
431 |
8192 |
97 |
12.3 |
91 |
435 |
94 |
98 |
130 |
366 |
435 |
16384 |
105 |
15.6 |
98 |
581 |
102 |
106 |
136 |
462 |
581 |
32768 |
127 |
20.5 |
119 |
829 |
124 |
131 |
161 |
656 |
829 |
63000 |
184 |
31.7 |
169 |
1327 |
179 |
196 |
225 |
1038 |
1327 |
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 |
102 |
25.1 |
87 |
523 |
91 |
148 |
183 |
364 |
523 |
64 |
103 |
25.1 |
88 |
516 |
92 |
148 |
184 |
398 |
516 |
128 |
101 |
23.5 |
83 |
346 |
90 |
146 |
175 |
250 |
346 |
256 |
103 |
24.7 |
84 |
314 |
92 |
152 |
179 |
259 |
314 |
512 |
102 |
25.6 |
88 |
521 |
91 |
150 |
184 |
394 |
521 |
1024 |
105 |
23.8 |
89 |
330 |
94 |
153 |
177 |
248 |
330 |
2048 |
106 |
25.8 |
91 |
327 |
94 |
158 |
185 |
270 |
327 |
4096 |
111 |
25.8 |
95 |
286 |
99 |
163 |
190 |
261 |
286 |
8192 |
119 |
30.8 |
100 |
641 |
106 |
175 |
225 |
500 |
641 |
16384 |
135 |
34.6 |
114 |
742 |
121 |
197 |
256 |
626 |
742 |
32768 |
168 |
40.1 |
141 |
945 |
152 |
232 |
293 |
887 |
945 |
63000 |
231 |
50.8 |
198 |
1589 |
212 |
294 |
357 |
1331 |
1589 |
100000 |
420 |
82.2 |
373 |
2482 |
388 |
497 |
592 |
2017 |
2482 |
500000 |
1262 |
307.6 |
1054 |
4802 |
1142 |
1636 |
3066 |
4802 |
4802 |
1048576 |
4240 |
875.3 |
3897 |
9733 |
4057 |
4178 |
8322 |
9733 |
9733 |
1548576 |
6072 |
1558.7 |
5619 |
31364 |
5743 |
5874 |
11932 |
31364 |
31364 |
4194304 |
15305 |
3455.3 |
13991 |
38309 |
14504 |
15138 |
31159 |
38309 |
38309 |
10485760 |
37575 |
8927.7 |
33825 |
95439 |
35612 |
37036 |
77874 |
95439 |
95439 |
Perftest Scripts
To produce these tests, we executed RTI Perftest for C++98. The script used to execute the tests can be found here:
1echo EXECUTABLE IS $1
2export executable=$1
3export folder_base="$(dirname "${executable}")"/../../..
4
5echo OUTPUT PATH IS $2
6export output_folder=$2
7export pub_sub="pub"
8export lat_thr="lat"
9export num_reps="1 2 3 4"
10export dataLens="32 64 128 256 512 1024 2048 4096 8192 16384 32768 63000"
11export domain="2"
12
13if [[ -z "$3" ]]; then
14 echo "You need a third argument with publisher or subscriber"
15 exit -1
16else
17 if [[ "$3" == "publisher" ]]; then
18 echo "Publisher"
19 export pub_sub="pub"
20
21 elif [[ "$3" == "subscriber" ]]; then
22 echo "Subscriber"
23 export pub_sub="sub"
24 else
25 echo "It must be either publisher or subscriber"
26 exit -1
27 fi
28fi
29
30if [[ -z "$4" ]]; then
31 echo "You need a forth argument with lat or thr"
32 exit -1
33else
34 if [[ "$4" == "thr" ]]; then
35 echo "Throughput test"
36 export ${lat_thr}_thr="thr"
37
38 elif [[ "$4" == "lat" ]]; then
39 echo "Latency test"
40 export ${lat_thr}_thr="lat"
41 else
42 echo "It must be either lat or thr"
43 exit -1
44 fi
45fi
46
47sudo /set_${lat_thr}_mode.sh
48sleep 10
49
50export exec_time=20
51
52export pub_string="-pub \
53 -transport SHMEM \
54 -noPrint \
55 -exec $exec_time"
56
57if [[ ${lat_thr} == "lat" ]]; then
58 export pub_string="$pub_string \
59 -latencyTest"
60fi
61
62export sub_string="-sub \
63 -transport SHMEM \
64 -noPrint"
65
66if [[ "$pub_sub" == "pub" ]]; then
67 echo "Publisher side"
68 export commands_string=${pub_string}
69 export core=0
70else
71 echo "Subscriber side"
72 export commands_string=${sub_string}
73 export core=1
74fi
75
76mkdir -p $output_folder
77cd $folder_base
78
79export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel.csv
80touch $my_file
81export extra_args=""
82for index in ${num_reps}; do
83 for DATALEN in 32 64 128 256 512 1024 2048 4096 8192 16384 32768 63000 100000 500000 1048576 1548576 4194304 10485760; do
84 export command="taskset -c $core \
85 $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
86 echo $command ---- $index
87 $command >> $my_file;
88 if [[ "$domain" == "1" ]]; then
89 export domain="2"
90 else
91 export domain="1"
92 fi
93 export extra_args=" -noOutputHeaders "
94 done
95done
96
97export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be.csv
98touch $my_file
99export extra_args=""
100for index in ${num_reps}; do
101 for DATALEN in ${dataLens}; do
102 export command="taskset -c $core \
103 $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
104 echo $command ---- $index
105 $command >> $my_file;
106 if [[ "$domain" == "1" ]]; then
107 export domain="2"
108 else
109 export domain="1"
110 fi
111 export extra_args=" -noOutputHeaders "
112 done
113done
114
115export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_rel.csv
116touch $my_file
117export extra_args=""
118for index in ${num_reps}; do
119 for DATALEN in ${dataLens}; do
120 export command="taskset -c $core \
121 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 $commands_string $extra_args"
122 echo $command ---- $index
123 $command >> $my_file;
124 if [[ "$domain" == "1" ]]; then
125 export domain="2"
126 else
127 export domain="1"
128 fi
129 export extra_args=" -noOutputHeaders "
130 done
131done
132
133export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_be.csv
134touch $my_file
135export extra_args=""
136for index in ${num_reps}; do
137 for DATALEN in ${dataLens}; do
138 export command="taskset -c $core \
139 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 -best $commands_string $extra_args"
140 echo $command ---- $index
141 $command >> $my_file;
142 if [[ "$domain" == "1" ]]; then
143 export domain="2"
144 else
145 export domain="1"
146 fi
147 export extra_args=" -noOutputHeaders "
148 done
149done
150
151if [[ ${lat_thr} == "thr" ]]; then
152
153 if [[ "$pub_sub" == "pub" ]]; then
154 echo "Publisher side"
155 export commands_string="${commands_string} -batchSize 0"
156 fi
157
158 export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be_noBatch.csv
159 touch $my_file
160 export extra_args=""
161 for index in ${num_reps}; do
162 for DATALEN in ${dataLens}; do
163 export command="taskset -c $core \
164 $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
165 echo $command ---- $index
166 $command >> $my_file;
167 if [[ "$domain" == "1" ]]; then
168 export domain="2"
169 else
170 export domain="1"
171 fi
172 export extra_args=" -noOutputHeaders "
173 done
174 done
175
176 export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel_noBatch.csv
177 touch $my_file
178 export extra_args=""
179 for index in ${num_reps}; do
180 for DATALEN in ${dataLens}; do
181 export command="taskset -c $core \
182 $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
183 echo $command ---- $index
184 $command >> $my_file;
185 if [[ "$domain" == "1" ]]; then
186 export domain="2"
187 else
188 export domain="1"
189 fi
190 export extra_args=" -noOutputHeaders "
191 done
192 done
193
194fi
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 |
3648753 |
182760 |
50.8 |
0 |
0.00 |
64 |
3438592 |
171837 |
92.0 |
0 |
0.00 |
128 |
3049856 |
152324 |
156.0 |
0 |
0.00 |
256 |
2457998 |
122834 |
251.6 |
0 |
0.00 |
512 |
1780472 |
88933 |
364.3 |
0 |
0.00 |
1024 |
1140624 |
56995 |
466.9 |
0 |
0.00 |
2048 |
667448 |
33355 |
546.5 |
12 |
0.00 |
4096 |
365683 |
18263 |
598.5 |
0 |
0.00 |
8192 |
219297 |
10954 |
717.9 |
29871 |
11.99 |
16384 |
202293 |
10104 |
1324.5 |
18289 |
8.29 |
32768 |
174523 |
8715 |
2284.7 |
17289 |
9.01 |
63000 |
137932 |
6887 |
3471.3 |
5199 |
3.63 |
Reliable
Sample Size (Bytes) |
Total Samples |
Avg Samples/s |
Avg Mbps |
Lost Samples |
Lost Samples (%) |
---|---|---|---|---|---|
32 |
3428096 |
171244 |
43.8 |
0 |
0.00 |
64 |
3220992 |
160971 |
82.4 |
0 |
0.00 |
128 |
2770048 |
138324 |
141.6 |
0 |
0.00 |
256 |
2153088 |
107586 |
220.3 |
0 |
0.00 |
512 |
1623536 |
81113 |
332.2 |
0 |
0.00 |
1024 |
1157392 |
57806 |
473.6 |
0 |
0.00 |
2048 |
675324 |
33730 |
552.6 |
0 |
0.00 |
4096 |
356478 |
17806 |
583.5 |
0 |
0.00 |
8192 |
191750 |
9575 |
627.6 |
0 |
0.00 |
16384 |
174685 |
8721 |
1143.2 |
0 |
0.00 |
32768 |
134147 |
6705 |
1757.7 |
0 |
0.00 |
63000 |
94519 |
4720 |
2379.3 |
0 |
0.00 |
100000 |
46175 |
2306 |
1845.1 |
0 |
0.00 |
500000 |
15837 |
792 |
3168.2 |
0 |
0.00 |
1048576 |
4681 |
234 |
1966.3 |
0 |
0.00 |
1548576 |
3335 |
167 |
2072.8 |
0 |
0.00 |
4194304 |
1323 |
66 |
2239.8 |
0 |
0.00 |
10485760 |
543 |
27 |
2317.4 |
0 |
0.00 |
Perftest Scripts
To produce these tests, we executed RTI Perftest for C++98. The script used to execute the tests can be found here:
1echo EXECUTABLE IS $1
2export executable=$1
3export folder_base="$(dirname "${executable}")"/../../..
4
5echo OUTPUT PATH IS $2
6export output_folder=$2
7export pub_sub="pub"
8export lat_thr="lat"
9export num_reps="1 2 3 4"
10export dataLens="32 64 128 256 512 1024 2048 4096 8192 16384 32768 63000"
11export domain="2"
12
13if [[ -z "$3" ]]; then
14 echo "You need a third argument with publisher or subscriber"
15 exit -1
16else
17 if [[ "$3" == "publisher" ]]; then
18 echo "Publisher"
19 export pub_sub="pub"
20
21 elif [[ "$3" == "subscriber" ]]; then
22 echo "Subscriber"
23 export pub_sub="sub"
24 else
25 echo "It must be either publisher or subscriber"
26 exit -1
27 fi
28fi
29
30if [[ -z "$4" ]]; then
31 echo "You need a forth argument with lat or thr"
32 exit -1
33else
34 if [[ "$4" == "thr" ]]; then
35 echo "Throughput test"
36 export ${lat_thr}_thr="thr"
37
38 elif [[ "$4" == "lat" ]]; then
39 echo "Latency test"
40 export ${lat_thr}_thr="lat"
41 else
42 echo "It must be either lat or thr"
43 exit -1
44 fi
45fi
46
47sudo /set_${lat_thr}_mode.sh
48sleep 10
49
50export exec_time=20
51
52export pub_string="-pub \
53 -transport SHMEM \
54 -noPrint \
55 -exec $exec_time"
56
57if [[ ${lat_thr} == "lat" ]]; then
58 export pub_string="$pub_string \
59 -latencyTest"
60fi
61
62export sub_string="-sub \
63 -transport SHMEM \
64 -noPrint"
65
66if [[ "$pub_sub" == "pub" ]]; then
67 echo "Publisher side"
68 export commands_string=${pub_string}
69 export core=0
70else
71 echo "Subscriber side"
72 export commands_string=${sub_string}
73 export core=1
74fi
75
76mkdir -p $output_folder
77cd $folder_base
78
79export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel.csv
80touch $my_file
81export extra_args=""
82for index in ${num_reps}; do
83 for DATALEN in 32 64 128 256 512 1024 2048 4096 8192 16384 32768 63000 100000 500000 1048576 1548576 4194304 10485760; do
84 export command="taskset -c $core \
85 $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
86 echo $command ---- $index
87 $command >> $my_file;
88 if [[ "$domain" == "1" ]]; then
89 export domain="2"
90 else
91 export domain="1"
92 fi
93 export extra_args=" -noOutputHeaders "
94 done
95done
96
97export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be.csv
98touch $my_file
99export extra_args=""
100for index in ${num_reps}; do
101 for DATALEN in ${dataLens}; do
102 export command="taskset -c $core \
103 $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
104 echo $command ---- $index
105 $command >> $my_file;
106 if [[ "$domain" == "1" ]]; then
107 export domain="2"
108 else
109 export domain="1"
110 fi
111 export extra_args=" -noOutputHeaders "
112 done
113done
114
115export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_rel.csv
116touch $my_file
117export extra_args=""
118for index in ${num_reps}; do
119 for DATALEN in ${dataLens}; do
120 export command="taskset -c $core \
121 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 $commands_string $extra_args"
122 echo $command ---- $index
123 $command >> $my_file;
124 if [[ "$domain" == "1" ]]; then
125 export domain="2"
126 else
127 export domain="1"
128 fi
129 export extra_args=" -noOutputHeaders "
130 done
131done
132
133export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_be.csv
134touch $my_file
135export extra_args=""
136for index in ${num_reps}; do
137 for DATALEN in ${dataLens}; do
138 export command="taskset -c $core \
139 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 -best $commands_string $extra_args"
140 echo $command ---- $index
141 $command >> $my_file;
142 if [[ "$domain" == "1" ]]; then
143 export domain="2"
144 else
145 export domain="1"
146 fi
147 export extra_args=" -noOutputHeaders "
148 done
149done
150
151if [[ ${lat_thr} == "thr" ]]; then
152
153 if [[ "$pub_sub" == "pub" ]]; then
154 echo "Publisher side"
155 export commands_string="${commands_string} -batchSize 0"
156 fi
157
158 export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be_noBatch.csv
159 touch $my_file
160 export extra_args=""
161 for index in ${num_reps}; do
162 for DATALEN in ${dataLens}; do
163 export command="taskset -c $core \
164 $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
165 echo $command ---- $index
166 $command >> $my_file;
167 if [[ "$domain" == "1" ]]; then
168 export domain="2"
169 else
170 export domain="1"
171 fi
172 export extra_args=" -noOutputHeaders "
173 done
174 done
175
176 export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel_noBatch.csv
177 touch $my_file
178 export extra_args=""
179 for index in ${num_reps}; do
180 for DATALEN in ${dataLens}; do
181 export command="taskset -c $core \
182 $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
183 echo $command ---- $index
184 $command >> $my_file;
185 if [[ "$domain" == "1" ]]; then
186 export domain="2"
187 else
188 export domain="1"
189 fi
190 export extra_args=" -noOutputHeaders "
191 done
192 done
193
194fi
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.7 |
9 |
162 |
11 |
11 |
13 |
19 |
162 |
64 |
11 |
0.7 |
9 |
158 |
10 |
11 |
12 |
18 |
158 |
128 |
11 |
0.7 |
9 |
165 |
11 |
11 |
13 |
20 |
165 |
256 |
11 |
0.6 |
9 |
164 |
11 |
11 |
13 |
20 |
164 |
512 |
11 |
0.6 |
9 |
165 |
11 |
11 |
13 |
19 |
165 |
1024 |
11 |
0.6 |
10 |
164 |
11 |
12 |
13 |
20 |
164 |
2048 |
11 |
0.6 |
10 |
164 |
11 |
12 |
13 |
20 |
164 |
4096 |
11 |
0.7 |
10 |
169 |
11 |
12 |
13 |
20 |
169 |
8192 |
12 |
0.7 |
10 |
166 |
12 |
12 |
14 |
21 |
166 |
16384 |
13 |
0.7 |
11 |
168 |
13 |
14 |
15 |
22 |
168 |
32768 |
15 |
0.8 |
14 |
168 |
15 |
16 |
17 |
24 |
168 |
63000 |
19 |
0.8 |
18 |
174 |
19 |
20 |
21 |
29 |
174 |
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 |
13 |
1.0 |
11 |
170 |
12 |
14 |
17 |
22 |
170 |
64 |
13 |
1.0 |
11 |
171 |
12 |
14 |
17 |
22 |
171 |
128 |
13 |
1.0 |
11 |
170 |
12 |
14 |
17 |
22 |
170 |
256 |
13 |
1.0 |
11 |
170 |
12 |
14 |
17 |
22 |
170 |
512 |
13 |
1.0 |
11 |
170 |
12 |
14 |
17 |
22 |
170 |
1024 |
13 |
1.0 |
11 |
170 |
12 |
14 |
17 |
22 |
170 |
2048 |
13 |
1.0 |
11 |
169 |
12 |
14 |
17 |
22 |
169 |
4096 |
13 |
0.9 |
12 |
172 |
13 |
14 |
17 |
22 |
172 |
8192 |
14 |
1.0 |
12 |
173 |
13 |
15 |
18 |
22 |
173 |
16384 |
15 |
1.0 |
13 |
227 |
14 |
15 |
19 |
25 |
227 |
32768 |
17 |
1.0 |
16 |
179 |
17 |
18 |
22 |
27 |
179 |
63000 |
22 |
1.6 |
19 |
171 |
21 |
22 |
32 |
38 |
171 |
Perftest Scripts
To produce these tests, we executed RTI Perftest for C++98. The exact script used can be found here:
1echo EXECUTABLE IS $1
2export executable=$1
3export folder_base="$(dirname "${executable}")"/../../..
4
5echo OUTPUT PATH IS $2
6export output_folder=$2
7export pub_sub="pub"
8export lat_thr="lat"
9export num_reps="1 2 3 4"
10export dataLens="32 64 128 256 512 1024 2048 4096 8192 16384 32768 63000"
11export domain="2"
12
13if [[ -z "$3" ]]; then
14 echo "You need a third argument with publisher or subscriber"
15 exit -1
16else
17 if [[ "$3" == "publisher" ]]; then
18 echo "Publisher"
19 export pub_sub="pub"
20
21 elif [[ "$3" == "subscriber" ]]; then
22 echo "Subscriber"
23 export pub_sub="sub"
24 else
25 echo "It must be either publisher or subscriber"
26 exit -1
27 fi
28fi
29
30if [[ -z "$4" ]]; then
31 echo "You need a forth argument with lat or thr"
32 exit -1
33else
34 if [[ "$4" == "thr" ]]; then
35 echo "Throughput test"
36 export ${lat_thr}_thr="thr"
37
38 elif [[ "$4" == "lat" ]]; then
39 echo "Latency test"
40 export ${lat_thr}_thr="lat"
41 else
42 echo "It must be either lat or thr"
43 exit -1
44 fi
45fi
46
47sudo /set_${lat_thr}_mode.sh
48sleep 10
49
50export exec_time=20
51
52export pub_string="-pub \
53 -transport SHMEM \
54 -noPrint \
55 -exec $exec_time"
56
57if [[ ${lat_thr} == "lat" ]]; then
58 export pub_string="$pub_string \
59 -latencyTest"
60fi
61
62export sub_string="-sub \
63 -transport SHMEM \
64 -noPrint"
65
66if [[ "$pub_sub" == "pub" ]]; then
67 echo "Publisher side"
68 export commands_string=${pub_string}
69 export core=0
70else
71 echo "Subscriber side"
72 export commands_string=${sub_string}
73 export core=1
74fi
75
76mkdir -p $output_folder
77cd $folder_base
78
79export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel.csv
80touch $my_file
81export extra_args=""
82for index in ${num_reps}; do
83 for DATALEN in 32 64 128 256 512 1024 2048 4096 8192 16384 32768 63000 100000 500000 1048576 1548576 4194304 10485760; do
84 export command="taskset -c $core \
85 $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
86 echo $command ---- $index
87 $command >> $my_file;
88 if [[ "$domain" == "1" ]]; then
89 export domain="2"
90 else
91 export domain="1"
92 fi
93 export extra_args=" -noOutputHeaders "
94 done
95done
96
97export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be.csv
98touch $my_file
99export extra_args=""
100for index in ${num_reps}; do
101 for DATALEN in ${dataLens}; do
102 export command="taskset -c $core \
103 $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
104 echo $command ---- $index
105 $command >> $my_file;
106 if [[ "$domain" == "1" ]]; then
107 export domain="2"
108 else
109 export domain="1"
110 fi
111 export extra_args=" -noOutputHeaders "
112 done
113done
114
115export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_rel.csv
116touch $my_file
117export extra_args=""
118for index in ${num_reps}; do
119 for DATALEN in ${dataLens}; do
120 export command="taskset -c $core \
121 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 $commands_string $extra_args"
122 echo $command ---- $index
123 $command >> $my_file;
124 if [[ "$domain" == "1" ]]; then
125 export domain="2"
126 else
127 export domain="1"
128 fi
129 export extra_args=" -noOutputHeaders "
130 done
131done
132
133export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_be.csv
134touch $my_file
135export extra_args=""
136for index in ${num_reps}; do
137 for DATALEN in ${dataLens}; do
138 export command="taskset -c $core \
139 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 -best $commands_string $extra_args"
140 echo $command ---- $index
141 $command >> $my_file;
142 if [[ "$domain" == "1" ]]; then
143 export domain="2"
144 else
145 export domain="1"
146 fi
147 export extra_args=" -noOutputHeaders "
148 done
149done
150
151if [[ ${lat_thr} == "thr" ]]; then
152
153 if [[ "$pub_sub" == "pub" ]]; then
154 echo "Publisher side"
155 export commands_string="${commands_string} -batchSize 0"
156 fi
157
158 export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be_noBatch.csv
159 touch $my_file
160 export extra_args=""
161 for index in ${num_reps}; do
162 for DATALEN in ${dataLens}; do
163 export command="taskset -c $core \
164 $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
165 echo $command ---- $index
166 $command >> $my_file;
167 if [[ "$domain" == "1" ]]; then
168 export domain="2"
169 else
170 export domain="1"
171 fi
172 export extra_args=" -noOutputHeaders "
173 done
174 done
175
176 export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel_noBatch.csv
177 touch $my_file
178 export extra_args=""
179 for index in ${num_reps}; do
180 for DATALEN in ${dataLens}; do
181 export command="taskset -c $core \
182 $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
183 echo $command ---- $index
184 $command >> $my_file;
185 if [[ "$domain" == "1" ]]; then
186 export domain="2"
187 else
188 export domain="1"
189 fi
190 export extra_args=" -noOutputHeaders "
191 done
192 done
193
194fi
Test Hardware
The following hardware was used to perform these tests:
Linux Nodes
Dell R340 Servers (13 Units)
Processor: Intel Xeon E-2278G (3.4-5GHz, 8c/16t, 16MB cache, 2 memory channels @2666MHz)
RAM: 4x 16GB 2666MHz DIMM (64GB RAM)
HD: 480GB SATA SSD
NIC 1: Intel 710 dual port 10Gbps SFP
OS: Ubuntu 20.04 -- gcc 9.3.0
Switch
Dell 2048 -- 10Gbps switch
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 |
23769600 |
1187436 |
304.0 |
420352 |
1.74 |
64 |
23652864 |
1181240 |
604.8 |
469760 |
1.95 |
128 |
23438400 |
1170959 |
1199.1 |
32000 |
0.14 |
256 |
21720288 |
1085308 |
2222.7 |
26720 |
0.12 |
512 |
19125488 |
955593 |
3914.1 |
24448 |
0.13 |
1024 |
16113368 |
805093 |
6595.3 |
22896 |
0.14 |
2048 |
12337797 |
616513 |
10101.0 |
16260 |
0.13 |
4096 |
8493406 |
424383 |
13906.2 |
12256 |
0.14 |
8192 |
6838428 |
341676 |
22392.1 |
14854 |
0.22 |
16384 |
5157754 |
257664 |
33772.6 |
4483 |
0.09 |
32768 |
3818237 |
190696 |
49990.0 |
0 |
0.00 |
63000 |
2545156 |
127150 |
64083.8 |
0 |
0.00 |
Reliable
Sample Size (Bytes) |
Total Samples |
Avg Samples/s |
Avg Mbps |
Lost Samples |
Lost Samples (%) |
---|---|---|---|---|---|
32 |
21291008 |
1062740 |
272.1 |
0 |
0.00 |
64 |
21541582 |
1075465 |
550.6 |
0 |
0.00 |
128 |
20989119 |
1048481 |
1073.6 |
0 |
0.00 |
256 |
19582048 |
978366 |
2003.7 |
0 |
0.00 |
512 |
17038288 |
851080 |
3486.0 |
0 |
0.00 |
1024 |
13600728 |
679102 |
5563.2 |
0 |
0.00 |
2048 |
9823701 |
490505 |
8036.4 |
0 |
0.00 |
4096 |
6232157 |
311163 |
10196.2 |
0 |
0.00 |
8192 |
4166578 |
208022 |
13633.0 |
0 |
0.00 |
16384 |
3528265 |
176162 |
23089.9 |
0 |
0.00 |
32768 |
2734406 |
136533 |
35791.4 |
0 |
0.00 |
63000 |
2017742 |
100754 |
50780.1 |
0 |
0.00 |
Perftest Scripts
To produce these tests, we executed RTI Perftest for C++98. The exact script used can be found here:
1echo EXECUTABLE IS $1
2export executable=$1
3export folder_base="$(dirname "${executable}")"/../../..
4
5echo OUTPUT PATH IS $2
6export output_folder=$2
7export pub_sub="pub"
8export lat_thr="lat"
9export num_reps="1 2 3 4"
10export dataLens="32 64 128 256 512 1024 2048 4096 8192 16384 32768 63000"
11export domain="2"
12
13if [[ -z "$3" ]]; then
14 echo "You need a third argument with publisher or subscriber"
15 exit -1
16else
17 if [[ "$3" == "publisher" ]]; then
18 echo "Publisher"
19 export pub_sub="pub"
20
21 elif [[ "$3" == "subscriber" ]]; then
22 echo "Subscriber"
23 export pub_sub="sub"
24 else
25 echo "It must be either publisher or subscriber"
26 exit -1
27 fi
28fi
29
30if [[ -z "$4" ]]; then
31 echo "You need a forth argument with lat or thr"
32 exit -1
33else
34 if [[ "$4" == "thr" ]]; then
35 echo "Throughput test"
36 export ${lat_thr}_thr="thr"
37
38 elif [[ "$4" == "lat" ]]; then
39 echo "Latency test"
40 export ${lat_thr}_thr="lat"
41 else
42 echo "It must be either lat or thr"
43 exit -1
44 fi
45fi
46
47sudo /set_${lat_thr}_mode.sh
48sleep 10
49
50export exec_time=20
51
52export pub_string="-pub \
53 -transport SHMEM \
54 -noPrint \
55 -exec $exec_time"
56
57if [[ ${lat_thr} == "lat" ]]; then
58 export pub_string="$pub_string \
59 -latencyTest"
60fi
61
62export sub_string="-sub \
63 -transport SHMEM \
64 -noPrint"
65
66if [[ "$pub_sub" == "pub" ]]; then
67 echo "Publisher side"
68 export commands_string=${pub_string}
69 export core=0
70else
71 echo "Subscriber side"
72 export commands_string=${sub_string}
73 export core=1
74fi
75
76mkdir -p $output_folder
77cd $folder_base
78
79export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel.csv
80touch $my_file
81export extra_args=""
82for index in ${num_reps}; do
83 for DATALEN in 32 64 128 256 512 1024 2048 4096 8192 16384 32768 63000 100000 500000 1048576 1548576 4194304 10485760; do
84 export command="taskset -c $core \
85 $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
86 echo $command ---- $index
87 $command >> $my_file;
88 if [[ "$domain" == "1" ]]; then
89 export domain="2"
90 else
91 export domain="1"
92 fi
93 export extra_args=" -noOutputHeaders "
94 done
95done
96
97export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be.csv
98touch $my_file
99export extra_args=""
100for index in ${num_reps}; do
101 for DATALEN in ${dataLens}; do
102 export command="taskset -c $core \
103 $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
104 echo $command ---- $index
105 $command >> $my_file;
106 if [[ "$domain" == "1" ]]; then
107 export domain="2"
108 else
109 export domain="1"
110 fi
111 export extra_args=" -noOutputHeaders "
112 done
113done
114
115export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_rel.csv
116touch $my_file
117export extra_args=""
118for index in ${num_reps}; do
119 for DATALEN in ${dataLens}; do
120 export command="taskset -c $core \
121 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 $commands_string $extra_args"
122 echo $command ---- $index
123 $command >> $my_file;
124 if [[ "$domain" == "1" ]]; then
125 export domain="2"
126 else
127 export domain="1"
128 fi
129 export extra_args=" -noOutputHeaders "
130 done
131done
132
133export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_be.csv
134touch $my_file
135export extra_args=""
136for index in ${num_reps}; do
137 for DATALEN in ${dataLens}; do
138 export command="taskset -c $core \
139 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 -best $commands_string $extra_args"
140 echo $command ---- $index
141 $command >> $my_file;
142 if [[ "$domain" == "1" ]]; then
143 export domain="2"
144 else
145 export domain="1"
146 fi
147 export extra_args=" -noOutputHeaders "
148 done
149done
150
151if [[ ${lat_thr} == "thr" ]]; then
152
153 if [[ "$pub_sub" == "pub" ]]; then
154 echo "Publisher side"
155 export commands_string="${commands_string} -batchSize 0"
156 fi
157
158 export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be_noBatch.csv
159 touch $my_file
160 export extra_args=""
161 for index in ${num_reps}; do
162 for DATALEN in ${dataLens}; do
163 export command="taskset -c $core \
164 $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
165 echo $command ---- $index
166 $command >> $my_file;
167 if [[ "$domain" == "1" ]]; then
168 export domain="2"
169 else
170 export domain="1"
171 fi
172 export extra_args=" -noOutputHeaders "
173 done
174 done
175
176 export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel_noBatch.csv
177 touch $my_file
178 export extra_args=""
179 for index in ${num_reps}; do
180 for DATALEN in ${dataLens}; do
181 export command="taskset -c $core \
182 $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
183 echo $command ---- $index
184 $command >> $my_file;
185 if [[ "$domain" == "1" ]]; then
186 export domain="2"
187 else
188 export domain="1"
189 fi
190 export extra_args=" -noOutputHeaders "
191 done
192 done
193
194fi
Test Hardware
The following hardware was used to perform these tests:
Linux Nodes
Dell R340 Servers (13 Units)
Processor: Intel Xeon E-2278G (3.4-5GHz, 8c/16t, 16MB cache, 2 memory channels @2666MHz)
RAM: 4x 16GB 2666MHz DIMM (64GB RAM)
HD: 480GB SATA SSD
NIC 1: Intel 710 dual port 10Gbps SFP
OS: Ubuntu 20.04 -- gcc 9.3.0
Switch
Dell 2048 -- 10Gbps switch
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 |
112 |
11.6 |
101 |
826 |
109 |
120 |
149 |
334 |
826 |
64 |
112 |
11.5 |
100 |
827 |
108 |
119 |
150 |
337 |
827 |
128 |
111 |
11.4 |
100 |
835 |
108 |
119 |
146 |
340 |
835 |
256 |
111 |
11.2 |
101 |
830 |
108 |
118 |
147 |
327 |
830 |
512 |
112 |
11.9 |
102 |
839 |
108 |
120 |
152 |
339 |
839 |
1024 |
114 |
11.8 |
103 |
836 |
110 |
122 |
153 |
337 |
836 |
2048 |
116 |
12.2 |
104 |
842 |
112 |
124 |
158 |
353 |
842 |
4096 |
120 |
12.0 |
106 |
846 |
117 |
129 |
160 |
344 |
846 |
8192 |
124 |
12.8 |
113 |
850 |
120 |
134 |
167 |
359 |
850 |
16384 |
139 |
13.0 |
127 |
543 |
135 |
148 |
185 |
368 |
543 |
32768 |
169 |
14.9 |
155 |
603 |
164 |
182 |
219 |
441 |
603 |
63000 |
234 |
19.1 |
213 |
801 |
228 |
253 |
292 |
569 |
801 |
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 |
130 |
31.5 |
109 |
605 |
116 |
188 |
235 |
458 |
605 |
64 |
132 |
31.1 |
111 |
548 |
119 |
188 |
241 |
455 |
548 |
128 |
130 |
31.5 |
108 |
586 |
116 |
188 |
227 |
442 |
586 |
256 |
130 |
31.8 |
108 |
554 |
116 |
189 |
235 |
458 |
554 |
512 |
133 |
32.7 |
110 |
590 |
118 |
193 |
242 |
442 |
590 |
1024 |
134 |
32.4 |
111 |
547 |
120 |
194 |
241 |
449 |
547 |
2048 |
138 |
34.4 |
113 |
625 |
122 |
203 |
256 |
488 |
625 |
4096 |
143 |
34.3 |
119 |
627 |
128 |
207 |
260 |
478 |
627 |
8192 |
153 |
35.6 |
126 |
685 |
137 |
219 |
270 |
494 |
685 |
16384 |
170 |
37.4 |
142 |
686 |
153 |
238 |
297 |
572 |
686 |
32768 |
209 |
39.1 |
174 |
883 |
191 |
276 |
340 |
760 |
883 |
63000 |
280 |
43.3 |
243 |
1058 |
258 |
346 |
413 |
928 |
1058 |
Perftest Scripts
To produce these tests, we executed RTI Perftest for C++98. The script used to execute the tests can be found here:
1echo EXECUTABLE IS $1
2export executable=$1
3export folder_base="$(dirname "${executable}")"/../../..
4
5echo OUTPUT PATH IS $2
6export output_folder=$2
7export pub_sub="pub"
8export lat_thr="lat"
9export num_reps="1 2 3 4"
10export dataLens="32 64 128 256 512 1024 2048 4096 8192 16384 32768 63000"
11export domain="2"
12
13if [[ -z "$3" ]]; then
14 echo "You need a third argument with publisher or subscriber"
15 exit -1
16else
17 if [[ "$3" == "publisher" ]]; then
18 echo "Publisher"
19 export pub_sub="pub"
20
21 elif [[ "$3" == "subscriber" ]]; then
22 echo "Subscriber"
23 export pub_sub="sub"
24 else
25 echo "It must be either publisher or subscriber"
26 exit -1
27 fi
28fi
29
30if [[ -z "$4" ]]; then
31 echo "You need a forth argument with lat or thr"
32 exit -1
33else
34 if [[ "$4" == "thr" ]]; then
35 echo "Throughput test"
36 export ${lat_thr}_thr="thr"
37
38 elif [[ "$4" == "lat" ]]; then
39 echo "Latency test"
40 export ${lat_thr}_thr="lat"
41 else
42 echo "It must be either lat or thr"
43 exit -1
44 fi
45fi
46
47sudo /set_${lat_thr}_mode.sh
48sleep 10
49
50export exec_time=20
51
52export pub_string="-pub \
53 -transport SHMEM \
54 -noPrint \
55 -exec $exec_time"
56
57if [[ ${lat_thr} == "lat" ]]; then
58 export pub_string="$pub_string \
59 -latencyTest"
60fi
61
62export sub_string="-sub \
63 -transport SHMEM \
64 -noPrint"
65
66if [[ "$pub_sub" == "pub" ]]; then
67 echo "Publisher side"
68 export commands_string=${pub_string}
69 export core=0
70else
71 echo "Subscriber side"
72 export commands_string=${sub_string}
73 export core=1
74fi
75
76mkdir -p $output_folder
77cd $folder_base
78
79export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel.csv
80touch $my_file
81export extra_args=""
82for index in ${num_reps}; do
83 for DATALEN in 32 64 128 256 512 1024 2048 4096 8192 16384 32768 63000 100000 500000 1048576 1548576 4194304 10485760; do
84 export command="taskset -c $core \
85 $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
86 echo $command ---- $index
87 $command >> $my_file;
88 if [[ "$domain" == "1" ]]; then
89 export domain="2"
90 else
91 export domain="1"
92 fi
93 export extra_args=" -noOutputHeaders "
94 done
95done
96
97export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be.csv
98touch $my_file
99export extra_args=""
100for index in ${num_reps}; do
101 for DATALEN in ${dataLens}; do
102 export command="taskset -c $core \
103 $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
104 echo $command ---- $index
105 $command >> $my_file;
106 if [[ "$domain" == "1" ]]; then
107 export domain="2"
108 else
109 export domain="1"
110 fi
111 export extra_args=" -noOutputHeaders "
112 done
113done
114
115export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_rel.csv
116touch $my_file
117export extra_args=""
118for index in ${num_reps}; do
119 for DATALEN in ${dataLens}; do
120 export command="taskset -c $core \
121 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 $commands_string $extra_args"
122 echo $command ---- $index
123 $command >> $my_file;
124 if [[ "$domain" == "1" ]]; then
125 export domain="2"
126 else
127 export domain="1"
128 fi
129 export extra_args=" -noOutputHeaders "
130 done
131done
132
133export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_be.csv
134touch $my_file
135export extra_args=""
136for index in ${num_reps}; do
137 for DATALEN in ${dataLens}; do
138 export command="taskset -c $core \
139 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 -best $commands_string $extra_args"
140 echo $command ---- $index
141 $command >> $my_file;
142 if [[ "$domain" == "1" ]]; then
143 export domain="2"
144 else
145 export domain="1"
146 fi
147 export extra_args=" -noOutputHeaders "
148 done
149done
150
151if [[ ${lat_thr} == "thr" ]]; then
152
153 if [[ "$pub_sub" == "pub" ]]; then
154 echo "Publisher side"
155 export commands_string="${commands_string} -batchSize 0"
156 fi
157
158 export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be_noBatch.csv
159 touch $my_file
160 export extra_args=""
161 for index in ${num_reps}; do
162 for DATALEN in ${dataLens}; do
163 export command="taskset -c $core \
164 $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
165 echo $command ---- $index
166 $command >> $my_file;
167 if [[ "$domain" == "1" ]]; then
168 export domain="2"
169 else
170 export domain="1"
171 fi
172 export extra_args=" -noOutputHeaders "
173 done
174 done
175
176 export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel_noBatch.csv
177 touch $my_file
178 export extra_args=""
179 for index in ${num_reps}; do
180 for DATALEN in ${dataLens}; do
181 export command="taskset -c $core \
182 $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
183 echo $command ---- $index
184 $command >> $my_file;
185 if [[ "$domain" == "1" ]]; then
186 export domain="2"
187 else
188 export domain="1"
189 fi
190 export extra_args=" -noOutputHeaders "
191 done
192 done
193
194fi
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 |
1218048 |
61039 |
15.6 |
9984 |
0.81 |
64 |
1178820 |
58906 |
30.2 |
16000 |
1.34 |
128 |
1145524 |
57223 |
58.6 |
19328 |
1.66 |
256 |
1052864 |
52612 |
107.8 |
18624 |
1.74 |
512 |
881456 |
44045 |
180.4 |
17584 |
1.96 |
1024 |
689464 |
34456 |
282.3 |
14344 |
2.04 |
2048 |
480416 |
23996 |
393.2 |
9108 |
1.86 |
4096 |
305698 |
15269 |
500.4 |
7088 |
2.27 |
8192 |
191114 |
9546 |
625.6 |
47164 |
19.79 |
16384 |
181163 |
9049 |
1186.1 |
41129 |
18.50 |
32768 |
169175 |
8450 |
2215.2 |
29339 |
14.78 |
63000 |
146353 |
7305 |
3681.8 |
22038 |
13.09 |
Reliable
Sample Size (Bytes) |
Total Samples |
Avg Samples/s |
Avg Mbps |
Lost Samples |
Lost Samples (%) |
---|---|---|---|---|---|
32 |
989184 |
49269 |
12.6 |
0 |
0.00 |
64 |
1022040 |
50892 |
26.1 |
0 |
0.00 |
128 |
951360 |
47472 |
48.6 |
0 |
0.00 |
256 |
759937 |
37920 |
77.7 |
0 |
0.00 |
512 |
643665 |
32145 |
131.7 |
0 |
0.00 |
1024 |
523345 |
26134 |
214.1 |
0 |
0.00 |
2048 |
380457 |
18998 |
331.3 |
0 |
0.00 |
4096 |
250596 |
12514 |
440.1 |
0 |
0.00 |
8192 |
166771 |
8328 |
545.8 |
0 |
0.00 |
16384 |
148121 |
7396 |
969.5 |
0 |
0.00 |
32768 |
123824 |
6184 |
1621.2 |
0 |
0.00 |
63000 |
97426 |
4869 |
2454.2 |
0 |
0.00 |
Perftest Scripts
To produce these tests, we executed RTI Perftest for C++98. The script used to execute the tests can be found here:
1echo EXECUTABLE IS $1
2export executable=$1
3export folder_base="$(dirname "${executable}")"/../../..
4
5echo OUTPUT PATH IS $2
6export output_folder=$2
7export pub_sub="pub"
8export lat_thr="lat"
9export num_reps="1 2 3 4"
10export dataLens="32 64 128 256 512 1024 2048 4096 8192 16384 32768 63000"
11export domain="2"
12
13if [[ -z "$3" ]]; then
14 echo "You need a third argument with publisher or subscriber"
15 exit -1
16else
17 if [[ "$3" == "publisher" ]]; then
18 echo "Publisher"
19 export pub_sub="pub"
20
21 elif [[ "$3" == "subscriber" ]]; then
22 echo "Subscriber"
23 export pub_sub="sub"
24 else
25 echo "It must be either publisher or subscriber"
26 exit -1
27 fi
28fi
29
30if [[ -z "$4" ]]; then
31 echo "You need a forth argument with lat or thr"
32 exit -1
33else
34 if [[ "$4" == "thr" ]]; then
35 echo "Throughput test"
36 export ${lat_thr}_thr="thr"
37
38 elif [[ "$4" == "lat" ]]; then
39 echo "Latency test"
40 export ${lat_thr}_thr="lat"
41 else
42 echo "It must be either lat or thr"
43 exit -1
44 fi
45fi
46
47sudo /set_${lat_thr}_mode.sh
48sleep 10
49
50export exec_time=20
51
52export pub_string="-pub \
53 -transport SHMEM \
54 -noPrint \
55 -exec $exec_time"
56
57if [[ ${lat_thr} == "lat" ]]; then
58 export pub_string="$pub_string \
59 -latencyTest"
60fi
61
62export sub_string="-sub \
63 -transport SHMEM \
64 -noPrint"
65
66if [[ "$pub_sub" == "pub" ]]; then
67 echo "Publisher side"
68 export commands_string=${pub_string}
69 export core=0
70else
71 echo "Subscriber side"
72 export commands_string=${sub_string}
73 export core=1
74fi
75
76mkdir -p $output_folder
77cd $folder_base
78
79export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel.csv
80touch $my_file
81export extra_args=""
82for index in ${num_reps}; do
83 for DATALEN in 32 64 128 256 512 1024 2048 4096 8192 16384 32768 63000 100000 500000 1048576 1548576 4194304 10485760; do
84 export command="taskset -c $core \
85 $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
86 echo $command ---- $index
87 $command >> $my_file;
88 if [[ "$domain" == "1" ]]; then
89 export domain="2"
90 else
91 export domain="1"
92 fi
93 export extra_args=" -noOutputHeaders "
94 done
95done
96
97export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be.csv
98touch $my_file
99export extra_args=""
100for index in ${num_reps}; do
101 for DATALEN in ${dataLens}; do
102 export command="taskset -c $core \
103 $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
104 echo $command ---- $index
105 $command >> $my_file;
106 if [[ "$domain" == "1" ]]; then
107 export domain="2"
108 else
109 export domain="1"
110 fi
111 export extra_args=" -noOutputHeaders "
112 done
113done
114
115export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_rel.csv
116touch $my_file
117export extra_args=""
118for index in ${num_reps}; do
119 for DATALEN in ${dataLens}; do
120 export command="taskset -c $core \
121 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 $commands_string $extra_args"
122 echo $command ---- $index
123 $command >> $my_file;
124 if [[ "$domain" == "1" ]]; then
125 export domain="2"
126 else
127 export domain="1"
128 fi
129 export extra_args=" -noOutputHeaders "
130 done
131done
132
133export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_be.csv
134touch $my_file
135export extra_args=""
136for index in ${num_reps}; do
137 for DATALEN in ${dataLens}; do
138 export command="taskset -c $core \
139 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 -best $commands_string $extra_args"
140 echo $command ---- $index
141 $command >> $my_file;
142 if [[ "$domain" == "1" ]]; then
143 export domain="2"
144 else
145 export domain="1"
146 fi
147 export extra_args=" -noOutputHeaders "
148 done
149done
150
151if [[ ${lat_thr} == "thr" ]]; then
152
153 if [[ "$pub_sub" == "pub" ]]; then
154 echo "Publisher side"
155 export commands_string="${commands_string} -batchSize 0"
156 fi
157
158 export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be_noBatch.csv
159 touch $my_file
160 export extra_args=""
161 for index in ${num_reps}; do
162 for DATALEN in ${dataLens}; do
163 export command="taskset -c $core \
164 $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
165 echo $command ---- $index
166 $command >> $my_file;
167 if [[ "$domain" == "1" ]]; then
168 export domain="2"
169 else
170 export domain="1"
171 fi
172 export extra_args=" -noOutputHeaders "
173 done
174 done
175
176 export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel_noBatch.csv
177 touch $my_file
178 export extra_args=""
179 for index in ${num_reps}; do
180 for DATALEN in ${dataLens}; do
181 export command="taskset -c $core \
182 $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
183 echo $command ---- $index
184 $command >> $my_file;
185 if [[ "$domain" == "1" ]]; then
186 export domain="2"
187 else
188 export domain="1"
189 fi
190 export extra_args=" -noOutputHeaders "
191 done
192 done
193
194fi
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