1.2.3. Java API

The following tests have been performed by executing an RTI Perftest Java 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.

1.2.3.1. Unkeyed, UDPv4 10Gbps Network, Java

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)

Ave (us)

Std (us)

Min (us)

Max (us)

50% (μs)

90% (us)

99% (us)

99.99% (us)

99.9999% (us)

32

19

5.8

18

2501

19

20

23

18

18

64

20

5.8

18

2589

19

20

23

18

18

128

20

5.6

19

2234

20

20

24

19

19

256

21

132.6

19

87444

20

21

24

19

19

512

20

6.0

19

2479

20

21

24

19

19

1024

26

7.4

21

2848

26

28

30

21

21

2048

49

228.2

23

100112

49

64

78

23

23

4096

34

135.9

28

100102

30

51

64

28

28

8192

46

11.0

39

2483

41

59

62

39

39

16384

96

26.7

50

2456

85

129

135

50

50

32768

168

18.7

79

2385

168

186

190

79

79

63000

193

14.4

113

2570

193

195

202

113

113

  • Reliable

Sample Size (Bytes)

Ave (us)

Std (us)

Min (us)

Max (us)

50% (μs)

90% (us)

99% (us)

99.99% (us)

99.9999% (us)

32

21

7.6

20

2969

21

22

25

20

20

64

21

6.0

20

2488

21

22

26

20

20

128

21

5.7

20

2256

21

22

24

20

20

256

22

6.1

20

2446

21

22

28

20

20

512

23

6.1

21

2438

22

23

27

21

21

1024

27

7.4

22

2201

26

29

55

22

22

2048

31

36.1

24

4984

30

34

57

24

24

4096

33

42.4

29

4993

31

34

64

29

29

8192

48

24.4

40

9582

43

60

85

40

40

16384

94

29.7

51

2925

93

134

152

51

51

32768

170

20.1

86

2353

171

188

191

86

86

63000

177

19.8

148

2446

176

195

199

148

148


Perftest Scripts

To produce these tests, we executed RTI Perftest for Java. 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=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 ${dataLens}; do
 96        export command="$executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
 97        echo $command ---- $index
 98        $command >> $my_file;
 99        if [[ "$domain" == "1" ]]; then
100            export domain="2"
101        else
102            export domain="1"
103        fi
104        export extra_args=" -noOutputHeaders "
105    done
106done
107
108export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be.csv
109touch $my_file
110export extra_args=""
111for index in ${num_reps}; do
112    for DATALEN in ${dataLens}; do
113        export command="$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="$executable -domain $domain -datalen $DATALEN -keyed -instances 100000 $commands_string $extra_args"
131        echo $command ---- $index
132        $command >> $my_file;
133        if [[ "$domain" == "1" ]]; then
134            export domain="2"
135        else
136            export domain="1"
137        fi
138        export extra_args=" -noOutputHeaders "
139    done
140done
141
142export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_be.csv
143touch $my_file
144export extra_args=""
145for index in ${num_reps}; do
146    for DATALEN in ${dataLens}; do
147        export command="$executable -domain $domain -datalen $DATALEN -keyed -instances 100000 -best $commands_string $extra_args"
148        echo $command ---- $index
149        $command >> $my_file;
150        if [[ "$domain" == "1" ]]; then
151            export domain="2"
152        else
153            export domain="1"
154        fi
155        export extra_args=" -noOutputHeaders "
156    done
157done
158
159# if [[ ${lat_thr} == "thr" ]]; then
160
161#     if [[ "$pub_sub" == "pub" ]]; then
162#         echo "Publisher side"
163#         export commands_string="${commands_string} -batchSize 0"
164#     fi
165
166#     export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be_noBatch.csv
167#     touch $my_file
168#     export extra_args=""
169#     for index in ${num_reps}; do
170#         for DATALEN in ${dataLens}; do
171#             export command="    $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
172#             echo $command ---- $index
173#             $command >> $my_file;
174#             if [[ "$domain" == "1" ]]; then
175#                 export domain="2"
176#             else
177#                 export domain="1"
178#             fi
179#             export extra_args=" -noOutputHeaders "
180#         done
181#     done
182
183#     export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel_noBatch.csv
184#     touch $my_file
185#     export extra_args=""
186#     for index in ${num_reps}; do
187#         for DATALEN in ${dataLens}; do
188#             export command="    $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
189#             echo $command ---- $index
190#             $command >> $my_file;
191#             if [[ "$domain" == "1" ]]; then
192#                 export domain="2"
193#             else
194#                 export domain="1"
195#             fi
196#             export extra_args=" -noOutputHeaders "
197#         done
198#     done
199
200# fi

Test Software

The following software was used to perform these tests:

RTI Connext DDS 7.0.0 Host and Target Libraries for x64 Linux (x64Linux4gcc7.3.0)

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

1.2.3.2. Keyed, UDPv4 10Gbps Network, Java

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)

Ave (us)

