TCP
The following tests have been performed by executing RTI Perftest C++98 Publisher and a 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 TCP.
Find the information about the hardware, network and command-line parameters after each of the tests.
Unkeyed, TCP 10Gbps, 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 |
21 |
18.0 |
17 |
151 |
18 |
18 |
124 |
129 |
151 |
64 |
24 |
23.3 |
17 |
153 |
18 |
18 |
124 |
132 |
153 |
128 |
19 |
10.5 |
17 |
137 |
18 |
19 |
64 |
126 |
137 |
256 |
19 |
5.9 |
18 |
145 |
19 |
19 |
23 |
125 |
145 |
512 |
26 |
145.9 |
17 |
100054 |
22 |
45 |
69 |
137 |
100054 |
1024 |
25 |
136.8 |
18 |
100057 |
23 |
33 |
65 |
139 |
100057 |
2048 |
25 |
162.9 |
21 |
100056 |
22 |
27 |
58 |
132 |
100056 |
4096 |
28 |
14.8 |
25 |
8125 |
27 |
28 |
47 |
125 |
8125 |
8192 |
38 |
149.1 |
34 |
100042 |
37 |
40 |
75 |
140 |
100042 |
16384 |
89 |
36.3 |
42 |
196 |
67 |
127 |
167 |
176 |
196 |
32768 |
78 |
28.1 |
59 |
203 |
61 |
124 |
129 |
182 |
203 |
63000 |
96 |
17.0 |
90 |
241 |
91 |
100 |
193 |
229 |
241 |
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 |
21 |
12.0 |
18 |
149 |
19 |
21 |
124 |
132 |
149 |
64 |
22 |
15.6 |
19 |
156 |
19 |
21 |
124 |
132 |
156 |
128 |
21 |
8.3 |
19 |
153 |
20 |
21 |
36 |
130 |
153 |
256 |
22 |
14.9 |
19 |
150 |
20 |
21 |
124 |
132 |
150 |
512 |
25 |
20.2 |
19 |
5057 |
21 |
35 |
124 |
132 |
5057 |
1024 |
23 |
13.1 |
20 |
4855 |
22 |
23 |
52 |
129 |
4855 |
2048 |
28 |
15.1 |
22 |
167 |
24 |
43 |
125 |
130 |
167 |
4096 |
29 |
3.6 |
27 |
132 |
28 |
29 |
41 |
125 |
132 |
8192 |
45 |
110.6 |
36 |
5050 |
39 |
53 |
125 |
4649 |
5050 |
16384 |
103 |
40.3 |
44 |
199 |
108 |
167 |
169 |
186 |
199 |
32768 |
79 |
27.1 |
61 |
192 |
62 |
124 |
130 |
180 |
192 |
63000 |
98 |
16.1 |
91 |
240 |
92 |
116 |
189 |
229 |
240 |
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=10.2.78.20
49 export nic2=10.2.78.21
50else
51 echo "Using custom nic: $5"
52 export nic1=$5
53 export nic2=$5
54fi
55
56sudo /set_${lat_thr}_mode.sh
57sleep 10
58
59export exec_time=20
60
61export pub_string="-pub \
62 -transport TCP\
63 -peer 0@tcpv4_lan://10.2.78.21:7400 \
64 -nic $nic1 \
65 -noPrint \
66 -exec $exec_time \
67 -initialBurst 100\
68 -noXML"
69
70if [[ ${lat_thr} == "lat" ]]; then
71 export pub_string="$pub_string \
72 -latencyTest"
73fi
74
75export sub_string="-sub \
76 -transport TCP\
77 -peer 0@tcpv4_lan://10.2.78.20:7400 \
78 -nic $nic2 \
79 -noPrint \
80 -noXML"
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
90mkdir -p $output_folder
91
92export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel.csv
93touch $my_file
94export extra_args=""
95for index in ${num_reps}; do
96 for DATALEN in ${dataLens}; do
97 export command="taskset -c 0 \
98 $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
99 echo $command ---- $index
100 $command >> $my_file;
101 if [[ "$domain" == "1" ]]; then
102 export domain="2"
103 else
104 export domain="1"
105 fi
106 export extra_args=" -noOutputHeaders "
107 done
108done
109
110export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be.csv
111touch $my_file
112export extra_args=""
113for index in ${num_reps}; do
114 for DATALEN in ${dataLens}; do
115 export command="taskset -c 0 \
116 $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
117 echo $command ---- $index
118 $command >> $my_file;
119 if [[ "$domain" == "1" ]]; then
120 export domain="2"
121 else
122 export domain="1"
123 fi
124 export extra_args=" -noOutputHeaders "
125 done
126done
127
128export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_rel.csv
129touch $my_file
130export extra_args=""
131for index in ${num_reps}; do
132 for DATALEN in ${dataLens}; do
133 export command="taskset -c 0 \
134 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 $commands_string $extra_args"
135 echo $command ---- $index
136 $command >> $my_file;
137 if [[ "$domain" == "1" ]]; then
138 export domain="2"
139 else
140 export domain="1"
141 fi
142 export extra_args=" -noOutputHeaders "
143 done
144done
145
146export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_be.csv
147touch $my_file
148export extra_args=""
149for index in ${num_reps}; do
150 for DATALEN in ${dataLens}; do
151 export command="taskset -c 0 \
152 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 -best $commands_string $extra_args"
153 echo $command ---- $index
154 $command >> $my_file;
155 if [[ "$domain" == "1" ]]; then
156 export domain="2"
157 else
158 export domain="1"
159 fi
160 export extra_args=" -noOutputHeaders "
161 done
162done
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 |
98487078 |
4915357 |
1258.3 |
0 |
0.00 |
64 |
89275948 |
4455820 |
2281.4 |
0 |
0.00 |
128 |
77711360 |
3879055 |
3972.2 |
0 |
0.00 |
256 |
60156691 |
3004668 |
6153.6 |
0 |
0.00 |
512 |
40969808 |
2048148 |
8389.2 |
0 |
0.00 |
1024 |
22782966 |
1139103 |
9331.5 |
0 |
0.00 |
2048 |
11455128 |
572741 |
9383.8 |
0 |
0.00 |
4096 |
5648128 |
282398 |
9253.6 |
0 |
0.00 |
8192 |
2877097 |
143852 |
9427.5 |
0 |
0.00 |
16384 |
1451717 |
72584 |
9513.8 |
0 |
0.00 |
32768 |
716291 |
35814 |
9388.4 |
0 |
0.00 |
63000 |
334962 |
16747 |
8441.0 |
0 |
0.00 |
Reliable
Sample Size (Bytes) |
Total Samples |
Avg Samples/s |
Avg Mbps |
Lost Samples |
Lost Samples (%) |
---|---|---|---|---|---|
32 |
93046543 |
4647332 |
1189.7 |
0 |
0.00 |
64 |
85580554 |
4274191 |
2188.4 |
0 |
0.00 |
128 |
71694272 |
3580535 |
3666.5 |
0 |
0.00 |
256 |
54293408 |
2711417 |
5553.0 |
0 |
0.00 |
512 |
36536048 |
1826691 |
7482.1 |
0 |
0.00 |
1024 |
21515560 |
1075222 |
8808.2 |
0 |
0.00 |
2048 |
11466140 |
573254 |
9392.2 |
0 |
0.00 |
4096 |
5773404 |
288621 |
9457.5 |
0 |
0.00 |
8192 |
2916283 |
145811 |
9555.9 |
0 |
0.00 |
16384 |
1430266 |
71512 |
9373.2 |
0 |
0.00 |
32768 |
713511 |
35675 |
9352.0 |
0 |
0.00 |
63000 |
348011 |
17400 |
8769.8 |
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=10.2.78.20
49 export nic2=10.2.78.21
50else
51 echo "Using custom nic: $5"
52 export nic1=$5
53 export nic2=$5
54fi
55
56sudo /set_${lat_thr}_mode.sh
57sleep 10
58
59export exec_time=20
60
61export pub_string="-pub \
62 -transport TCP\
63 -peer 0@tcpv4_lan://10.2.78.21:7400 \
64 -nic $nic1 \
65 -noPrint \
66 -exec $exec_time \
67 -initialBurst 100\
68 -noXML"
69
70if [[ ${lat_thr} == "lat" ]]; then
71 export pub_string="$pub_string \
72 -latencyTest"
73fi
74
75export sub_string="-sub \
76 -transport TCP\
77 -peer 0@tcpv4_lan://10.2.78.20:7400 \
78 -nic $nic2 \
79 -noPrint \
80 -noXML"
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
90mkdir -p $output_folder
91
92export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel.csv
93touch $my_file
94export extra_args=""
95for index in ${num_reps}; do
96 for DATALEN in ${dataLens}; do
97 export command="taskset -c 0 \
98 $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
99 echo $command ---- $index
100 $command >> $my_file;
101 if [[ "$domain" == "1" ]]; then
102 export domain="2"
103 else
104 export domain="1"
105 fi
106 export extra_args=" -noOutputHeaders "
107 done
108done
109
110export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be.csv
111touch $my_file
112export extra_args=""
113for index in ${num_reps}; do
114 for DATALEN in ${dataLens}; do
115 export command="taskset -c 0 \
116 $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
117 echo $command ---- $index
118 $command >> $my_file;
119 if [[ "$domain" == "1" ]]; then
120 export domain="2"
121 else
122 export domain="1"
123 fi
124 export extra_args=" -noOutputHeaders "
125 done
126done
127
128export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_rel.csv
129touch $my_file
130export extra_args=""
131for index in ${num_reps}; do
132 for DATALEN in ${dataLens}; do
133 export command="taskset -c 0 \
134 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 $commands_string $extra_args"
135 echo $command ---- $index
136 $command >> $my_file;
137 if [[ "$domain" == "1" ]]; then
138 export domain="2"
139 else
140 export domain="1"
141 fi
142 export extra_args=" -noOutputHeaders "
143 done
144done
145
146export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_be.csv
147touch $my_file
148export extra_args=""
149for index in ${num_reps}; do
150 for DATALEN in ${dataLens}; do
151 export command="taskset -c 0 \
152 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 -best $commands_string $extra_args"
153 echo $command ---- $index
154 $command >> $my_file;
155 if [[ "$domain" == "1" ]]; then
156 export domain="2"
157 else
158 export domain="1"
159 fi
160 export extra_args=" -noOutputHeaders "
161 done
162done
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, TCP 10Gbps, 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 |
23 |
14.8 |
19 |
170 |
21 |
22 |
124 |
129 |
170 |
64 |
24 |
18.4 |
20 |
201 |
21 |
22 |
124 |
131 |
201 |
128 |
25 |
18.5 |
20 |
267 |
21 |
23 |
124 |
131 |
267 |
256 |
39 |
38.3 |
20 |
198 |
22 |
124 |
125 |
134 |
198 |
512 |
29 |
131.0 |
21 |
100058 |
26 |
36 |
69 |
141 |
100058 |
1024 |
25 |
44.0 |
21 |
20616 |
23 |
25 |
56 |
126 |
20616 |
2048 |
31 |
138.8 |
23 |
100063 |
27 |
40 |
65 |
142 |
100063 |
4096 |
30 |
19.7 |
28 |
8418 |
30 |
31 |
40 |
125 |
8418 |
8192 |
41 |
148.3 |
37 |
100077 |
39 |
43 |
81 |
139 |
100077 |
16384 |
108 |
38.3 |
46 |
242 |
110 |
170 |
172 |
195 |
242 |
32768 |
81 |
27.0 |
62 |
264 |
65 |
124 |
131 |
183 |
264 |
63000 |
99 |
15.7 |
93 |
240 |
94 |
104 |
190 |
229 |
240 |
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 |
28 |
23.0 |
21 |
217 |
22 |
25 |
125 |
133 |
217 |
64 |
28 |
23.4 |
21 |
180 |
22 |
25 |
125 |
133 |
180 |
128 |
31 |
26.6 |
21 |
172 |
23 |
26 |
125 |
135 |
172 |
256 |
31 |
27.5 |
21 |
175 |
23 |
27 |
125 |
135 |
175 |
512 |
25 |
12.8 |
21 |
5017 |
23 |
26 |
55 |
130 |
5017 |
1024 |
27 |
12.0 |
22 |
3394 |
25 |
29 |
66 |
131 |
3394 |
2048 |
30 |
24.3 |
24 |
4536 |
27 |
33 |
124 |
132 |
4536 |
4096 |
32 |
12.3 |
29 |
4538 |
31 |
33 |
39 |
125 |
4538 |
8192 |
44 |
4.6 |
39 |
200 |
42 |
50 |
61 |
125 |
200 |
16384 |
109 |
40.0 |
47 |
209 |
112 |
171 |
173 |
192 |
209 |
32768 |
83 |
26.2 |
63 |
268 |
66 |
124 |
131 |
183 |
268 |
63000 |
101 |
15.1 |
94 |
241 |
96 |
114 |
188 |
230 |
241 |
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=10.2.78.20
49 export nic2=10.2.78.21
50else
51 echo "Using custom nic: $5"
52 export nic1=$5
53 export nic2=$5
54fi
55
56sudo /set_${lat_thr}_mode.sh
57sleep 10
58
59export exec_time=20
60
61export pub_string="-pub \
62 -transport TCP\
63 -peer 0@tcpv4_lan://10.2.78.21:7400 \
64 -nic $nic1 \
65 -noPrint \
66 -exec $exec_time \
67 -initialBurst 100\
68 -noXML"
69
70if [[ ${lat_thr} == "lat" ]]; then
71 export pub_string="$pub_string \
72 -latencyTest"
73fi
74
75export sub_string="-sub \
76 -transport TCP\
77 -peer 0@tcpv4_lan://10.2.78.20:7400 \
78 -nic $nic2 \
79 -noPrint \
80 -noXML"
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
90mkdir -p $output_folder
91
92export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel.csv
93touch $my_file
94export extra_args=""
95for index in ${num_reps}; do
96 for DATALEN in ${dataLens}; do
97 export command="taskset -c 0 \
98 $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
99 echo $command ---- $index
100 $command >> $my_file;
101 if [[ "$domain" == "1" ]]; then
102 export domain="2"
103 else
104 export domain="1"
105 fi
106 export extra_args=" -noOutputHeaders "
107 done
108done
109
110export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be.csv
111touch $my_file
112export extra_args=""
113for index in ${num_reps}; do
114 for DATALEN in ${dataLens}; do
115 export command="taskset -c 0 \
116 $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
117 echo $command ---- $index
118 $command >> $my_file;
119 if [[ "$domain" == "1" ]]; then
120 export domain="2"
121 else
122 export domain="1"
123 fi
124 export extra_args=" -noOutputHeaders "
125 done
126done
127
128export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_rel.csv
129touch $my_file
130export extra_args=""
131for index in ${num_reps}; do
132 for DATALEN in ${dataLens}; do
133 export command="taskset -c 0 \
134 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 $commands_string $extra_args"
135 echo $command ---- $index
136 $command >> $my_file;
137 if [[ "$domain" == "1" ]]; then
138 export domain="2"
139 else
140 export domain="1"
141 fi
142 export extra_args=" -noOutputHeaders "
143 done
144done
145
146export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_be.csv
147touch $my_file
148export extra_args=""
149for index in ${num_reps}; do
150 for DATALEN in ${dataLens}; do
151 export command="taskset -c 0 \
152 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 -best $commands_string $extra_args"
153 echo $command ---- $index
154 $command >> $my_file;
155 if [[ "$domain" == "1" ]]; then
156 export domain="2"
157 else
158 export domain="1"
159 fi
160 export extra_args=" -noOutputHeaders "
161 done
162done
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 |
24333056 |
1215724 |
311.2 |
0 |
0.00 |
64 |
25269691 |
1262400 |
646.3 |
0 |
0.00 |
128 |
23213121 |
1159498 |
1187.3 |
0 |
0.00 |
256 |
21644740 |
1081183 |
2214.3 |
0 |
0.00 |
512 |
18558192 |
927425 |
3798.7 |
0 |
0.00 |
1024 |
13720942 |
685637 |
5616.7 |
0 |
0.00 |
2048 |
9228323 |
461344 |
7558.7 |
0 |
0.00 |
4096 |
5627870 |
281380 |
9220.3 |
0 |
0.00 |
8192 |
2873304 |
143662 |
9415.0 |
0 |
0.00 |
16384 |
1454661 |
72731 |
9533.1 |
0 |
0.00 |
32768 |
717301 |
35864 |
9401.7 |
0 |
0.00 |
63000 |
336715 |
16835 |
8485.1 |
0 |
0.00 |
Reliable
Sample Size (Bytes) |
Total Samples |
Avg Samples/s |
Avg Mbps |
Lost Samples |
Lost Samples (%) |
---|---|---|---|---|---|
32 |
22737408 |
1135781 |
290.8 |
0 |
0.00 |
64 |
22061084 |
1102165 |
564.3 |
0 |
0.00 |
128 |
20793791 |
1039018 |
1064.0 |
0 |
0.00 |
256 |
18785185 |
938940 |
1923.0 |
0 |
0.00 |
512 |
15607424 |
780116 |
3195.4 |
0 |
0.00 |
1024 |
11853744 |
592636 |
4854.9 |
0 |
0.00 |
2048 |
7918992 |
395888 |
6486.2 |
0 |
0.00 |
4096 |
4848340 |
242406 |
7943.2 |
0 |
0.00 |
8192 |
2843536 |
142172 |
9317.4 |
0 |
0.00 |
16384 |
1438691 |
71932 |
9428.4 |
0 |
0.00 |
32768 |
714406 |
35719 |
9363.7 |
0 |
0.00 |
63000 |
347896 |
17394 |
8766.9 |
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=10.2.78.20
49 export nic2=10.2.78.21
50else
51 echo "Using custom nic: $5"
52 export nic1=$5
53 export nic2=$5
54fi
55
56sudo /set_${lat_thr}_mode.sh
57sleep 10
58
59export exec_time=20
60
61export pub_string="-pub \
62 -transport TCP\
63 -peer 0@tcpv4_lan://10.2.78.21:7400 \
64 -nic $nic1 \
65 -noPrint \
66 -exec $exec_time \
67 -initialBurst 100\
68 -noXML"
69
70if [[ ${lat_thr} == "lat" ]]; then
71 export pub_string="$pub_string \
72 -latencyTest"
73fi
74
75export sub_string="-sub \
76 -transport TCP\
77 -peer 0@tcpv4_lan://10.2.78.20:7400 \
78 -nic $nic2 \
79 -noPrint \
80 -noXML"
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
90mkdir -p $output_folder
91
92export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel.csv
93touch $my_file
94export extra_args=""
95for index in ${num_reps}; do
96 for DATALEN in ${dataLens}; do
97 export command="taskset -c 0 \
98 $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
99 echo $command ---- $index
100 $command >> $my_file;
101 if [[ "$domain" == "1" ]]; then
102 export domain="2"
103 else
104 export domain="1"
105 fi
106 export extra_args=" -noOutputHeaders "
107 done
108done
109
110export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be.csv
111touch $my_file
112export extra_args=""
113for index in ${num_reps}; do
114 for DATALEN in ${dataLens}; do
115 export command="taskset -c 0 \
116 $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
117 echo $command ---- $index
118 $command >> $my_file;
119 if [[ "$domain" == "1" ]]; then
120 export domain="2"
121 else
122 export domain="1"
123 fi
124 export extra_args=" -noOutputHeaders "
125 done
126done
127
128export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_rel.csv
129touch $my_file
130export extra_args=""
131for index in ${num_reps}; do
132 for DATALEN in ${dataLens}; do
133 export command="taskset -c 0 \
134 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 $commands_string $extra_args"
135 echo $command ---- $index
136 $command >> $my_file;
137 if [[ "$domain" == "1" ]]; then
138 export domain="2"
139 else
140 export domain="1"
141 fi
142 export extra_args=" -noOutputHeaders "
143 done
144done
145
146export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_be.csv
147touch $my_file
148export extra_args=""
149for index in ${num_reps}; do
150 for DATALEN in ${dataLens}; do
151 export command="taskset -c 0 \
152 $executable -domain $domain -datalen $DATALEN -keyed -instances 100000 -best $commands_string $extra_args"
153 echo $command ---- $index
154 $command >> $my_file;
155 if [[ "$domain" == "1" ]]; then
156 export domain="2"
157 else
158 export domain="1"
159 fi
160 export extra_args=" -noOutputHeaders "
161 done
162done
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