UDPv4
The following tests have been performed by executing an RTI Perftest C++98 Publisher and Subscriber between two nodes, connected to a switch via Ethernet. The communication has been restricted to a single interface and the transport has been set to UDPv4.
Find information about the hardware, network, and command-line parameters after each of the tests.
Unkeyed, UDPv4 1Gbps Network, C++98
The graph below shows the one-way latency without load between a Publisher and a Subscriber running in two Linux® nodes in a 1Gbps network. 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 |
52 |
1.6 |
48 |
158 |
52 |
55 |
56 |
82 |
158 |
64 |
55 |
1.8 |
50 |
118 |
55 |
57 |
58 |
84 |
118 |
128 |
56 |
1.6 |
51 |
119 |
56 |
58 |
60 |
85 |
119 |
256 |
61 |
1.5 |
56 |
158 |
61 |
63 |
64 |
90 |
158 |
512 |
67 |
1.4 |
62 |
125 |
67 |
68 |
70 |
96 |
125 |
1024 |
80 |
1.4 |
75 |
136 |
80 |
81 |
83 |
108 |
136 |
2048 |
108 |
1.2 |
96 |
158 |
108 |
109 |
110 |
136 |
158 |
4096 |
160 |
1.3 |
154 |
212 |
160 |
161 |
163 |
188 |
212 |
8192 |
265 |
1.5 |
258 |
318 |
265 |
267 |
268 |
295 |
318 |
16384 |
341 |
1.5 |
336 |
397 |
341 |
343 |
344 |
371 |
397 |
32768 |
474 |
1.4 |
467 |
536 |
474 |
475 |
476 |
503 |
536 |
63000 |
735 |
1.6 |
728 |
802 |
735 |
737 |
738 |
766 |
802 |
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 |
55 |
2.2 |
47 |
118 |
56 |
57 |
61 |
84 |
118 |
64 |
57 |
1.6 |
48 |
105 |
57 |
59 |
62 |
86 |
105 |
128 |
58 |
1.8 |
50 |
121 |
58 |
60 |
63 |
88 |
121 |
256 |
64 |
1.4 |
57 |
123 |
63 |
65 |
67 |
92 |
123 |
512 |
69 |
1.5 |
64 |
129 |
68 |
70 |
73 |
98 |
129 |
1024 |
82 |
1.5 |
76 |
138 |
82 |
84 |
86 |
111 |
138 |
2048 |
109 |
1.4 |
104 |
161 |
109 |
111 |
114 |
138 |
161 |
4096 |
162 |
1.3 |
156 |
211 |
162 |
163 |
166 |
191 |
211 |
8192 |
267 |
1.5 |
261 |
320 |
267 |
268 |
271 |
295 |
320 |
16384 |
343 |
1.5 |
337 |
398 |
343 |
345 |
346 |
374 |
398 |
32768 |
475 |
1.5 |
468 |
535 |
475 |
477 |
478 |
505 |
535 |
63000 |
737 |
1.7 |
730 |
804 |
737 |
738 |
741 |
772 |
804 |
100000 |
1044 |
3.9 |
1037 |
1140 |
1043 |
1050 |
1055 |
1140 |
1140 |
500000 |
4314 |
10.6 |
4306 |
4616 |
4312 |
4316 |
4360 |
4616 |
4616 |
1048576 |
8798 |
33.6 |
8774 |
9348 |
8795 |
8806 |
8912 |
9348 |
9348 |
1548576 |
12887 |
30.7 |
12865 |
13655 |
12885 |
12887 |
12906 |
13655 |
13655 |
4194304 |
34644 |
117.7 |
34616 |
36420 |
34633 |
34641 |
34672 |
36420 |
36420 |
10485760 |
86671 |
417.8 |
86603 |
90632 |
86616 |
86627 |
88726 |
90632 |
90632 |
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
3
4echo OUTPUT PATH IS $2
5export output_folder=$2
6export pub_sub="pub"
7export lat_thr="lat"
8export num_reps="1 2"
9export dataLens="32 64 128 256 512 1024 2048 4096 8192 16384 32768 63000"
10export domain="2"
11
12if [[ -z "$3" ]]; then
13 echo "You need a third argument with publisher or subscriber"
14 exit -1
15else
16 if [[ "$3" == "publisher" ]]; then
17 echo "Publisher"
18 export pub_sub="pub"
19
20 elif [[ "$3" == "subscriber" ]]; then
21 echo "Subscriber"
22 export pub_sub="sub"
23 else
24 echo "It must be either publisher or subscriber"
25 exit -1
26 fi
27fi
28
29if [[ -z "$4" ]]; then
30 echo "You need a forth argument with lat or thr"
31 exit -1
32else
33 if [[ "$4" == "thr" ]]; then
34 echo "Throughput test"
35 export ${lat_thr}_thr="thr"
36
37 elif [[ "$4" == "lat" ]]; then
38 echo "Latency test"
39 export ${lat_thr}_thr="lat"
40 else
41 echo "It must be either lat or thr"
42 exit -1
43 fi
44fi
45
46if [[ -z "$5" ]]; then
47 echo "Using default nics"
48 export nic1=eno1
49 export nic2=eno1
50else
51 echo "Using custom nic: $5"
52 export nic1=eno1
53 export nic2=eno1
54fi
55
56sudo /set_${lat_thr}_mode.sh
57sleep 10
58
59export exec_time=20
60
61export pub_string="-pub \
62 -transport UDPv4 \
63 -nic $nic1 \
64 -noPrint \
65 -exec $exec_time \
66 -noXML"
67
68if [[ ${lat_thr} == "lat" ]]; then
69 export pub_string="$pub_string \
70 -latencyTest"
71fi
72
73export sub_string="-sub \
74 -transport UDPv4 \
75 -nic $nic2 \
76 -noPrint \
77 -noXML"
78
79if [[ "$pub_sub" == "pub" ]]; then
80 echo "Publisher side"
81 export commands_string=${pub_string}
82else
83 echo "Subscriber side"
84 export commands_string=${sub_string}
85fi
86
87mkdir -p $output_folder
88
89export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel.csv
90touch $my_file
91export extra_args=""
92for index in ${num_reps}; do
93 for DATALEN in 32 64 128 256 512 1024 2048 4096 8192 16384 32768 63000 100000 500000 1048576 1548576 4194304 10485760; do
94 export command="taskset -c 0 \
95 $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
96 echo $command ---- $index
97 $command >> $my_file;
98 if [[ "$domain" == "1" ]]; then
99 export domain="2"
100 else
101 export domain="1"
102 fi
103 export extra_args=" -noOutputHeaders "
104 done
105done
106
107export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be.csv
108touch $my_file
109export extra_args=""
110for index in ${num_reps}; do
111 for DATALEN in ${dataLens}; do
112 export command="taskset -c 0 \
113 $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
114 echo $command ---- $index
115 $command >> $my_file;
116 if [[ "$domain" == "1" ]]; then
117 export domain="2"
118 else
119 export domain="1"
120 fi
121 export extra_args=" -noOutputHeaders "
122 done
123done
124
125export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_rel.csv
126touch $my_file
127export extra_args=""
128for index in ${num_reps}; do
129 for DATALEN in ${dataLens}; do
130 export command="taskset -c 0 \
131 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 $commands_string $extra_args"
132 echo $command ---- $index
133 $command >> $my_file;
134 if [[ "$domain" == "1" ]]; then
135 export domain="2"
136 else
137 export domain="1"
138 fi
139 export extra_args=" -noOutputHeaders "
140 done
141done
142
143export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_be.csv
144touch $my_file
145export extra_args=""
146for index in ${num_reps}; do
147 for DATALEN in ${dataLens}; do
148 export command="taskset -c 0 \
149 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 -best $commands_string $extra_args"
150 echo $command ---- $index
151 $command >> $my_file;
152 if [[ "$domain" == "1" ]]; then
153 export domain="2"
154 else
155 export domain="1"
156 fi
157 export extra_args=" -noOutputHeaders "
158 done
159done
160
161if [[ ${lat_thr} == "thr" ]]; then
162
163 if [[ "$pub_sub" == "pub" ]]; then
164 echo "Publisher side"
165 export commands_string="${commands_string} -batchSize 0"
166 fi
167
168 export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be_noBatch.csv
169 touch $my_file
170 export extra_args=""
171 for index in ${num_reps}; do
172 for DATALEN in ${dataLens}; do
173 export command="taskset -c 0 \
174 $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
175 echo $command ---- $index
176 $command >> $my_file;
177 if [[ "$domain" == "1" ]]; then
178 export domain="2"
179 else
180 export domain="1"
181 fi
182 export extra_args=" -noOutputHeaders "
183 done
184 done
185
186 export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel_noBatch.csv
187 touch $my_file
188 export extra_args=""
189 for index in ${num_reps}; do
190 for DATALEN in ${dataLens}; do
191 export command="taskset -c 0 \
192 $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
193 echo $command ---- $index
194 $command >> $my_file;
195 if [[ "$domain" == "1" ]]; then
196 export domain="2"
197 else
198 export domain="1"
199 fi
200 export extra_args=" -noOutputHeaders "
201 done
202 done
203
204fi
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 Linux nodes in a 1Gbps network. 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 |
61345353 |
3064094 |
784.4 |
22528 |
0.04 |
64 |
33990656 |
1698534 |
869.6 |
640 |
0.00 |
128 |
18088229 |
903964 |
925.7 |
0 |
0.00 |
256 |
9312320 |
465445 |
953.2 |
0 |
0.00 |
512 |
4725952 |
236241 |
967.6 |
0 |
0.00 |
1024 |
2381168 |
119020 |
975.0 |
0 |
0.00 |
2048 |
1195260 |
59737 |
978.7 |
0 |
0.00 |
4096 |
598672 |
29926 |
980.6 |
0 |
0.00 |
8192 |
300658 |
15027 |
984.9 |
0 |
0.00 |
16384 |
150979 |
7544 |
988.9 |
0 |
0.00 |
32768 |
75608 |
3780 |
990.9 |
17 |
0.02 |
63000 |
39361 |
1967 |
991.6 |
9 |
0.02 |
Reliable
Sample Size (Bytes) |
Total Samples |
Avg Samples/s |
Avg Mbps |
Lost Samples |
Lost Samples (%) |
---|---|---|---|---|---|
32 |
61298433 |
3062660 |
784.0 |
0 |
0.00 |
64 |
33965777 |
1697645 |
869.2 |
0 |
0.00 |
128 |
18073409 |
903470 |
925.2 |
0 |
0.00 |
256 |
9305409 |
465183 |
952.7 |
0 |
0.00 |
512 |
4722833 |
236106 |
967.1 |
0 |
0.00 |
1024 |
2379393 |
118952 |
974.5 |
0 |
0.00 |
2048 |
1194268 |
59703 |
978.2 |
0 |
0.00 |
4096 |
598269 |
29908 |
980.1 |
0 |
0.00 |
8192 |
300481 |
15021 |
984.5 |
0 |
0.00 |
16384 |
147477 |
7371 |
966.2 |
0 |
0.00 |
32768 |
75620 |
3779 |
990.8 |
0 |
0.00 |
63000 |
39361 |
1967 |
991.6 |
0 |
0.00 |
100000 |
24818 |
1238 |
991.1 |
0 |
0.00 |
500000 |
4997 |
247 |
991.5 |
0 |
0.00 |
1048576 |
1401 |
69 |
579.8 |
0 |
0.00 |
1548576 |
1605 |
80 |
991.4 |
0 |
0.00 |
4194304 |
618 |
29 |
986.8 |
0 |
0.00 |
10485760 |
246 |
11 |
985.2 |
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
3
4echo OUTPUT PATH IS $2
5export output_folder=$2
6export pub_sub="pub"
7export lat_thr="lat"
8export num_reps="1 2"
9export dataLens="32 64 128 256 512 1024 2048 4096 8192 16384 32768 63000"
10export domain="2"
11
12if [[ -z "$3" ]]; then
13 echo "You need a third argument with publisher or subscriber"
14 exit -1
15else
16 if [[ "$3" == "publisher" ]]; then
17 echo "Publisher"
18 export pub_sub="pub"
19
20 elif [[ "$3" == "subscriber" ]]; then
21 echo "Subscriber"
22 export pub_sub="sub"
23 else
24 echo "It must be either publisher or subscriber"
25 exit -1
26 fi
27fi
28
29if [[ -z "$4" ]]; then
30 echo "You need a forth argument with lat or thr"
31 exit -1
32else
33 if [[ "$4" == "thr" ]]; then
34 echo "Throughput test"
35 export ${lat_thr}_thr="thr"
36
37 elif [[ "$4" == "lat" ]]; then
38 echo "Latency test"
39 export ${lat_thr}_thr="lat"
40 else
41 echo "It must be either lat or thr"
42 exit -1
43 fi
44fi
45
46if [[ -z "$5" ]]; then
47 echo "Using default nics"
48 export nic1=eno1
49 export nic2=eno1
50else
51 echo "Using custom nic: $5"
52 export nic1=eno1
53 export nic2=eno1
54fi
55
56sudo /set_${lat_thr}_mode.sh
57sleep 10
58
59export exec_time=20
60
61export pub_string="-pub \
62 -transport UDPv4 \
63 -nic $nic1 \
64 -noPrint \
65 -exec $exec_time \
66 -noXML"
67
68if [[ ${lat_thr} == "lat" ]]; then
69 export pub_string="$pub_string \
70 -latencyTest"
71fi
72
73export sub_string="-sub \
74 -transport UDPv4 \
75 -nic $nic2 \
76 -noPrint \
77 -noXML"
78
79if [[ "$pub_sub" == "pub" ]]; then
80 echo "Publisher side"
81 export commands_string=${pub_string}
82else
83 echo "Subscriber side"
84 export commands_string=${sub_string}
85fi
86
87mkdir -p $output_folder
88
89export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel.csv
90touch $my_file
91export extra_args=""
92for index in ${num_reps}; do
93 for DATALEN in 32 64 128 256 512 1024 2048 4096 8192 16384 32768 63000 100000 500000 1048576 1548576 4194304 10485760; do
94 export command="taskset -c 0 \
95 $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
96 echo $command ---- $index
97 $command >> $my_file;
98 if [[ "$domain" == "1" ]]; then
99 export domain="2"
100 else
101 export domain="1"
102 fi
103 export extra_args=" -noOutputHeaders "
104 done
105done
106
107export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be.csv
108touch $my_file
109export extra_args=""
110for index in ${num_reps}; do
111 for DATALEN in ${dataLens}; do
112 export command="taskset -c 0 \
113 $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
114 echo $command ---- $index
115 $command >> $my_file;
116 if [[ "$domain" == "1" ]]; then
117 export domain="2"
118 else
119 export domain="1"
120 fi
121 export extra_args=" -noOutputHeaders "
122 done
123done
124
125export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_rel.csv
126touch $my_file
127export extra_args=""
128for index in ${num_reps}; do
129 for DATALEN in ${dataLens}; do
130 export command="taskset -c 0 \
131 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 $commands_string $extra_args"
132 echo $command ---- $index
133 $command >> $my_file;
134 if [[ "$domain" == "1" ]]; then
135 export domain="2"
136 else
137 export domain="1"
138 fi
139 export extra_args=" -noOutputHeaders "
140 done
141done
142
143export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_be.csv
144touch $my_file
145export extra_args=""
146for index in ${num_reps}; do
147 for DATALEN in ${dataLens}; do
148 export command="taskset -c 0 \
149 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 -best $commands_string $extra_args"
150 echo $command ---- $index
151 $command >> $my_file;
152 if [[ "$domain" == "1" ]]; then
153 export domain="2"
154 else
155 export domain="1"
156 fi
157 export extra_args=" -noOutputHeaders "
158 done
159done
160
161if [[ ${lat_thr} == "thr" ]]; then
162
163 if [[ "$pub_sub" == "pub" ]]; then
164 echo "Publisher side"
165 export commands_string="${commands_string} -batchSize 0"
166 fi
167
168 export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be_noBatch.csv
169 touch $my_file
170 export extra_args=""
171 for index in ${num_reps}; do
172 for DATALEN in ${dataLens}; do
173 export command="taskset -c 0 \
174 $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
175 echo $command ---- $index
176 $command >> $my_file;
177 if [[ "$domain" == "1" ]]; then
178 export domain="2"
179 else
180 export domain="1"
181 fi
182 export extra_args=" -noOutputHeaders "
183 done
184 done
185
186 export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel_noBatch.csv
187 touch $my_file
188 export extra_args=""
189 for index in ${num_reps}; do
190 for DATALEN in ${dataLens}; do
191 export command="taskset -c 0 \
192 $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
193 echo $command ---- $index
194 $command >> $my_file;
195 if [[ "$domain" == "1" ]]; then
196 export domain="2"
197 else
198 export domain="1"
199 fi
200 export extra_args=" -noOutputHeaders "
201 done
202 done
203
204fi
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 Raspberry Pi 4 nodes using a 1Gbps network. The numbers are for best-effort as well as strict reliable delivery 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 |
102 |
7.3 |
97 |
634 |
101 |
104 |
121 |
287 |
634 |
64 |
104 |
8.0 |
97 |
492 |
103 |
106 |
123 |
309 |
492 |
128 |
105 |
7.3 |
100 |
401 |
104 |
107 |
124 |
283 |
401 |
256 |
109 |
7.2 |
103 |
415 |
107 |
110 |
127 |
274 |
415 |
512 |
117 |
10.3 |
109 |
420 |
113 |
134 |
141 |
310 |
420 |
1024 |
126 |
10.7 |
119 |
474 |
123 |
144 |
151 |
335 |
474 |
2048 |
162 |
17.1 |
149 |
655 |
154 |
184 |
216 |
438 |
655 |
4096 |
172 |
11.6 |
165 |
706 |
170 |
176 |
212 |
413 |
706 |
8192 |
227 |
14.9 |
218 |
718 |
225 |
231 |
263 |
570 |
718 |
16384 |
348 |
21.7 |
333 |
1042 |
344 |
358 |
383 |
816 |
1042 |
32768 |
572 |
34.6 |
552 |
1580 |
567 |
586 |
616 |
1452 |
1580 |
63000 |
983 |
52.8 |
957 |
2705 |
975 |
1001 |
1035 |
2705 |
2705 |
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 |
114 |
10.9 |
105 |
459 |
111 |
121 |
155 |
342 |
459 |
64 |
115 |
10.9 |
106 |
696 |
112 |
122 |
156 |
333 |
696 |
128 |
117 |
11.6 |
108 |
449 |
114 |
124 |
166 |
354 |
449 |
256 |
120 |
10.9 |
111 |
498 |
117 |
127 |
170 |
325 |
498 |
512 |
125 |
12.9 |
116 |
998 |
122 |
131 |
171 |
516 |
998 |
1024 |
137 |
11.5 |
127 |
643 |
134 |
144 |
183 |
439 |
643 |
2048 |
175 |
17.4 |
159 |
623 |
169 |
198 |
234 |
442 |
623 |
4096 |
189 |
16.5 |
175 |
636 |
184 |
200 |
256 |
480 |
636 |
8192 |
250 |
19.8 |
232 |
735 |
244 |
264 |
330 |
638 |
735 |
16384 |
374 |
26.3 |
352 |
1257 |
368 |
388 |
443 |
1072 |
1257 |
32768 |
606 |
40.9 |
577 |
1704 |
599 |
622 |
674 |
1612 |
1704 |
63000 |
1028 |
73.4 |
987 |
2669 |
1012 |
1054 |
1295 |
2669 |
2669 |
100000 |
1734 |
101.1 |
1643 |
5128 |
1737 |
1784 |
1843 |
5128 |
5128 |
500000 |
11034 |
2493.4 |
6089 |
21977 |
11425 |
13442 |
15527 |
21977 |
21977 |
1048576 |
35525 |
13799.9 |
18963 |
88843 |
28398 |
60145 |
68477 |
88843 |
88843 |
1548576 |
69800 |
36697.7 |
26234 |
206795 |
68675 |
109024 |
206333 |
206795 |
206795 |
4194304 |
161510 |
32547.2 |
118169 |
347983 |
153329 |
188923 |
347983 |
347983 |
347983 |
10485760 |
299102 |
18163.1 |
285023 |
384084 |
294818 |
309121 |
384084 |
384084 |
384084 |
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
3
4echo OUTPUT PATH IS $2
5export output_folder=$2
6export pub_sub="pub"
7export lat_thr="lat"
8export num_reps="1 2"
9export dataLens="32 64 128 256 512 1024 2048 4096 8192 16384 32768 63000"
10export domain="2"
11
12if [[ -z "$3" ]]; then
13 echo "You need a third argument with publisher or subscriber"
14 exit -1
15else
16 if [[ "$3" == "publisher" ]]; then
17 echo "Publisher"
18 export pub_sub="pub"
19
20 elif [[ "$3" == "subscriber" ]]; then
21 echo "Subscriber"
22 export pub_sub="sub"
23 else
24 echo "It must be either publisher or subscriber"
25 exit -1
26 fi
27fi
28
29if [[ -z "$4" ]]; then
30 echo "You need a forth argument with lat or thr"
31 exit -1
32else
33 if [[ "$4" == "thr" ]]; then
34 echo "Throughput test"
35 export ${lat_thr}_thr="thr"
36
37 elif [[ "$4" == "lat" ]]; then
38 echo "Latency test"
39 export ${lat_thr}_thr="lat"
40 else
41 echo "It must be either lat or thr"
42 exit -1
43 fi
44fi
45
46if [[ -z "$5" ]]; then
47 echo "Using default nics"
48 export nic1=eno1
49 export nic2=eno1
50else
51 echo "Using custom nic: $5"
52 export nic1=eno1
53 export nic2=eno1
54fi
55
56sudo /set_${lat_thr}_mode.sh
57sleep 10
58
59export exec_time=20
60
61export pub_string="-pub \
62 -transport UDPv4 \
63 -nic $nic1 \
64 -noPrint \
65 -exec $exec_time \
66 -noXML"
67
68if [[ ${lat_thr} == "lat" ]]; then
69 export pub_string="$pub_string \
70 -latencyTest"
71fi
72
73export sub_string="-sub \
74 -transport UDPv4 \
75 -nic $nic2 \
76 -noPrint \
77 -noXML"
78
79if [[ "$pub_sub" == "pub" ]]; then
80 echo "Publisher side"
81 export commands_string=${pub_string}
82else
83 echo "Subscriber side"
84 export commands_string=${sub_string}
85fi
86
87mkdir -p $output_folder
88
89export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel.csv
90touch $my_file
91export extra_args=""
92for index in ${num_reps}; do
93 for DATALEN in 32 64 128 256 512 1024 2048 4096 8192 16384 32768 63000 100000 500000 1048576 1548576 4194304 10485760; do
94 export command="taskset -c 0 \
95 $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
96 echo $command ---- $index
97 $command >> $my_file;
98 if [[ "$domain" == "1" ]]; then
99 export domain="2"
100 else
101 export domain="1"
102 fi
103 export extra_args=" -noOutputHeaders "
104 done
105done
106
107export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be.csv
108touch $my_file
109export extra_args=""
110for index in ${num_reps}; do
111 for DATALEN in ${dataLens}; do
112 export command="taskset -c 0 \
113 $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
114 echo $command ---- $index
115 $command >> $my_file;
116 if [[ "$domain" == "1" ]]; then
117 export domain="2"
118 else
119 export domain="1"
120 fi
121 export extra_args=" -noOutputHeaders "
122 done
123done
124
125export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_rel.csv
126touch $my_file
127export extra_args=""
128for index in ${num_reps}; do
129 for DATALEN in ${dataLens}; do
130 export command="taskset -c 0 \
131 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 $commands_string $extra_args"
132 echo $command ---- $index
133 $command >> $my_file;
134 if [[ "$domain" == "1" ]]; then
135 export domain="2"
136 else
137 export domain="1"
138 fi
139 export extra_args=" -noOutputHeaders "
140 done
141done
142
143export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_be.csv
144touch $my_file
145export extra_args=""
146for index in ${num_reps}; do
147 for DATALEN in ${dataLens}; do
148 export command="taskset -c 0 \
149 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 -best $commands_string $extra_args"
150 echo $command ---- $index
151 $command >> $my_file;
152 if [[ "$domain" == "1" ]]; then
153 export domain="2"
154 else
155 export domain="1"
156 fi
157 export extra_args=" -noOutputHeaders "
158 done
159done
160
161if [[ ${lat_thr} == "thr" ]]; then
162
163 if [[ "$pub_sub" == "pub" ]]; then
164 echo "Publisher side"
165 export commands_string="${commands_string} -batchSize 0"
166 fi
167
168 export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be_noBatch.csv
169 touch $my_file
170 export extra_args=""
171 for index in ${num_reps}; do
172 for DATALEN in ${dataLens}; do
173 export command="taskset -c 0 \
174 $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
175 echo $command ---- $index
176 $command >> $my_file;
177 if [[ "$domain" == "1" ]]; then
178 export domain="2"
179 else
180 export domain="1"
181 fi
182 export extra_args=" -noOutputHeaders "
183 done
184 done
185
186 export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel_noBatch.csv
187 touch $my_file
188 export extra_args=""
189 for index in ${num_reps}; do
190 for DATALEN in ${dataLens}; do
191 export command="taskset -c 0 \
192 $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
193 echo $command ---- $index
194 $command >> $my_file;
195 if [[ "$domain" == "1" ]]; then
196 export domain="2"
197 else
198 export domain="1"
199 fi
200 export extra_args=" -noOutputHeaders "
201 done
202 done
203
204fi
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 maximum throughput between a Publisher and a Subscriber running in two Raspberry Pi 4 nodes using a 1Gbps network. The numbers are for best-effort as well as strict reliable delivery 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 |
6653630 |
342840 |
90.2 |
8960 |
0.13 |
64 |
5811328 |
290362 |
148.7 |
0 |
0.00 |
128 |
4660070 |
232848 |
238.4 |
25792 |
0.55 |
256 |
3151580 |
157418 |
322.4 |
82944 |
2.56 |
512 |
1833968 |
91566 |
375.1 |
229648 |
11.13 |
1024 |
963936 |
48145 |
394.4 |
278896 |
22.44 |
2048 |
489744 |
24462 |
400.8 |
185104 |
27.43 |
4096 |
247912 |
12383 |
405.8 |
104542 |
29.66 |
8192 |
112357 |
5613 |
467.9 |
82315 |
42.28 |
16384 |
70360 |
3515 |
480.8 |
43264 |
38.08 |
32768 |
47659 |
2381 |
624.3 |
13626 |
22.23 |
63000 |
41611 |
1074 |
741.5 |
16333 |
23.05 |
Reliable
Sample Size (Bytes) |
Total Samples |
Avg Samples/s |
Avg Mbps |
Lost Samples |
Lost Samples (%) |
---|---|---|---|---|---|
32 |
6397227 |
319480 |
81.8 |
0 |
0.00 |
64 |
5495059 |
274393 |
140.5 |
0 |
0.00 |
128 |
4377826 |
218659 |
223.9 |
0 |
0.00 |
256 |
2974720 |
148588 |
304.3 |
0 |
0.00 |
512 |
1731952 |
86499 |
354.3 |
0 |
0.00 |
1024 |
937071 |
46805 |
410.4 |
0 |
0.00 |
2048 |
523024 |
26121 |
428.0 |
0 |
0.00 |
4096 |
277286 |
13851 |
453.9 |
0 |
0.00 |
8192 |
141263 |
7057 |
462.5 |
0 |
0.00 |
16384 |
63005 |
3148 |
412.7 |
0 |
0.00 |
32768 |
52554 |
2625 |
688.3 |
0 |
0.00 |
63000 |
35551 |
1471 |
706.1 |
0 |
0.00 |
100000 |
9248 |
461 |
368.8 |
0 |
0.00 |
500000 |
2540 |
125 |
502.3 |
0 |
0.00 |
1048576 |
416 |
20 |
174.7 |
0 |
0.00 |
1548576 |
379 |
18 |
223.5 |
0 |
0.00 |
4194304 |
170 |
8 |
275.4 |
0 |
0.00 |
10485760 |
78 |
3 |
277.1 |
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
3
4echo OUTPUT PATH IS $2
5export output_folder=$2
6export pub_sub="pub"
7export lat_thr="lat"
8export num_reps="1 2"
9export dataLens="32 64 128 256 512 1024 2048 4096 8192 16384 32768 63000"
10export domain="2"
11
12if [[ -z "$3" ]]; then
13 echo "You need a third argument with publisher or subscriber"
14 exit -1
15else
16 if [[ "$3" == "publisher" ]]; then
17 echo "Publisher"
18 export pub_sub="pub"
19
20 elif [[ "$3" == "subscriber" ]]; then
21 echo "Subscriber"
22 export pub_sub="sub"
23 else
24 echo "It must be either publisher or subscriber"
25 exit -1
26 fi
27fi
28
29if [[ -z "$4" ]]; then
30 echo "You need a forth argument with lat or thr"
31 exit -1
32else
33 if [[ "$4" == "thr" ]]; then
34 echo "Throughput test"
35 export ${lat_thr}_thr="thr"
36
37 elif [[ "$4" == "lat" ]]; then
38 echo "Latency test"
39 export ${lat_thr}_thr="lat"
40 else
41 echo "It must be either lat or thr"
42 exit -1
43 fi
44fi
45
46if [[ -z "$5" ]]; then
47 echo "Using default nics"
48 export nic1=eno1
49 export nic2=eno1
50else
51 echo "Using custom nic: $5"
52 export nic1=eno1
53 export nic2=eno1
54fi
55
56sudo /set_${lat_thr}_mode.sh
57sleep 10
58
59export exec_time=20
60
61export pub_string="-pub \
62 -transport UDPv4 \
63 -nic $nic1 \
64 -noPrint \
65 -exec $exec_time \
66 -noXML"
67
68if [[ ${lat_thr} == "lat" ]]; then
69 export pub_string="$pub_string \
70 -latencyTest"
71fi
72
73export sub_string="-sub \
74 -transport UDPv4 \
75 -nic $nic2 \
76 -noPrint \
77 -noXML"
78
79if [[ "$pub_sub" == "pub" ]]; then
80 echo "Publisher side"
81 export commands_string=${pub_string}
82else
83 echo "Subscriber side"
84 export commands_string=${sub_string}
85fi
86
87mkdir -p $output_folder
88
89export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel.csv
90touch $my_file
91export extra_args=""
92for index in ${num_reps}; do
93 for DATALEN in 32 64 128 256 512 1024 2048 4096 8192 16384 32768 63000 100000 500000 1048576 1548576 4194304 10485760; do
94 export command="taskset -c 0 \
95 $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
96 echo $command ---- $index
97 $command >> $my_file;
98 if [[ "$domain" == "1" ]]; then
99 export domain="2"
100 else
101 export domain="1"
102 fi
103 export extra_args=" -noOutputHeaders "
104 done
105done
106
107export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be.csv
108touch $my_file
109export extra_args=""
110for index in ${num_reps}; do
111 for DATALEN in ${dataLens}; do
112 export command="taskset -c 0 \
113 $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
114 echo $command ---- $index
115 $command >> $my_file;
116 if [[ "$domain" == "1" ]]; then
117 export domain="2"
118 else
119 export domain="1"
120 fi
121 export extra_args=" -noOutputHeaders "
122 done
123done
124
125export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_rel.csv
126touch $my_file
127export extra_args=""
128for index in ${num_reps}; do
129 for DATALEN in ${dataLens}; do
130 export command="taskset -c 0 \
131 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 $commands_string $extra_args"
132 echo $command ---- $index
133 $command >> $my_file;
134 if [[ "$domain" == "1" ]]; then
135 export domain="2"
136 else
137 export domain="1"
138 fi
139 export extra_args=" -noOutputHeaders "
140 done
141done
142
143export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_be.csv
144touch $my_file
145export extra_args=""
146for index in ${num_reps}; do
147 for DATALEN in ${dataLens}; do
148 export command="taskset -c 0 \
149 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 -best $commands_string $extra_args"
150 echo $command ---- $index
151 $command >> $my_file;
152 if [[ "$domain" == "1" ]]; then
153 export domain="2"
154 else
155 export domain="1"
156 fi
157 export extra_args=" -noOutputHeaders "
158 done
159done
160
161if [[ ${lat_thr} == "thr" ]]; then
162
163 if [[ "$pub_sub" == "pub" ]]; then
164 echo "Publisher side"
165 export commands_string="${commands_string} -batchSize 0"
166 fi
167
168 export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be_noBatch.csv
169 touch $my_file
170 export extra_args=""
171 for index in ${num_reps}; do
172 for DATALEN in ${dataLens}; do
173 export command="taskset -c 0 \
174 $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
175 echo $command ---- $index
176 $command >> $my_file;
177 if [[ "$domain" == "1" ]]; then
178 export domain="2"
179 else
180 export domain="1"
181 fi
182 export extra_args=" -noOutputHeaders "
183 done
184 done
185
186 export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel_noBatch.csv
187 touch $my_file
188 export extra_args=""
189 for index in ${num_reps}; do
190 for DATALEN in ${dataLens}; do
191 export command="taskset -c 0 \
192 $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
193 echo $command ---- $index
194 $command >> $my_file;
195 if [[ "$domain" == "1" ]]; then
196 export domain="2"
197 else
198 export domain="1"
199 fi
200 export extra_args=" -noOutputHeaders "
201 done
202 done
203
204fi
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
Unkeyed, UDPv4 10Gbps Network, C++98
The graph below shows the one-way latency without load between a Publisher and a Subscriber running in two Linux nodes in a 10Gbps network. 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 |
15 |
0.8 |
14 |
65 |
15 |
15 |
16 |
44 |
65 |
64 |
15 |
0.8 |
14 |
65 |
15 |
15 |
17 |
44 |
65 |
128 |
15 |
0.9 |
14 |
67 |
15 |
16 |
17 |
45 |
67 |
256 |
15 |
1.0 |
15 |
65 |
15 |
16 |
17 |
45 |
65 |
512 |
19 |
1.8 |
15 |
71 |
19 |
21 |
22 |
47 |
71 |
1024 |
25 |
5.0 |
16 |
74 |
26 |
32 |
33 |
56 |
74 |
2048 |
29 |
36.2 |
20 |
4905 |
30 |
33 |
41 |
2106 |
4905 |
4096 |
32 |
132.7 |
23 |
100058 |
30 |
40 |
58 |
67 |
100058 |
8192 |
42 |
28.3 |
35 |
4931 |
36 |
57 |
65 |
85 |
4931 |
16384 |
85 |
23.2 |
45 |
213 |
84 |
121 |
135 |
150 |
213 |
32768 |
173 |
2.5 |
65 |
224 |
173 |
175 |
176 |
202 |
224 |
63000 |
185 |
2.9 |
101 |
223 |
185 |
187 |
189 |
216 |
223 |
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 |
17 |
1.1 |
16 |
70 |
17 |
18 |
21 |
47 |
70 |
64 |
17 |
1.1 |
16 |
67 |
17 |
17 |
21 |
46 |
67 |
128 |
17 |
1.2 |
16 |
73 |
17 |
17 |
23 |
46 |
73 |
256 |
18 |
2.0 |
16 |
68 |
17 |
19 |
28 |
47 |
68 |
512 |
20 |
2.7 |
17 |
69 |
19 |
21 |
29 |
49 |
69 |
1024 |
25 |
4.9 |
18 |
72 |
26 |
28 |
38 |
57 |
72 |
2048 |
29 |
36.2 |
20 |
4905 |
30 |
33 |
41 |
2106 |
4905 |
4096 |
31 |
23.8 |
25 |
4965 |
30 |
35 |
48 |
69 |
4965 |
8192 |
42 |
28.3 |
35 |
4931 |
36 |
57 |
65 |
85 |
4931 |
16384 |
88 |
25.9 |
47 |
166 |
87 |
126 |
140 |
158 |
166 |
32768 |
174 |
6.6 |
74 |
290 |
175 |
176 |
180 |
204 |
290 |
63000 |
162 |
14.3 |
105 |
220 |
160 |
186 |
190 |
214 |
220 |
100000 |
203 |
12.0 |
161 |
279 |
208 |
213 |
223 |
263 |
279 |
500000 |
654 |
22.9 |
558 |
802 |
661 |
669 |
699 |
774 |
802 |
1048576 |
1138 |
59.7 |
1034 |
1630 |
1180 |
1196 |
1211 |
1630 |
1630 |
1548576 |
1672 |
40.3 |
1485 |
2228 |
1660 |
1757 |
1768 |
2228 |
2228 |
4194304 |
4043 |
42.0 |
3996 |
5768 |
4045 |
4057 |
4080 |
5768 |
5768 |
10485760 |
10337 |
149.0 |
10293 |
14495 |
10329 |
10346 |
10367 |
14495 |
14495 |
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
3
4export folder_base="$(dirname "${executable}")"/../../..
5
6echo OUTPUT PATH IS $2
7export output_folder=$2
8export pub_sub="pub"
9export lat_thr="lat"
10export num_reps="1 2 3 4"
11export dataLens="32 64 128 256 512 1024 2048 4096 8192 16384 32768 63000"
12export domain="2"
13
14if [[ -z "$3" ]]; then
15 echo "You need a third argument with publisher or subscriber"
16 exit -1
17else
18 if [[ "$3" == "publisher" ]]; then
19 echo "Publisher"
20 export pub_sub="pub"
21
22 elif [[ "$3" == "subscriber" ]]; then
23 echo "Subscriber"
24 export pub_sub="sub"
25 else
26 echo "It must be either publisher or subscriber"
27 exit -1
28 fi
29fi
30
31if [[ -z "$4" ]]; then
32 echo "You need a forth argument with lat or thr"
33 exit -1
34else
35 if [[ "$4" == "thr" ]]; then
36 echo "Throughput test"
37 export ${lat_thr}_thr="thr"
38
39 elif [[ "$4" == "lat" ]]; then
40 echo "Latency test"
41 export ${lat_thr}_thr="lat"
42 else
43 echo "It must be either lat or thr"
44 exit -1
45 fi
46fi
47
48if [[ -z "$5" ]]; then
49 echo "Using default nics"
50 export nic1=172.16.0.1
51 export nic2=172.16.0.2
52else
53 echo "Using custom nic: $5"
54 export nic1=$5
55 export nic2=$5
56fi
57
58sudo /set_${lat_thr}_mode.sh
59sleep 10
60
61export exec_time=20
62
63export pub_string="-pub \
64 -transport UDPv4 \
65 -nic $nic1 \
66 -noPrint \
67 -exec $exec_time"
68
69if [[ ${lat_thr} == "lat" ]]; then
70 export pub_string="$pub_string \
71 -latencyTest"
72fi
73
74export sub_string="-sub \
75 -transport UDPv4 \
76 -nic $nic2 \
77 -noPrint"
78
79if [[ "$pub_sub" == "pub" ]]; then
80 echo "Publisher side"
81 export commands_string=${pub_string}
82else
83 echo "Subscriber side"
84 export commands_string=${sub_string}
85fi
86
87
88cd $folder_base
89mkdir -p $output_folder
90
91export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel.csv
92touch $my_file
93export extra_args=""
94for index in ${num_reps}; do
95 for DATALEN in 32 64 128 256 512 1024 2048 4096 8192 16384 32768 63000 100000 500000 1048576 1548576 4194304 10485760; do
96 export command="taskset -c 0 \
97 $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
98 echo $command ---- $index
99 $command >> $my_file;
100 if [[ "$domain" == "1" ]]; then
101 export domain="2"
102 else
103 export domain="1"
104 fi
105 export extra_args=" -noOutputHeaders "
106 done
107done
108
109export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be.csv
110touch $my_file
111export extra_args=""
112for index in ${num_reps}; do
113 for DATALEN in ${dataLens}; do
114 export command="taskset -c 0 \
115 $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
116 echo $command ---- $index
117 $command >> $my_file;
118 if [[ "$domain" == "1" ]]; then
119 export domain="2"
120 else
121 export domain="1"
122 fi
123 export extra_args=" -noOutputHeaders "
124 done
125done
126
127export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_rel.csv
128touch $my_file
129export extra_args=""
130for index in ${num_reps}; do
131 for DATALEN in ${dataLens}; do
132 export command="taskset -c 0 \
133 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 $commands_string $extra_args"
134 echo $command ---- $index
135 $command >> $my_file;
136 if [[ "$domain" == "1" ]]; then
137 export domain="2"
138 else
139 export domain="1"
140 fi
141 export extra_args=" -noOutputHeaders "
142 done
143done
144
145export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_be.csv
146touch $my_file
147export extra_args=""
148for index in ${num_reps}; do
149 for DATALEN in ${dataLens}; do
150 export command="taskset -c 0 \
151 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 -best $commands_string $extra_args"
152 echo $command ---- $index
153 $command >> $my_file;
154 if [[ "$domain" == "1" ]]; then
155 export domain="2"
156 else
157 export domain="1"
158 fi
159 export extra_args=" -noOutputHeaders "
160 done
161done
162
163if [[ ${lat_thr} == "thr" ]]; then
164
165 if [[ "$pub_sub" == "pub" ]]; then
166 echo "Publisher side"
167 export commands_string="${commands_string} -batchSize 0"
168 fi
169
170 export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be_noBatch.csv
171 touch $my_file
172 export extra_args=""
173 for index in ${num_reps}; do
174 for DATALEN in ${dataLens}; do
175 export command="taskset -c 0 \
176 $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
177 echo $command ---- $index
178 $command >> $my_file;
179 if [[ "$domain" == "1" ]]; then
180 export domain="2"
181 else
182 export domain="1"
183 fi
184 export extra_args=" -noOutputHeaders "
185 done
186 done
187
188 export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel_noBatch.csv
189 touch $my_file
190 export extra_args=""
191 for index in ${num_reps}; do
192 for DATALEN in ${dataLens}; do
193 export command="taskset -c 0 \
194 $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
195 echo $command ---- $index
196 $command >> $my_file;
197 if [[ "$domain" == "1" ]]; then
198 export domain="2"
199 else
200 export domain="1"
201 fi
202 export extra_args=" -noOutputHeaders "
203 done
204 done
205
206fi
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 Linux nodes in a 10Gbps network. 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 |
96942954 |
4841434 |
1239.4 |
256 |
0.00 |
64 |
88082944 |
4398551 |
2252.1 |
1010816 |
1.13 |
128 |
79300910 |
3958880 |
4053.9 |
0 |
0.00 |
256 |
62951300 |
3142369 |
6435.6 |
0 |
0.00 |
512 |
44409840 |
2217975 |
9084.8 |
0 |
0.00 |
1024 |
23815320 |
1190147 |
9749.7 |
0 |
0.00 |
2048 |
11952360 |
597371 |
9787.3 |
0 |
0.00 |
4096 |
5987456 |
299257 |
9806.1 |
0 |
0.00 |
8192 |
3006247 |
150276 |
9848.5 |
0 |
0.00 |
16384 |
1509081 |
75446 |
9889.0 |
15 |
0.00 |
32768 |
756067 |
37801 |
9909.3 |
8 |
0.00 |
63000 |
393525 |
19675 |
9916.3 |
5 |
0.00 |
Reliable
Sample Size (Bytes) |
Total Samples |
Avg Samples/s |
Avg Mbps |
Lost Samples |
Lost Samples (%) |
---|---|---|---|---|---|
32 |
93009408 |
4644639 |
1189.0 |
0 |
0.00 |
64 |
83820288 |
4185469 |
2143.0 |
0 |
0.00 |
128 |
71802225 |
3585409 |
3671.5 |
0 |
0.00 |
256 |
54500673 |
2721719 |
5574.1 |
0 |
0.00 |
512 |
36364097 |
1816142 |
7438.9 |
0 |
0.00 |
1024 |
22082825 |
1102809 |
9034.2 |
0 |
0.00 |
2048 |
11951656 |
596902 |
9779.6 |
0 |
0.00 |
4096 |
5987592 |
299047 |
9799.2 |
0 |
0.00 |
8192 |
3005010 |
150208 |
9844.0 |
0 |
0.00 |
16384 |
1508868 |
75432 |
9887.0 |
0 |
0.00 |
32768 |
756049 |
37797 |
9908.3 |
0 |
0.00 |
63000 |
393540 |
19674 |
9915.8 |
0 |
0.00 |
100000 |
245119 |
12255 |
9804.2 |
0 |
0.00 |
500000 |
46801 |
2338 |
9352.6 |
0 |
0.00 |
1048576 |
15686 |
783 |
6574.8 |
0 |
0.00 |
1548576 |
14955 |
746 |
9254.0 |
0 |
0.00 |
4194304 |
5448 |
271 |
9104.8 |
0 |
0.00 |
10485760 |
2114 |
105 |
8842.7 |
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
3
4export folder_base="$(dirname "${executable}")"/../../..
5
6echo OUTPUT PATH IS $2
7export output_folder=$2
8export pub_sub="pub"
9export lat_thr="lat"
10export num_reps="1 2 3 4"
11export dataLens="32 64 128 256 512 1024 2048 4096 8192 16384 32768 63000"
12export domain="2"
13
14if [[ -z "$3" ]]; then
15 echo "You need a third argument with publisher or subscriber"
16 exit -1
17else
18 if [[ "$3" == "publisher" ]]; then
19 echo "Publisher"
20 export pub_sub="pub"
21
22 elif [[ "$3" == "subscriber" ]]; then
23 echo "Subscriber"
24 export pub_sub="sub"
25 else
26 echo "It must be either publisher or subscriber"
27 exit -1
28 fi
29fi
30
31if [[ -z "$4" ]]; then
32 echo "You need a forth argument with lat or thr"
33 exit -1
34else
35 if [[ "$4" == "thr" ]]; then
36 echo "Throughput test"
37 export ${lat_thr}_thr="thr"
38
39 elif [[ "$4" == "lat" ]]; then
40 echo "Latency test"
41 export ${lat_thr}_thr="lat"
42 else
43 echo "It must be either lat or thr"
44 exit -1
45 fi
46fi
47
48if [[ -z "$5" ]]; then
49 echo "Using default nics"
50 export nic1=172.16.0.1
51 export nic2=172.16.0.2
52else
53 echo "Using custom nic: $5"
54 export nic1=$5
55 export nic2=$5
56fi
57
58sudo /set_${lat_thr}_mode.sh
59sleep 10
60
61export exec_time=20
62
63export pub_string="-pub \
64 -transport UDPv4 \
65 -nic $nic1 \
66 -noPrint \
67 -exec $exec_time"
68
69if [[ ${lat_thr} == "lat" ]]; then
70 export pub_string="$pub_string \
71 -latencyTest"
72fi
73
74export sub_string="-sub \
75 -transport UDPv4 \
76 -nic $nic2 \
77 -noPrint"
78
79if [[ "$pub_sub" == "pub" ]]; then
80 echo "Publisher side"
81 export commands_string=${pub_string}
82else
83 echo "Subscriber side"
84 export commands_string=${sub_string}
85fi
86
87
88cd $folder_base
89mkdir -p $output_folder
90
91export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel.csv
92touch $my_file
93export extra_args=""
94for index in ${num_reps}; do
95 for DATALEN in 32 64 128 256 512 1024 2048 4096 8192 16384 32768 63000 100000 500000 1048576 1548576 4194304 10485760; do
96 export command="taskset -c 0 \
97 $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
98 echo $command ---- $index
99 $command >> $my_file;
100 if [[ "$domain" == "1" ]]; then
101 export domain="2"
102 else
103 export domain="1"
104 fi
105 export extra_args=" -noOutputHeaders "
106 done
107done
108
109export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be.csv
110touch $my_file
111export extra_args=""
112for index in ${num_reps}; do
113 for DATALEN in ${dataLens}; do
114 export command="taskset -c 0 \
115 $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
116 echo $command ---- $index
117 $command >> $my_file;
118 if [[ "$domain" == "1" ]]; then
119 export domain="2"
120 else
121 export domain="1"
122 fi
123 export extra_args=" -noOutputHeaders "
124 done
125done
126
127export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_rel.csv
128touch $my_file
129export extra_args=""
130for index in ${num_reps}; do
131 for DATALEN in ${dataLens}; do
132 export command="taskset -c 0 \
133 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 $commands_string $extra_args"
134 echo $command ---- $index
135 $command >> $my_file;
136 if [[ "$domain" == "1" ]]; then
137 export domain="2"
138 else
139 export domain="1"
140 fi
141 export extra_args=" -noOutputHeaders "
142 done
143done
144
145export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_be.csv
146touch $my_file
147export extra_args=""
148for index in ${num_reps}; do
149 for DATALEN in ${dataLens}; do
150 export command="taskset -c 0 \
151 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 -best $commands_string $extra_args"
152 echo $command ---- $index
153 $command >> $my_file;
154 if [[ "$domain" == "1" ]]; then
155 export domain="2"
156 else
157 export domain="1"
158 fi
159 export extra_args=" -noOutputHeaders "
160 done
161done
162
163if [[ ${lat_thr} == "thr" ]]; then
164
165 if [[ "$pub_sub" == "pub" ]]; then
166 echo "Publisher side"
167 export commands_string="${commands_string} -batchSize 0"
168 fi
169
170 export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be_noBatch.csv
171 touch $my_file
172 export extra_args=""
173 for index in ${num_reps}; do
174 for DATALEN in ${dataLens}; do
175 export command="taskset -c 0 \
176 $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
177 echo $command ---- $index
178 $command >> $my_file;
179 if [[ "$domain" == "1" ]]; then
180 export domain="2"
181 else
182 export domain="1"
183 fi
184 export extra_args=" -noOutputHeaders "
185 done
186 done
187
188 export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel_noBatch.csv
189 touch $my_file
190 export extra_args=""
191 for index in ${num_reps}; do
192 for DATALEN in ${dataLens}; do
193 export command="taskset -c 0 \
194 $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
195 echo $command ---- $index
196 $command >> $my_file;
197 if [[ "$domain" == "1" ]]; then
198 export domain="2"
199 else
200 export domain="1"
201 fi
202 export extra_args=" -noOutputHeaders "
203 done
204 done
205
206fi
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
Keyed, UDPv4 1Gbps Network, C++98
The graph below shows the one-way latency without load between a Publisher and a Subscriber running in two Linux nodes in a 1Gbps network. 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 |
58 |
1.7 |
53 |
207 |
58 |
60 |
62 |
88 |
207 |
64 |
59 |
1.6 |
54 |
209 |
59 |
61 |
62 |
89 |
209 |
128 |
61 |
1.7 |
55 |
208 |
61 |
62 |
64 |
90 |
208 |
256 |
65 |
1.3 |
60 |
213 |
65 |
66 |
68 |
94 |
213 |
512 |
71 |
1.5 |
64 |
216 |
70 |
72 |
73 |
99 |
216 |
1024 |
84 |
1.4 |
78 |
236 |
84 |
85 |
87 |
114 |
236 |
2048 |
111 |
1.4 |
105 |
255 |
111 |
112 |
114 |
142 |
255 |
4096 |
164 |
1.5 |
158 |
311 |
163 |
165 |
167 |
194 |
311 |
8192 |
269 |
1.7 |
262 |
414 |
269 |
270 |
273 |
299 |
414 |
16384 |
345 |
1.8 |
338 |
490 |
345 |
347 |
348 |
382 |
490 |
32768 |
478 |
1.9 |
471 |
624 |
478 |
479 |
481 |
519 |
624 |
63000 |
739 |
2.1 |
731 |
883 |
739 |
740 |
742 |
810 |
883 |
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 |
61 |
1.7 |
54 |
206 |
60 |
62 |
66 |
89 |
206 |
64 |
61 |
1.8 |
55 |
208 |
61 |
63 |
66 |
91 |
208 |
128 |
63 |
1.6 |
57 |
212 |
62 |
64 |
68 |
92 |
212 |
256 |
67 |
1.5 |
61 |
217 |
67 |
68 |
71 |
96 |
217 |
512 |
73 |
1.6 |
67 |
221 |
72 |
74 |
78 |
102 |
221 |
1024 |
86 |
1.7 |
80 |
234 |
85 |
87 |
91 |
115 |
234 |
2048 |
113 |
1.5 |
107 |
188 |
113 |
115 |
118 |
142 |
188 |
4096 |
166 |
1.5 |
158 |
236 |
165 |
167 |
170 |
195 |
236 |
8192 |
271 |
1.6 |
265 |
326 |
271 |
272 |
275 |
303 |
326 |
16384 |
347 |
1.6 |
341 |
405 |
347 |
348 |
350 |
376 |
405 |
32768 |
479 |
1.5 |
472 |
541 |
479 |
481 |
482 |
507 |
541 |
63000 |
740 |
1.9 |
734 |
813 |
740 |
742 |
744 |
772 |
813 |
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
3
4echo OUTPUT PATH IS $2
5export output_folder=$2
6export pub_sub="pub"
7export lat_thr="lat"
8export num_reps="1 2"
9export dataLens="32 64 128 256 512 1024 2048 4096 8192 16384 32768 63000"
10export domain="2"
11
12if [[ -z "$3" ]]; then
13 echo "You need a third argument with publisher or subscriber"
14 exit -1
15else
16 if [[ "$3" == "publisher" ]]; then
17 echo "Publisher"
18 export pub_sub="pub"
19
20 elif [[ "$3" == "subscriber" ]]; then
21 echo "Subscriber"
22 export pub_sub="sub"
23 else
24 echo "It must be either publisher or subscriber"
25 exit -1
26 fi
27fi
28
29if [[ -z "$4" ]]; then
30 echo "You need a forth argument with lat or thr"
31 exit -1
32else
33 if [[ "$4" == "thr" ]]; then
34 echo "Throughput test"
35 export ${lat_thr}_thr="thr"
36
37 elif [[ "$4" == "lat" ]]; then
38 echo "Latency test"
39 export ${lat_thr}_thr="lat"
40 else
41 echo "It must be either lat or thr"
42 exit -1
43 fi
44fi
45
46if [[ -z "$5" ]]; then
47 echo "Using default nics"
48 export nic1=eno1
49 export nic2=eno1
50else
51 echo "Using custom nic: $5"
52 export nic1=eno1
53 export nic2=eno1
54fi
55
56sudo /set_${lat_thr}_mode.sh
57sleep 10
58
59export exec_time=20
60
61export pub_string="-pub \
62 -transport UDPv4 \
63 -nic $nic1 \
64 -noPrint \
65 -exec $exec_time \
66 -noXML"
67
68if [[ ${lat_thr} == "lat" ]]; then
69 export pub_string="$pub_string \
70 -latencyTest"
71fi
72
73export sub_string="-sub \
74 -transport UDPv4 \
75 -nic $nic2 \
76 -noPrint \
77 -noXML"
78
79if [[ "$pub_sub" == "pub" ]]; then
80 echo "Publisher side"
81 export commands_string=${pub_string}
82else
83 echo "Subscriber side"
84 export commands_string=${sub_string}
85fi
86
87mkdir -p $output_folder
88
89export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel.csv
90touch $my_file
91export extra_args=""
92for index in ${num_reps}; do
93 for DATALEN in 32 64 128 256 512 1024 2048 4096 8192 16384 32768 63000 100000 500000 1048576 1548576 4194304 10485760; do
94 export command="taskset -c 0 \
95 $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
96 echo $command ---- $index
97 $command >> $my_file;
98 if [[ "$domain" == "1" ]]; then
99 export domain="2"
100 else
101 export domain="1"
102 fi
103 export extra_args=" -noOutputHeaders "
104 done
105done
106
107export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be.csv
108touch $my_file
109export extra_args=""
110for index in ${num_reps}; do
111 for DATALEN in ${dataLens}; do
112 export command="taskset -c 0 \
113 $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
114 echo $command ---- $index
115 $command >> $my_file;
116 if [[ "$domain" == "1" ]]; then
117 export domain="2"
118 else
119 export domain="1"
120 fi
121 export extra_args=" -noOutputHeaders "
122 done
123done
124
125export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_rel.csv
126touch $my_file
127export extra_args=""
128for index in ${num_reps}; do
129 for DATALEN in ${dataLens}; do
130 export command="taskset -c 0 \
131 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 $commands_string $extra_args"
132 echo $command ---- $index
133 $command >> $my_file;
134 if [[ "$domain" == "1" ]]; then
135 export domain="2"
136 else
137 export domain="1"
138 fi
139 export extra_args=" -noOutputHeaders "
140 done
141done
142
143export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_be.csv
144touch $my_file
145export extra_args=""
146for index in ${num_reps}; do
147 for DATALEN in ${dataLens}; do
148 export command="taskset -c 0 \
149 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 -best $commands_string $extra_args"
150 echo $command ---- $index
151 $command >> $my_file;
152 if [[ "$domain" == "1" ]]; then
153 export domain="2"
154 else
155 export domain="1"
156 fi
157 export extra_args=" -noOutputHeaders "
158 done
159done
160
161if [[ ${lat_thr} == "thr" ]]; then
162
163 if [[ "$pub_sub" == "pub" ]]; then
164 echo "Publisher side"
165 export commands_string="${commands_string} -batchSize 0"
166 fi
167
168 export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be_noBatch.csv
169 touch $my_file
170 export extra_args=""
171 for index in ${num_reps}; do
172 for DATALEN in ${dataLens}; do
173 export command="taskset -c 0 \
174 $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
175 echo $command ---- $index
176 $command >> $my_file;
177 if [[ "$domain" == "1" ]]; then
178 export domain="2"
179 else
180 export domain="1"
181 fi
182 export extra_args=" -noOutputHeaders "
183 done
184 done
185
186 export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel_noBatch.csv
187 touch $my_file
188 export extra_args=""
189 for index in ${num_reps}; do
190 for DATALEN in ${dataLens}; do
191 export command="taskset -c 0 \
192 $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
193 echo $command ---- $index
194 $command >> $my_file;
195 if [[ "$domain" == "1" ]]; then
196 export domain="2"
197 else
198 export domain="1"
199 fi
200 export extra_args=" -noOutputHeaders "
201 done
202 done
203
204fi
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 Linux nodes in a 1Gbps network. 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 |
24494929 |
1223130 |
313.1 |
17152 |
0.07 |
64 |
24122240 |
1204384 |
616.6 |
15488 |
0.06 |
128 |
15348800 |
766001 |
784.4 |
3200 |
0.02 |
256 |
8498048 |
424630 |
869.6 |
1344 |
0.02 |
512 |
4522551 |
225990 |
925.7 |
0 |
0.00 |
1024 |
2328336 |
116361 |
953.2 |
0 |
0.00 |
2048 |
1181684 |
59060 |
967.6 |
0 |
0.00 |
4096 |
595312 |
29755 |
975.0 |
0 |
0.00 |
8192 |
299731 |
14984 |
982.0 |
0 |
0.00 |
16384 |
150733 |
7533 |
987.5 |
0 |
0.00 |
32768 |
75551 |
3777 |
990.2 |
17 |
0.02 |
63000 |
39341 |
1966 |
991.3 |
9 |
0.02 |
Reliable
Sample Size (Bytes) |
Total Samples |
Avg Samples/s |
Avg Mbps |
Lost Samples |
Lost Samples (%) |
---|---|---|---|---|---|
32 |
22900992 |
1143167 |
292.7 |
0 |
0.00 |
64 |
22228736 |
1109983 |
568.3 |
0 |
0.00 |
128 |
15330817 |
765569 |
783.9 |
0 |
0.00 |
256 |
8491872 |
424412 |
869.2 |
0 |
0.00 |
512 |
4518368 |
225868 |
925.2 |
0 |
0.00 |
1024 |
2326353 |
116296 |
952.7 |
0 |
0.00 |
2048 |
1180737 |
59026 |
967.1 |
0 |
0.00 |
4096 |
594849 |
29738 |
974.5 |
0 |
0.00 |
8192 |
299621 |
14978 |
981.6 |
0 |
0.00 |
16384 |
148530 |
7424 |
973.1 |
0 |
0.00 |
32768 |
75580 |
3777 |
990.1 |
0 |
0.00 |
63000 |
39341 |
1966 |
991.0 |
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
3
4echo OUTPUT PATH IS $2
5export output_folder=$2
6export pub_sub="pub"
7export lat_thr="lat"
8export num_reps="1 2"
9export dataLens="32 64 128 256 512 1024 2048 4096 8192 16384 32768 63000"
10export domain="2"
11
12if [[ -z "$3" ]]; then
13 echo "You need a third argument with publisher or subscriber"
14 exit -1
15else
16 if [[ "$3" == "publisher" ]]; then
17 echo "Publisher"
18 export pub_sub="pub"
19
20 elif [[ "$3" == "subscriber" ]]; then
21 echo "Subscriber"
22 export pub_sub="sub"
23 else
24 echo "It must be either publisher or subscriber"
25 exit -1
26 fi
27fi
28
29if [[ -z "$4" ]]; then
30 echo "You need a forth argument with lat or thr"
31 exit -1
32else
33 if [[ "$4" == "thr" ]]; then
34 echo "Throughput test"
35 export ${lat_thr}_thr="thr"
36
37 elif [[ "$4" == "lat" ]]; then
38 echo "Latency test"
39 export ${lat_thr}_thr="lat"
40 else
41 echo "It must be either lat or thr"
42 exit -1
43 fi
44fi
45
46if [[ -z "$5" ]]; then
47 echo "Using default nics"
48 export nic1=eno1
49 export nic2=eno1
50else
51 echo "Using custom nic: $5"
52 export nic1=eno1
53 export nic2=eno1
54fi
55
56sudo /set_${lat_thr}_mode.sh
57sleep 10
58
59export exec_time=20
60
61export pub_string="-pub \
62 -transport UDPv4 \
63 -nic $nic1 \
64 -noPrint \
65 -exec $exec_time \
66 -noXML"
67
68if [[ ${lat_thr} == "lat" ]]; then
69 export pub_string="$pub_string \
70 -latencyTest"
71fi
72
73export sub_string="-sub \
74 -transport UDPv4 \
75 -nic $nic2 \
76 -noPrint \
77 -noXML"
78
79if [[ "$pub_sub" == "pub" ]]; then
80 echo "Publisher side"
81 export commands_string=${pub_string}
82else
83 echo "Subscriber side"
84 export commands_string=${sub_string}
85fi
86
87mkdir -p $output_folder
88
89export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel.csv
90touch $my_file
91export extra_args=""
92for index in ${num_reps}; do
93 for DATALEN in 32 64 128 256 512 1024 2048 4096 8192 16384 32768 63000 100000 500000 1048576 1548576 4194304 10485760; do
94 export command="taskset -c 0 \
95 $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
96 echo $command ---- $index
97 $command >> $my_file;
98 if [[ "$domain" == "1" ]]; then
99 export domain="2"
100 else
101 export domain="1"
102 fi
103 export extra_args=" -noOutputHeaders "
104 done
105done
106
107export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be.csv
108touch $my_file
109export extra_args=""
110for index in ${num_reps}; do
111 for DATALEN in ${dataLens}; do
112 export command="taskset -c 0 \
113 $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
114 echo $command ---- $index
115 $command >> $my_file;
116 if [[ "$domain" == "1" ]]; then
117 export domain="2"
118 else
119 export domain="1"
120 fi
121 export extra_args=" -noOutputHeaders "
122 done
123done
124
125export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_rel.csv
126touch $my_file
127export extra_args=""
128for index in ${num_reps}; do
129 for DATALEN in ${dataLens}; do
130 export command="taskset -c 0 \
131 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 $commands_string $extra_args"
132 echo $command ---- $index
133 $command >> $my_file;
134 if [[ "$domain" == "1" ]]; then
135 export domain="2"
136 else
137 export domain="1"
138 fi
139 export extra_args=" -noOutputHeaders "
140 done
141done
142
143export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_be.csv
144touch $my_file
145export extra_args=""
146for index in ${num_reps}; do
147 for DATALEN in ${dataLens}; do
148 export command="taskset -c 0 \
149 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 -best $commands_string $extra_args"
150 echo $command ---- $index
151 $command >> $my_file;
152 if [[ "$domain" == "1" ]]; then
153 export domain="2"
154 else
155 export domain="1"
156 fi
157 export extra_args=" -noOutputHeaders "
158 done
159done
160
161if [[ ${lat_thr} == "thr" ]]; then
162
163 if [[ "$pub_sub" == "pub" ]]; then
164 echo "Publisher side"
165 export commands_string="${commands_string} -batchSize 0"
166 fi
167
168 export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be_noBatch.csv
169 touch $my_file
170 export extra_args=""
171 for index in ${num_reps}; do
172 for DATALEN in ${dataLens}; do
173 export command="taskset -c 0 \
174 $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
175 echo $command ---- $index
176 $command >> $my_file;
177 if [[ "$domain" == "1" ]]; then
178 export domain="2"
179 else
180 export domain="1"
181 fi
182 export extra_args=" -noOutputHeaders "
183 done
184 done
185
186 export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel_noBatch.csv
187 touch $my_file
188 export extra_args=""
189 for index in ${num_reps}; do
190 for DATALEN in ${dataLens}; do
191 export command="taskset -c 0 \
192 $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
193 echo $command ---- $index
194 $command >> $my_file;
195 if [[ "$domain" == "1" ]]; then
196 export domain="2"
197 else
198 export domain="1"
199 fi
200 export extra_args=" -noOutputHeaders "
201 done
202 done
203
204fi
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 Raspberry Pi 4 nodes using a 1Gbps network. The numbers are for best-effort as well as strict reliable delivery 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 |
126 |
14.0 |
117 |
2036 |
124 |
132 |
152 |
326 |
2036 |
64 |
126 |
16.2 |
118 |
2161 |
124 |
132 |
154 |
386 |
2161 |
128 |
128 |
9.9 |
119 |
523 |
125 |
133 |
154 |
345 |
523 |
256 |
130 |
9.6 |
122 |
515 |
128 |
136 |
160 |
343 |
515 |
512 |
137 |
10.2 |
128 |
528 |
134 |
143 |
164 |
350 |
528 |
1024 |
151 |
12.7 |
140 |
739 |
146 |
170 |
189 |
358 |
739 |
2048 |
187 |
24.6 |
170 |
2077 |
178 |
217 |
266 |
545 |
2077 |
4096 |
198 |
14.0 |
186 |
630 |
195 |
206 |
238 |
484 |
630 |
8192 |
255 |
16.3 |
242 |
654 |
251 |
264 |
293 |
604 |
654 |
16384 |
378 |
27.3 |
359 |
2162 |
374 |
388 |
415 |
909 |
2162 |
32768 |
608 |
36.7 |
585 |
1414 |
603 |
623 |
654 |
1412 |
1414 |
63000 |
1021 |
61.4 |
994 |
2838 |
1015 |
1032 |
1073 |
2838 |
2838 |
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 |
144 |
14.5 |
129 |
549 |
140 |
155 |
200 |
444 |
549 |
64 |
143 |
14.9 |
128 |
549 |
139 |
154 |
199 |
415 |
549 |
128 |
145 |
16.3 |
131 |
2130 |
141 |
157 |
196 |
493 |
2130 |
256 |
148 |
16.6 |
133 |
1355 |
145 |
159 |
208 |
554 |
1355 |
512 |
154 |
14.5 |
139 |
864 |
151 |
166 |
206 |
432 |
864 |
1024 |
164 |
15.7 |
150 |
708 |
161 |
176 |
226 |
530 |
708 |
2048 |
204 |
21.0 |
183 |
627 |
198 |
230 |
275 |
496 |
627 |
4096 |
222 |
22.2 |
201 |
1737 |
216 |
239 |
298 |
588 |
1737 |
8192 |
281 |
26.4 |
260 |
2370 |
275 |
299 |
369 |
743 |
2370 |
16384 |
412 |
30.3 |
382 |
1006 |
405 |
431 |
494 |
949 |
1006 |
32768 |
648 |
44.2 |
613 |
2675 |
640 |
670 |
723 |
1787 |
2675 |
63000 |
1075 |
76.3 |
1032 |
2805 |
1057 |
1111 |
1354 |
2805 |
2805 |
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
3
4echo OUTPUT PATH IS $2
5export output_folder=$2
6export pub_sub="pub"
7export lat_thr="lat"
8export num_reps="1 2"
9export dataLens="32 64 128 256 512 1024 2048 4096 8192 16384 32768 63000"
10export domain="2"
11
12if [[ -z "$3" ]]; then
13 echo "You need a third argument with publisher or subscriber"
14 exit -1
15else
16 if [[ "$3" == "publisher" ]]; then
17 echo "Publisher"
18 export pub_sub="pub"
19
20 elif [[ "$3" == "subscriber" ]]; then
21 echo "Subscriber"
22 export pub_sub="sub"
23 else
24 echo "It must be either publisher or subscriber"
25 exit -1
26 fi
27fi
28
29if [[ -z "$4" ]]; then
30 echo "You need a forth argument with lat or thr"
31 exit -1
32else
33 if [[ "$4" == "thr" ]]; then
34 echo "Throughput test"
35 export ${lat_thr}_thr="thr"
36
37 elif [[ "$4" == "lat" ]]; then
38 echo "Latency test"
39 export ${lat_thr}_thr="lat"
40 else
41 echo "It must be either lat or thr"
42 exit -1
43 fi
44fi
45
46if [[ -z "$5" ]]; then
47 echo "Using default nics"
48 export nic1=eno1
49 export nic2=eno1
50else
51 echo "Using custom nic: $5"
52 export nic1=eno1
53 export nic2=eno1
54fi
55
56sudo /set_${lat_thr}_mode.sh
57sleep 10
58
59export exec_time=20
60
61export pub_string="-pub \
62 -transport UDPv4 \
63 -nic $nic1 \
64 -noPrint \
65 -exec $exec_time \
66 -noXML"
67
68if [[ ${lat_thr} == "lat" ]]; then
69 export pub_string="$pub_string \
70 -latencyTest"
71fi
72
73export sub_string="-sub \
74 -transport UDPv4 \
75 -nic $nic2 \
76 -noPrint \
77 -noXML"
78
79if [[ "$pub_sub" == "pub" ]]; then
80 echo "Publisher side"
81 export commands_string=${pub_string}
82else
83 echo "Subscriber side"
84 export commands_string=${sub_string}
85fi
86
87mkdir -p $output_folder
88
89export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel.csv
90touch $my_file
91export extra_args=""
92for index in ${num_reps}; do
93 for DATALEN in 32 64 128 256 512 1024 2048 4096 8192 16384 32768 63000 100000 500000 1048576 1548576 4194304 10485760; do
94 export command="taskset -c 0 \
95 $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
96 echo $command ---- $index
97 $command >> $my_file;
98 if [[ "$domain" == "1" ]]; then
99 export domain="2"
100 else
101 export domain="1"
102 fi
103 export extra_args=" -noOutputHeaders "
104 done
105done
106
107export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be.csv
108touch $my_file
109export extra_args=""
110for index in ${num_reps}; do
111 for DATALEN in ${dataLens}; do
112 export command="taskset -c 0 \
113 $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
114 echo $command ---- $index
115 $command >> $my_file;
116 if [[ "$domain" == "1" ]]; then
117 export domain="2"
118 else
119 export domain="1"
120 fi
121 export extra_args=" -noOutputHeaders "
122 done
123done
124
125export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_rel.csv
126touch $my_file
127export extra_args=""
128for index in ${num_reps}; do
129 for DATALEN in ${dataLens}; do
130 export command="taskset -c 0 \
131 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 $commands_string $extra_args"
132 echo $command ---- $index
133 $command >> $my_file;
134 if [[ "$domain" == "1" ]]; then
135 export domain="2"
136 else
137 export domain="1"
138 fi
139 export extra_args=" -noOutputHeaders "
140 done
141done
142
143export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_be.csv
144touch $my_file
145export extra_args=""
146for index in ${num_reps}; do
147 for DATALEN in ${dataLens}; do
148 export command="taskset -c 0 \
149 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 -best $commands_string $extra_args"
150 echo $command ---- $index
151 $command >> $my_file;
152 if [[ "$domain" == "1" ]]; then
153 export domain="2"
154 else
155 export domain="1"
156 fi
157 export extra_args=" -noOutputHeaders "
158 done
159done
160
161if [[ ${lat_thr} == "thr" ]]; then
162
163 if [[ "$pub_sub" == "pub" ]]; then
164 echo "Publisher side"
165 export commands_string="${commands_string} -batchSize 0"
166 fi
167
168 export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be_noBatch.csv
169 touch $my_file
170 export extra_args=""
171 for index in ${num_reps}; do
172 for DATALEN in ${dataLens}; do
173 export command="taskset -c 0 \
174 $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
175 echo $command ---- $index
176 $command >> $my_file;
177 if [[ "$domain" == "1" ]]; then
178 export domain="2"
179 else
180 export domain="1"
181 fi
182 export extra_args=" -noOutputHeaders "
183 done
184 done
185
186 export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel_noBatch.csv
187 touch $my_file
188 export extra_args=""
189 for index in ${num_reps}; do
190 for DATALEN in ${dataLens}; do
191 export command="taskset -c 0 \
192 $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
193 echo $command ---- $index
194 $command >> $my_file;
195 if [[ "$domain" == "1" ]]; then
196 export domain="2"
197 else
198 export domain="1"
199 fi
200 export extra_args=" -noOutputHeaders "
201 done
202 done
203
204fi
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 maximum throughput between a Publisher and a Subscriber running in two Raspberry Pi 4 nodes using a 1Gbps network. The numbers are for best-effort as well as strict reliable delivery 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 |
2373278 |
118796 |
30.4 |
37120 |
1.54 |
64 |
2291328 |
114471 |
58.6 |
37376 |
1.61 |
128 |
2112821 |
105561 |
108.1 |
34624 |
1.61 |
256 |
1740297 |
86942 |
178.1 |
43072 |
2.42 |
512 |
1283056 |
64089 |
262.5 |
84336 |
6.17 |
1024 |
771964 |
38542 |
315.7 |
162416 |
17.38 |
2048 |
423888 |
21164 |
346.8 |
147688 |
25.84 |
4096 |
218194 |
10898 |
357.1 |
103832 |
32.24 |
8192 |
100526 |
5023 |
329.2 |
86408 |
46.22 |
16384 |
63110 |
3152 |
413.2 |
47656 |
43.02 |
32768 |
42571 |
2127 |
557.6 |
18100 |
29.83 |
63000 |
18869 |
943 |
475.3 |
19128 |
50.34 |
Reliable
Sample Size (Bytes) |
Total Samples |
Avg Samples/s |
Avg Mbps |
Lost Samples |
Lost Samples (%) |
---|---|---|---|---|---|
32 |
1795363 |
89445 |
22.9 |
0 |
0.00 |
64 |
1968512 |
98354 |
50.4 |
0 |
0.00 |
128 |
1838061 |
91818 |
94.0 |
0 |
0.00 |
256 |
1514207 |
75638 |
154.9 |
0 |
0.00 |
512 |
1106080 |
55241 |
226.3 |
0 |
0.00 |
1024 |
696880 |
34802 |
285.1 |
0 |
0.00 |
2048 |
416752 |
20830 |
341.3 |
0 |
0.00 |
4096 |
228966 |
11435 |
374.7 |
0 |
0.00 |
8192 |
128242 |
6406 |
419.8 |
0 |
0.00 |
16384 |
64797 |
3233 |
423.9 |
0 |
0.00 |
32768 |
46059 |
2300 |
603.1 |
0 |
0.00 |
63000 |
23657 |
1181 |
595.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
3
4echo OUTPUT PATH IS $2
5export output_folder=$2
6export pub_sub="pub"
7export lat_thr="lat"
8export num_reps="1 2"
9export dataLens="32 64 128 256 512 1024 2048 4096 8192 16384 32768 63000"
10export domain="2"
11
12if [[ -z "$3" ]]; then
13 echo "You need a third argument with publisher or subscriber"
14 exit -1
15else
16 if [[ "$3" == "publisher" ]]; then
17 echo "Publisher"
18 export pub_sub="pub"
19
20 elif [[ "$3" == "subscriber" ]]; then
21 echo "Subscriber"
22 export pub_sub="sub"
23 else
24 echo "It must be either publisher or subscriber"
25 exit -1
26 fi
27fi
28
29if [[ -z "$4" ]]; then
30 echo "You need a forth argument with lat or thr"
31 exit -1
32else
33 if [[ "$4" == "thr" ]]; then
34 echo "Throughput test"
35 export ${lat_thr}_thr="thr"
36
37 elif [[ "$4" == "lat" ]]; then
38 echo "Latency test"
39 export ${lat_thr}_thr="lat"
40 else
41 echo "It must be either lat or thr"
42 exit -1
43 fi
44fi
45
46if [[ -z "$5" ]]; then
47 echo "Using default nics"
48 export nic1=eno1
49 export nic2=eno1
50else
51 echo "Using custom nic: $5"
52 export nic1=eno1
53 export nic2=eno1
54fi
55
56sudo /set_${lat_thr}_mode.sh
57sleep 10
58
59export exec_time=20
60
61export pub_string="-pub \
62 -transport UDPv4 \
63 -nic $nic1 \
64 -noPrint \
65 -exec $exec_time \
66 -noXML"
67
68if [[ ${lat_thr} == "lat" ]]; then
69 export pub_string="$pub_string \
70 -latencyTest"
71fi
72
73export sub_string="-sub \
74 -transport UDPv4 \
75 -nic $nic2 \
76 -noPrint \
77 -noXML"
78
79if [[ "$pub_sub" == "pub" ]]; then
80 echo "Publisher side"
81 export commands_string=${pub_string}
82else
83 echo "Subscriber side"
84 export commands_string=${sub_string}
85fi
86
87mkdir -p $output_folder
88
89export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel.csv
90touch $my_file
91export extra_args=""
92for index in ${num_reps}; do
93 for DATALEN in 32 64 128 256 512 1024 2048 4096 8192 16384 32768 63000 100000 500000 1048576 1548576 4194304 10485760; do
94 export command="taskset -c 0 \
95 $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
96 echo $command ---- $index
97 $command >> $my_file;
98 if [[ "$domain" == "1" ]]; then
99 export domain="2"
100 else
101 export domain="1"
102 fi
103 export extra_args=" -noOutputHeaders "
104 done
105done
106
107export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be.csv
108touch $my_file
109export extra_args=""
110for index in ${num_reps}; do
111 for DATALEN in ${dataLens}; do
112 export command="taskset -c 0 \
113 $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
114 echo $command ---- $index
115 $command >> $my_file;
116 if [[ "$domain" == "1" ]]; then
117 export domain="2"
118 else
119 export domain="1"
120 fi
121 export extra_args=" -noOutputHeaders "
122 done
123done
124
125export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_rel.csv
126touch $my_file
127export extra_args=""
128for index in ${num_reps}; do
129 for DATALEN in ${dataLens}; do
130 export command="taskset -c 0 \
131 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 $commands_string $extra_args"
132 echo $command ---- $index
133 $command >> $my_file;
134 if [[ "$domain" == "1" ]]; then
135 export domain="2"
136 else
137 export domain="1"
138 fi
139 export extra_args=" -noOutputHeaders "
140 done
141done
142
143export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_be.csv
144touch $my_file
145export extra_args=""
146for index in ${num_reps}; do
147 for DATALEN in ${dataLens}; do
148 export command="taskset -c 0 \
149 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 -best $commands_string $extra_args"
150 echo $command ---- $index
151 $command >> $my_file;
152 if [[ "$domain" == "1" ]]; then
153 export domain="2"
154 else
155 export domain="1"
156 fi
157 export extra_args=" -noOutputHeaders "
158 done
159done
160
161if [[ ${lat_thr} == "thr" ]]; then
162
163 if [[ "$pub_sub" == "pub" ]]; then
164 echo "Publisher side"
165 export commands_string="${commands_string} -batchSize 0"
166 fi
167
168 export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be_noBatch.csv
169 touch $my_file
170 export extra_args=""
171 for index in ${num_reps}; do
172 for DATALEN in ${dataLens}; do
173 export command="taskset -c 0 \
174 $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
175 echo $command ---- $index
176 $command >> $my_file;
177 if [[ "$domain" == "1" ]]; then
178 export domain="2"
179 else
180 export domain="1"
181 fi
182 export extra_args=" -noOutputHeaders "
183 done
184 done
185
186 export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel_noBatch.csv
187 touch $my_file
188 export extra_args=""
189 for index in ${num_reps}; do
190 for DATALEN in ${dataLens}; do
191 export command="taskset -c 0 \
192 $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
193 echo $command ---- $index
194 $command >> $my_file;
195 if [[ "$domain" == "1" ]]; then
196 export domain="2"
197 else
198 export domain="1"
199 fi
200 export extra_args=" -noOutputHeaders "
201 done
202 done
203
204fi
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, UDPv4 10Gbps Network, C++98
The graph below shows the one-way latency without load between a Publisher and a Subscriber running in two Linux nodes in a 10Gbps network. 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 |
18 |
1.1 |
16 |
167 |
17 |
18 |
20 |
47 |
167 |
64 |
18 |
1.1 |
16 |
205 |
17 |
18 |
20 |
47 |
205 |
128 |
18 |
1.1 |
17 |
167 |
18 |
18 |
20 |
47 |
167 |
256 |
18 |
1.1 |
17 |
170 |
18 |
19 |
21 |
48 |
170 |
512 |
19 |
1.2 |
18 |
171 |
19 |
20 |
22 |
49 |
171 |
1024 |
25 |
3.0 |
19 |
178 |
26 |
28 |
29 |
54 |
178 |
2048 |
29 |
9.5 |
22 |
3315 |
30 |
32 |
44 |
68 |
3315 |
4096 |
31 |
10.6 |
27 |
3970 |
30 |
33 |
52 |
67 |
3970 |
8192 |
44 |
8.1 |
38 |
186 |
40 |
56 |
74 |
101 |
186 |
16384 |
90 |
25.9 |
48 |
237 |
89 |
129 |
144 |
158 |
237 |
32768 |
177 |
3.0 |
71 |
322 |
177 |
178 |
180 |
207 |
322 |
63000 |
189 |
2.8 |
106 |
262 |
189 |
190 |
193 |
220 |
262 |
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 |
19 |
1.1 |
18 |
170 |
19 |
20 |
23 |
49 |
170 |
64 |
19 |
1.2 |
18 |
167 |
19 |
20 |
24 |
49 |
167 |
128 |
20 |
1.3 |
18 |
168 |
19 |
20 |
25 |
49 |
168 |
256 |
20 |
1.7 |
18 |
167 |
20 |
21 |
28 |
50 |
167 |
512 |
21 |
5.6 |
19 |
3359 |
20 |
22 |
33 |
50 |
3359 |
1024 |
26 |
9.7 |
20 |
4551 |
26 |
28 |
51 |
59 |
4551 |
2048 |
29 |
9.5 |
22 |
3315 |
30 |
32 |
44 |
68 |
3315 |
4096 |
31 |
10.6 |
27 |
3970 |
30 |
33 |
52 |
67 |
3970 |
8192 |
44 |
8.1 |
38 |
186 |
40 |
56 |
74 |
101 |
186 |
16384 |
92 |
26.8 |
49 |
238 |
91 |
131 |
148 |
167 |
238 |
32768 |
174 |
9.5 |
77 |
249 |
177 |
179 |
183 |
207 |
249 |
63000 |
190 |
2.9 |
112 |
267 |
190 |
192 |
196 |
223 |
267 |
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
3
4export folder_base="$(dirname "${executable}")"/../../..
5
6echo OUTPUT PATH IS $2
7export output_folder=$2
8export pub_sub="pub"
9export lat_thr="lat"
10export num_reps="1 2 3 4"
11export dataLens="32 64 128 256 512 1024 2048 4096 8192 16384 32768 63000"
12export domain="2"
13
14if [[ -z "$3" ]]; then
15 echo "You need a third argument with publisher or subscriber"
16 exit -1
17else
18 if [[ "$3" == "publisher" ]]; then
19 echo "Publisher"
20 export pub_sub="pub"
21
22 elif [[ "$3" == "subscriber" ]]; then
23 echo "Subscriber"
24 export pub_sub="sub"
25 else
26 echo "It must be either publisher or subscriber"
27 exit -1
28 fi
29fi
30
31if [[ -z "$4" ]]; then
32 echo "You need a forth argument with lat or thr"
33 exit -1
34else
35 if [[ "$4" == "thr" ]]; then
36 echo "Throughput test"
37 export ${lat_thr}_thr="thr"
38
39 elif [[ "$4" == "lat" ]]; then
40 echo "Latency test"
41 export ${lat_thr}_thr="lat"
42 else
43 echo "It must be either lat or thr"
44 exit -1
45 fi
46fi
47
48if [[ -z "$5" ]]; then
49 echo "Using default nics"
50 export nic1=172.16.0.1
51 export nic2=172.16.0.2
52else
53 echo "Using custom nic: $5"
54 export nic1=$5
55 export nic2=$5
56fi
57
58sudo /set_${lat_thr}_mode.sh
59sleep 10
60
61export exec_time=20
62
63export pub_string="-pub \
64 -transport UDPv4 \
65 -nic $nic1 \
66 -noPrint \
67 -exec $exec_time"
68
69if [[ ${lat_thr} == "lat" ]]; then
70 export pub_string="$pub_string \
71 -latencyTest"
72fi
73
74export sub_string="-sub \
75 -transport UDPv4 \
76 -nic $nic2 \
77 -noPrint"
78
79if [[ "$pub_sub" == "pub" ]]; then
80 echo "Publisher side"
81 export commands_string=${pub_string}
82else
83 echo "Subscriber side"
84 export commands_string=${sub_string}
85fi
86
87
88cd $folder_base
89mkdir -p $output_folder
90
91export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel.csv
92touch $my_file
93export extra_args=""
94for index in ${num_reps}; do
95 for DATALEN in 32 64 128 256 512 1024 2048 4096 8192 16384 32768 63000 100000 500000 1048576 1548576 4194304 10485760; do
96 export command="taskset -c 0 \
97 $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
98 echo $command ---- $index
99 $command >> $my_file;
100 if [[ "$domain" == "1" ]]; then
101 export domain="2"
102 else
103 export domain="1"
104 fi
105 export extra_args=" -noOutputHeaders "
106 done
107done
108
109export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be.csv
110touch $my_file
111export extra_args=""
112for index in ${num_reps}; do
113 for DATALEN in ${dataLens}; do
114 export command="taskset -c 0 \
115 $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
116 echo $command ---- $index
117 $command >> $my_file;
118 if [[ "$domain" == "1" ]]; then
119 export domain="2"
120 else
121 export domain="1"
122 fi
123 export extra_args=" -noOutputHeaders "
124 done
125done
126
127export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_rel.csv
128touch $my_file
129export extra_args=""
130for index in ${num_reps}; do
131 for DATALEN in ${dataLens}; do
132 export command="taskset -c 0 \
133 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 $commands_string $extra_args"
134 echo $command ---- $index
135 $command >> $my_file;
136 if [[ "$domain" == "1" ]]; then
137 export domain="2"
138 else
139 export domain="1"
140 fi
141 export extra_args=" -noOutputHeaders "
142 done
143done
144
145export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_be.csv
146touch $my_file
147export extra_args=""
148for index in ${num_reps}; do
149 for DATALEN in ${dataLens}; do
150 export command="taskset -c 0 \
151 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 -best $commands_string $extra_args"
152 echo $command ---- $index
153 $command >> $my_file;
154 if [[ "$domain" == "1" ]]; then
155 export domain="2"
156 else
157 export domain="1"
158 fi
159 export extra_args=" -noOutputHeaders "
160 done
161done
162
163if [[ ${lat_thr} == "thr" ]]; then
164
165 if [[ "$pub_sub" == "pub" ]]; then
166 echo "Publisher side"
167 export commands_string="${commands_string} -batchSize 0"
168 fi
169
170 export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be_noBatch.csv
171 touch $my_file
172 export extra_args=""
173 for index in ${num_reps}; do
174 for DATALEN in ${dataLens}; do
175 export command="taskset -c 0 \
176 $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
177 echo $command ---- $index
178 $command >> $my_file;
179 if [[ "$domain" == "1" ]]; then
180 export domain="2"
181 else
182 export domain="1"
183 fi
184 export extra_args=" -noOutputHeaders "
185 done
186 done
187
188 export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel_noBatch.csv
189 touch $my_file
190 export extra_args=""
191 for index in ${num_reps}; do
192 for DATALEN in ${dataLens}; do
193 export command="taskset -c 0 \
194 $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
195 echo $command ---- $index
196 $command >> $my_file;
197 if [[ "$domain" == "1" ]]; then
198 export domain="2"
199 else
200 export domain="1"
201 fi
202 export extra_args=" -noOutputHeaders "
203 done
204 done
205
206fi
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 Linux nodes in a 10Gbps network. 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 |
24387840 |
1218129 |
311.8 |
12754 |
0.05 |
64 |
24055759 |
1201650 |
615.2 |
26880 |
0.11 |
128 |
22926133 |
1144743 |
1172.2 |
24512 |
0.11 |
256 |
20950281 |
1046141 |
2142.5 |
37408 |
0.18 |
512 |
18475408 |
922272 |
3777.6 |
17696 |
0.10 |
1024 |
14632440 |
730729 |
5986.1 |
18352 |
0.13 |
2048 |
10273500 |
513071 |
8406.2 |
9708 |
0.09 |
4096 |
5955940 |
297530 |
9749.5 |
0 |
0.00 |
8192 |
2997952 |
149843 |
9820.2 |
0 |
0.00 |
16384 |
1506931 |
75337 |
9874.7 |
21 |
0.00 |
32768 |
755522 |
37773 |
9902.1 |
10 |
0.00 |
63000 |
393381 |
19667 |
9912.5 |
5 |
0.00 |
Reliable
Sample Size (Bytes) |
Total Samples |
Avg Samples/s |
Avg Mbps |
Lost Samples |
Lost Samples (%) |
---|---|---|---|---|---|
32 |
22540971 |
1125558 |
288.1 |
0 |
0.00 |
64 |
22040372 |
1100603 |
563.5 |
0 |
0.00 |
128 |
20764032 |
1037259 |
1062.2 |
0 |
0.00 |
256 |
18424896 |
920745 |
1885.7 |
0 |
0.00 |
512 |
15700624 |
784151 |
3211.9 |
0 |
0.00 |
1024 |
11791881 |
588797 |
4823.4 |
0 |
0.00 |
2048 |
7884852 |
393706 |
6450.5 |
0 |
0.00 |
4096 |
4819791 |
240659 |
7885.9 |
0 |
0.00 |
8192 |
2997655 |
149741 |
9813.5 |
0 |
0.00 |
16384 |
1506850 |
75322 |
9872.7 |
0 |
0.00 |
32768 |
755513 |
37769 |
9901.2 |
0 |
0.00 |
63000 |
393393 |
19666 |
9912.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
3
4export folder_base="$(dirname "${executable}")"/../../..
5
6echo OUTPUT PATH IS $2
7export output_folder=$2
8export pub_sub="pub"
9export lat_thr="lat"
10export num_reps="1 2 3 4"
11export dataLens="32 64 128 256 512 1024 2048 4096 8192 16384 32768 63000"
12export domain="2"
13
14if [[ -z "$3" ]]; then
15 echo "You need a third argument with publisher or subscriber"
16 exit -1
17else
18 if [[ "$3" == "publisher" ]]; then
19 echo "Publisher"
20 export pub_sub="pub"
21
22 elif [[ "$3" == "subscriber" ]]; then
23 echo "Subscriber"
24 export pub_sub="sub"
25 else
26 echo "It must be either publisher or subscriber"
27 exit -1
28 fi
29fi
30
31if [[ -z "$4" ]]; then
32 echo "You need a forth argument with lat or thr"
33 exit -1
34else
35 if [[ "$4" == "thr" ]]; then
36 echo "Throughput test"
37 export ${lat_thr}_thr="thr"
38
39 elif [[ "$4" == "lat" ]]; then
40 echo "Latency test"
41 export ${lat_thr}_thr="lat"
42 else
43 echo "It must be either lat or thr"
44 exit -1
45 fi
46fi
47
48if [[ -z "$5" ]]; then
49 echo "Using default nics"
50 export nic1=172.16.0.1
51 export nic2=172.16.0.2
52else
53 echo "Using custom nic: $5"
54 export nic1=$5
55 export nic2=$5
56fi
57
58sudo /set_${lat_thr}_mode.sh
59sleep 10
60
61export exec_time=20
62
63export pub_string="-pub \
64 -transport UDPv4 \
65 -nic $nic1 \
66 -noPrint \
67 -exec $exec_time"
68
69if [[ ${lat_thr} == "lat" ]]; then
70 export pub_string="$pub_string \
71 -latencyTest"
72fi
73
74export sub_string="-sub \
75 -transport UDPv4 \
76 -nic $nic2 \
77 -noPrint"
78
79if [[ "$pub_sub" == "pub" ]]; then
80 echo "Publisher side"
81 export commands_string=${pub_string}
82else
83 echo "Subscriber side"
84 export commands_string=${sub_string}
85fi
86
87
88cd $folder_base
89mkdir -p $output_folder
90
91export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel.csv
92touch $my_file
93export extra_args=""
94for index in ${num_reps}; do
95 for DATALEN in 32 64 128 256 512 1024 2048 4096 8192 16384 32768 63000 100000 500000 1048576 1548576 4194304 10485760; do
96 export command="taskset -c 0 \
97 $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
98 echo $command ---- $index
99 $command >> $my_file;
100 if [[ "$domain" == "1" ]]; then
101 export domain="2"
102 else
103 export domain="1"
104 fi
105 export extra_args=" -noOutputHeaders "
106 done
107done
108
109export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be.csv
110touch $my_file
111export extra_args=""
112for index in ${num_reps}; do
113 for DATALEN in ${dataLens}; do
114 export command="taskset -c 0 \
115 $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
116 echo $command ---- $index
117 $command >> $my_file;
118 if [[ "$domain" == "1" ]]; then
119 export domain="2"
120 else
121 export domain="1"
122 fi
123 export extra_args=" -noOutputHeaders "
124 done
125done
126
127export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_rel.csv
128touch $my_file
129export extra_args=""
130for index in ${num_reps}; do
131 for DATALEN in ${dataLens}; do
132 export command="taskset -c 0 \
133 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 $commands_string $extra_args"
134 echo $command ---- $index
135 $command >> $my_file;
136 if [[ "$domain" == "1" ]]; then
137 export domain="2"
138 else
139 export domain="1"
140 fi
141 export extra_args=" -noOutputHeaders "
142 done
143done
144
145export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_be.csv
146touch $my_file
147export extra_args=""
148for index in ${num_reps}; do
149 for DATALEN in ${dataLens}; do
150 export command="taskset -c 0 \
151 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 -best $commands_string $extra_args"
152 echo $command ---- $index
153 $command >> $my_file;
154 if [[ "$domain" == "1" ]]; then
155 export domain="2"
156 else
157 export domain="1"
158 fi
159 export extra_args=" -noOutputHeaders "
160 done
161done
162
163if [[ ${lat_thr} == "thr" ]]; then
164
165 if [[ "$pub_sub" == "pub" ]]; then
166 echo "Publisher side"
167 export commands_string="${commands_string} -batchSize 0"
168 fi
169
170 export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be_noBatch.csv
171 touch $my_file
172 export extra_args=""
173 for index in ${num_reps}; do
174 for DATALEN in ${dataLens}; do
175 export command="taskset -c 0 \
176 $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
177 echo $command ---- $index
178 $command >> $my_file;
179 if [[ "$domain" == "1" ]]; then
180 export domain="2"
181 else
182 export domain="1"
183 fi
184 export extra_args=" -noOutputHeaders "
185 done
186 done
187
188 export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel_noBatch.csv
189 touch $my_file
190 export extra_args=""
191 for index in ${num_reps}; do
192 for DATALEN in ${dataLens}; do
193 export command="taskset -c 0 \
194 $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
195 echo $command ---- $index
196 $command >> $my_file;
197 if [[ "$domain" == "1" ]]; then
198 export domain="2"
199 else
200 export domain="1"
201 fi
202 export extra_args=" -noOutputHeaders "
203 done
204 done
205
206fi
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