Real-Time WAN Transport (UDPv4_WAN)
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 Real-Time WAN Transport (UDPv4_WAN).
Note
Even though we are using the Real-Time WAN Transport, this testing has been performed on a LAN to be able to compare the results with the built-in UDPv4 transport. The differences are negligible as shown in the graphs below. Find more information and tests in the Real-Time WAN vs UDPv4 in LAN section.
Find information about the hardware, network, and command-line parameters after each of the tests.
Unkeyed, UDPv4_WAN 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 |
16 |
1.0 |
14 |
54 |
16 |
16 |
17 |
44 |
54 |
64 |
17 |
1.0 |
16 |
52 |
17 |
17 |
18 |
45 |
52 |
128 |
16 |
1.0 |
14 |
124 |
16 |
16 |
17 |
44 |
124 |
256 |
17 |
0.9 |
16 |
53 |
17 |
18 |
19 |
46 |
53 |
512 |
19 |
1.1 |
16 |
49 |
19 |
20 |
21 |
46 |
49 |
1024 |
26 |
1.0 |
18 |
55 |
26 |
27 |
27 |
50 |
55 |
2048 |
50 |
1435.6 |
19 |
100056 |
30 |
31 |
36 |
100054 |
100056 |
4096 |
37 |
817.2 |
25 |
100061 |
30 |
31 |
42 |
63 |
100061 |
8192 |
40 |
8.2 |
34 |
87 |
35 |
55 |
61 |
75 |
87 |
16384 |
84 |
21.2 |
45 |
160 |
83 |
118 |
133 |
144 |
160 |
32768 |
172 |
2.1 |
66 |
203 |
172 |
173 |
175 |
202 |
203 |
63000 |
185 |
2.7 |
101 |
215 |
185 |
186 |
188 |
214 |
215 |
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 |
16 |
0.9 |
15 |
65 |
16 |
17 |
19 |
46 |
65 |
64 |
18 |
1.1 |
17 |
52 |
18 |
19 |
22 |
47 |
52 |
128 |
17 |
1.2 |
16 |
130 |
17 |
18 |
23 |
46 |
130 |
256 |
19 |
1.7 |
17 |
54 |
19 |
21 |
26 |
48 |
54 |
512 |
20 |
2.5 |
17 |
56 |
19 |
25 |
28 |
48 |
56 |
1024 |
25 |
3.2 |
19 |
70 |
26 |
27 |
35 |
54 |
70 |
2048 |
29 |
32.5 |
20 |
4990 |
30 |
31 |
36 |
62 |
4990 |
4096 |
31 |
16.8 |
26 |
4800 |
30 |
31 |
43 |
62 |
4800 |
8192 |
40 |
7.1 |
35 |
107 |
36 |
53 |
61 |
77 |
107 |
16384 |
86 |
26.2 |
46 |
170 |
85 |
124 |
137 |
153 |
170 |
32768 |
173 |
5.2 |
73 |
205 |
174 |
175 |
178 |
203 |
205 |
63000 |
186 |
2.6 |
110 |
220 |
186 |
187 |
192 |
216 |
220 |
100000 |
208 |
7.4 |
169 |
283 |
210 |
212 |
218 |
244 |
283 |
500000 |
653 |
23.4 |
556 |
814 |
660 |
664 |
714 |
776 |
814 |
1048576 |
1135 |
116.4 |
1012 |
8481 |
1156 |
1201 |
1266 |
8481 |
8481 |
1548576 |
1648 |
121.3 |
1468 |
7921 |
1641 |
1682 |
1775 |
7921 |
7921 |
4194304 |
4003 |
103.2 |
3946 |
7232 |
3999 |
4012 |
4031 |
7232 |
7232 |
10485760 |
10556 |
680.7 |
10447 |
21491 |
10488 |
10534 |
11516 |
21491 |
21491 |
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"
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=10.2.78.20
51 export nic2=10.2.78.21
52else
53 echo "Using custom nic NOT IMPLEMENTED YET."
54 export nic1=10.2.78.20
55 export nic2=10.2.78.21
56fi
57
58
59sudo /set_${lat_thr}_mode.sh
60sleep 10
61
62export exec_time=20
63
64export pub_string="-pub \
65 -transport UDPv4_WAN \
66 -transportPublicAddress $nic1:7400 \
67 -nic $nic1 \
68 -noPrint \
69 -exec $exec_time"
70
71if [[ ${lat_thr} == "lat" ]]; then
72 export pub_string="$pub_string \
73 -latencyTest"
74fi
75
76export sub_string="-sub \
77 -transport UDPv4_WAN \
78 -peer 0@udpv4_wan://$nic1:7400 \
79 -nic $nic2 \
80 -noPrint"
81
82if [[ "$pub_sub" == "pub" ]]; then
83 echo "Publisher side"
84 export commands_string=${pub_string}
85else
86 echo "Subscriber side"
87 export commands_string=${sub_string}
88fi
89
90
91cd $folder_base
92mkdir -p $output_folder
93
94export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel.csv
95touch $my_file
96export extra_args=""
97for index in ${num_reps}; do
98 for DATALEN in 32 64 128 256 512 1024 2048 4096 8192 16384 32768 63000 100000 500000 1048576 1548576 4194304 10485760; do
99 export command="taskset -c 0 \
100 $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
101 echo $command ---- $index
102 $command >> $my_file;
103 if [[ "$domain" == "1" ]]; then
104 export domain="2"
105 else
106 export domain="1"
107 fi
108 export extra_args=" -noOutputHeaders "
109 done
110done
111
112export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be.csv
113touch $my_file
114export extra_args=""
115for index in ${num_reps}; do
116 for DATALEN in ${dataLens}; do
117 export command="taskset -c 0 \
118 $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
119 echo $command ---- $index
120 $command >> $my_file;
121 if [[ "$domain" == "1" ]]; then
122 export domain="2"
123 else
124 export domain="1"
125 fi
126 export extra_args=" -noOutputHeaders "
127 done
128done
129
130export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_rel.csv
131touch $my_file
132export extra_args=""
133for index in ${num_reps}; do
134 for DATALEN in ${dataLens}; do
135 export command="taskset -c 0 \
136 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 $commands_string $extra_args"
137 echo $command ---- $index
138 $command >> $my_file;
139 if [[ "$domain" == "1" ]]; then
140 export domain="2"
141 else
142 export domain="1"
143 fi
144 export extra_args=" -noOutputHeaders "
145 done
146done
147
148export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_be.csv
149touch $my_file
150export extra_args=""
151for index in ${num_reps}; do
152 for DATALEN in ${dataLens}; do
153 export command="taskset -c 0 \
154 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 -best $commands_string $extra_args"
155 echo $command ---- $index
156 $command >> $my_file;
157 if [[ "$domain" == "1" ]]; then
158 export domain="2"
159 else
160 export domain="1"
161 fi
162 export extra_args=" -noOutputHeaders "
163 done
164done
165
166# if [[ ${lat_thr} == "thr" ]]; then
167
168# if [[ "$pub_sub" == "pub" ]]; then
169# echo "Publisher side"
170# export commands_string="${commands_string} -batchSize 0"
171# fi
172
173# export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be_noBatch.csv
174# touch $my_file
175# export extra_args=""
176# for index in ${num_reps}; do
177# for DATALEN in ${dataLens}; do
178# export command="taskset -c 0 \
179# $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
180# echo $command ---- $index
181# $command >> $my_file;
182# if [[ "$domain" == "1" ]]; then
183# export domain="2"
184# else
185# export domain="1"
186# fi
187# export extra_args=" -noOutputHeaders "
188# done
189# done
190
191# export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel_noBatch.csv
192# touch $my_file
193# export extra_args=""
194# for index in ${num_reps}; do
195# for DATALEN in ${dataLens}; do
196# export command="taskset -c 0 \
197# $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
198# echo $command ---- $index
199# $command >> $my_file;
200# if [[ "$domain" == "1" ]]; then
201# export domain="2"
202# else
203# export domain="1"
204# fi
205# export extra_args=" -noOutputHeaders "
206# done
207# done
208
209# fi
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 |
96837138 |
4836772 |
1238.2 |
105728 |
0.11 |
64 |
89848092 |
4488445 |
2298.1 |
4480 |
0.00 |
128 |
78529081 |
3922474 |
4016.6 |
64 |
0.00 |
256 |
63225888 |
3158160 |
6467.9 |
4352 |
0.01 |
512 |
40445504 |
2021704 |
8280.9 |
320 |
0.00 |
1024 |
20245104 |
1012224 |
8292.1 |
472 |
0.00 |
2048 |
10122764 |
506131 |
8292.5 |
132 |
0.00 |
4096 |
5061526 |
253071 |
8292.6 |
14 |
0.00 |
8192 |
2530652 |
126531 |
8292.4 |
57 |
0.00 |
16384 |
1507632 |
75380 |
9880.3 |
1292 |
0.09 |
32768 |
755524 |
37775 |
9902.7 |
139 |
0.02 |
63000 |
387456 |
19372 |
9763.9 |
175 |
0.05 |
Reliable
Sample Size (Bytes) |
Total Samples |
Avg Samples/s |
Avg Mbps |
Lost Samples |
Lost Samples (%) |
---|---|---|---|---|---|
32 |
93191755 |
4653555 |
1191.3 |
0 |
0.00 |
64 |
82726043 |
4130908 |
2115.0 |
0 |
0.00 |
128 |
71947775 |
3592657 |
3678.9 |
0 |
0.00 |
256 |
52756384 |
2636566 |
5399.7 |
0 |
0.00 |
512 |
34594048 |
1729191 |
7082.8 |
0 |
0.00 |
1024 |
18480737 |
923829 |
7568.0 |
0 |
0.00 |
2048 |
9914328 |
495711 |
8121.7 |
0 |
0.00 |
4096 |
5054140 |
252683 |
8279.9 |
0 |
0.00 |
8192 |
2530158 |
126506 |
8290.7 |
0 |
0.00 |
16384 |
1507049 |
75347 |
9876.0 |
0 |
0.00 |
32768 |
752746 |
37636 |
9866.3 |
0 |
0.00 |
63000 |
390939 |
19546 |
9851.6 |
0 |
0.00 |
100000 |
214140 |
10704 |
8563.9 |
0 |
0.00 |
500000 |
43791 |
2187 |
8750.0 |
0 |
0.00 |
1048576 |
20578 |
1028 |
8628.0 |
0 |
0.00 |
1548576 |
13813 |
689 |
8544.2 |
0 |
0.00 |
4194304 |
4642 |
230 |
7743.7 |
0 |
0.00 |
10485760 |
1784 |
88 |
7416.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"
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=10.2.78.20
51 export nic2=10.2.78.21
52else
53 echo "Using custom nic NOT IMPLEMENTED YET."
54 export nic1=10.2.78.20
55 export nic2=10.2.78.21
56fi
57
58
59sudo /set_${lat_thr}_mode.sh
60sleep 10
61
62export exec_time=20
63
64export pub_string="-pub \
65 -transport UDPv4_WAN \
66 -transportPublicAddress $nic1:7400 \
67 -nic $nic1 \
68 -noPrint \
69 -exec $exec_time"
70
71if [[ ${lat_thr} == "lat" ]]; then
72 export pub_string="$pub_string \
73 -latencyTest"
74fi
75
76export sub_string="-sub \
77 -transport UDPv4_WAN \
78 -peer 0@udpv4_wan://$nic1:7400 \
79 -nic $nic2 \
80 -noPrint"
81
82if [[ "$pub_sub" == "pub" ]]; then
83 echo "Publisher side"
84 export commands_string=${pub_string}
85else
86 echo "Subscriber side"
87 export commands_string=${sub_string}
88fi
89
90
91cd $folder_base
92mkdir -p $output_folder
93
94export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel.csv
95touch $my_file
96export extra_args=""
97for index in ${num_reps}; do
98 for DATALEN in 32 64 128 256 512 1024 2048 4096 8192 16384 32768 63000 100000 500000 1048576 1548576 4194304 10485760; do
99 export command="taskset -c 0 \
100 $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
101 echo $command ---- $index
102 $command >> $my_file;
103 if [[ "$domain" == "1" ]]; then
104 export domain="2"
105 else
106 export domain="1"
107 fi
108 export extra_args=" -noOutputHeaders "
109 done
110done
111
112export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be.csv
113touch $my_file
114export extra_args=""
115for index in ${num_reps}; do
116 for DATALEN in ${dataLens}; do
117 export command="taskset -c 0 \
118 $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
119 echo $command ---- $index
120 $command >> $my_file;
121 if [[ "$domain" == "1" ]]; then
122 export domain="2"
123 else
124 export domain="1"
125 fi
126 export extra_args=" -noOutputHeaders "
127 done
128done
129
130export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_rel.csv
131touch $my_file
132export extra_args=""
133for index in ${num_reps}; do
134 for DATALEN in ${dataLens}; do
135 export command="taskset -c 0 \
136 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 $commands_string $extra_args"
137 echo $command ---- $index
138 $command >> $my_file;
139 if [[ "$domain" == "1" ]]; then
140 export domain="2"
141 else
142 export domain="1"
143 fi
144 export extra_args=" -noOutputHeaders "
145 done
146done
147
148export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_be.csv
149touch $my_file
150export extra_args=""
151for index in ${num_reps}; do
152 for DATALEN in ${dataLens}; do
153 export command="taskset -c 0 \
154 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 -best $commands_string $extra_args"
155 echo $command ---- $index
156 $command >> $my_file;
157 if [[ "$domain" == "1" ]]; then
158 export domain="2"
159 else
160 export domain="1"
161 fi
162 export extra_args=" -noOutputHeaders "
163 done
164done
165
166# if [[ ${lat_thr} == "thr" ]]; then
167
168# if [[ "$pub_sub" == "pub" ]]; then
169# echo "Publisher side"
170# export commands_string="${commands_string} -batchSize 0"
171# fi
172
173# export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be_noBatch.csv
174# touch $my_file
175# export extra_args=""
176# for index in ${num_reps}; do
177# for DATALEN in ${dataLens}; do
178# export command="taskset -c 0 \
179# $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
180# echo $command ---- $index
181# $command >> $my_file;
182# if [[ "$domain" == "1" ]]; then
183# export domain="2"
184# else
185# export domain="1"
186# fi
187# export extra_args=" -noOutputHeaders "
188# done
189# done
190
191# export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel_noBatch.csv
192# touch $my_file
193# export extra_args=""
194# for index in ${num_reps}; do
195# for DATALEN in ${dataLens}; do
196# export command="taskset -c 0 \
197# $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
198# echo $command ---- $index
199# $command >> $my_file;
200# if [[ "$domain" == "1" ]]; then
201# export domain="2"
202# else
203# export domain="1"
204# fi
205# export extra_args=" -noOutputHeaders "
206# done
207# done
208
209# fi
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