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

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