Std (us)

Min (us)

Max (us)

50% (μs)

90% (us)

99% (us)

99.99% (us)

99.9999% (us)

32

23

149.8

21

82639

22

24

26

21

21

64

23

148.3

21

80660

22

24

26

21

21

128

23

141.4

21

74572

22

24

26

21

21

256

23

145.8

21

77213

22

24

26

21

21

512

24

160.1

22

87385

23

25

27

22

22

1024

27

158.7

23

77786

26

28

29

23

23

2048

49

342.4

25

100147

46

65

76

25

25

4096

47

293.4

31

100146

43

63

65

31

31

8192

49

174.8

42

77736

45

59

62

42

42

16384

100

25.4

53

265

89

135

142

53

53

32768

183

2.6

83

259

183

185

188

83

83

63000

198

2.8

114

273

198

199

202

114

114

  • Reliable

Sample Size (Bytes)

Ave (us)

Std (us)

Min (us)

Max (us)

50% (μs)

90% (us)

99% (us)

99.99% (us)

99.9999% (us)

32

24

144.6

22

77017

24

25

27

22

22

64

25

158.8

23

85518

24

26

27

23

23

128

24

148.8

22

80069

24

25

26

22

22

256

25

145.9

23

75280

24

25

29

23

23

512

26

148.6

24

72971

25

27

30

24

24

1024

28

156.5

24

76960

27

29

35

24

24

2048

32

179.1

27

83329

30

34

56

27

27

4096

37

200.8

31

85327

34

38

66

31

31

8192

51

209.2

43

76057

46

60

91

43

43

16384

100

28.0

54

185

96

139

162

54

54

32768

174

15.5

115

240

183

186

189

115

115

63000

198

2.7

123

272

198

200

205

123

123


Perftest Scripts

To produce these tests, we executed RTI Perftest for Java. 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=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 ${dataLens}; do
 96        export command="$executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
 97        echo $command ---- $index
 98        $command >> $my_file;
 99        if [[ "$domain" == "1" ]]; then
100            export domain="2"
101        else
102            export domain="1"
103        fi
104        export extra_args=" -noOutputHeaders "
105    done
106done
107
108export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be.csv
109touch $my_file
110export extra_args=""
111for index in ${num_reps}; do
112    for DATALEN in ${dataLens}; do
113        export command="$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="$executable -domain $domain -datalen $DATALEN -keyed -instances 100000 $commands_string $extra_args"
131        echo $command ---- $index
132        $command >> $my_file;
133        if [[ "$domain" == "1" ]]; then
134            export domain="2"
135        else
136            export domain="1"
137        fi
138        export extra_args=" -noOutputHeaders "
139    done
140done
141
142export my_file=$output_folder/${lat_thr}_${pub_sub}_keyed_be.csv
143touch $my_file
144export extra_args=""
145for index in ${num_reps}; do
146    for DATALEN in ${dataLens}; do
147        export command="$executable -domain $domain -datalen $DATALEN -keyed -instances 100000 -best $commands_string $extra_args"
148        echo $command ---- $index
149        $command >> $my_file;
150        if [[ "$domain" == "1" ]]; then
151            export domain="2"
152        else
153            export domain="1"
154        fi
155        export extra_args=" -noOutputHeaders "
156    done
157done
158
159# if [[ ${lat_thr} == "thr" ]]; then
160
161#     if [[ "$pub_sub" == "pub" ]]; then
162#         echo "Publisher side"
163#         export commands_string="${commands_string} -batchSize 0"
164#     fi
165
166#     export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_be_noBatch.csv
167#     touch $my_file
168#     export extra_args=""
169#     for index in ${num_reps}; do
170#         for DATALEN in ${dataLens}; do
171#             export command="    $executable -domain $domain -datalen $DATALEN -best $commands_string $extra_args"
172#             echo $command ---- $index
173#             $command >> $my_file;
174#             if [[ "$domain" == "1" ]]; then
175#                 export domain="2"
176#             else
177#                 export domain="1"
178#             fi
179#             export extra_args=" -noOutputHeaders "
180#         done
181#     done
182
183#     export my_file=$output_folder/${lat_thr}_${pub_sub}_unkeyed_rel_noBatch.csv
184#     touch $my_file
185#     export extra_args=""
186#     for index in ${num_reps}; do
187#         for DATALEN in ${dataLens}; do
188#             export command="    $executable -domain $domain -datalen $DATALEN $commands_string $extra_args"
189#             echo $command ---- $index
190#             $command >> $my_file;
191#             if [[ "$domain" == "1" ]]; then
192#                 export domain="2"
193#             else
194#                 export domain="1"
195#             fi
196#             export extra_args=" -noOutputHeaders "
197#         done
198#     done
199
200# fi

Test Software

The following software was used to perform these tests:

RTI Connext DDS 7.0.0 Host and Target Libraries for x64 Linux (x64Linux4gcc7.3.0)

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