2.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.

2.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.7

18

2432

19

19

22

18

18

64

19

5.7

18

2420

19

20

23

18

18

128

19

5.6

18

2371

19

20

23

18

18

256

20

5.7

19

2383

20

20

24

19

19

512

20

5.7

19

2262

20

21

23

19

19

1024

26

7.0

20

2499

27

28

29

20

20

2048

49

284.8

23

100085

48

62

70

23

23

4096

32

131.7

27

100100

30

35

63

27

27

8192

46

11.2

38

2368

42

59

62

38

38

16384

91

24.7

49

2362

90

127

147

49

49

32768

179

13.9

101

2448

179

181

187

101

101

63000

193

14.7

137

2462

192

195

200

137

137

  • 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

20

5.7

19

2244

20

21

24

19

19

64

21

5.8

19

2324

21

21

24

19

19

128

21

5.8

20

2170

21

22

25

20

20

256

22

9.9

20

5050

21

22

28

20

20

512

22

9.8

20

5052

22

24

27

20

20

1024

26

14.1

21

5055

26

29

46

21

21

2048

30

38.7

24

4999

30

33

52

24

24

4096

33

40.3

28

4986

31

34

63

28

28

8192

47

14.8

40

3889

43

60

85

40

40

16384

95

29.4

50

2407

93

132

147

50

50

32768

178

16.4

78

2586

181

183

189

78

78

63000

195

13.5

142

2286

195

197

203

142

142


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 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

2.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

22

139.7

20

76073

21

23

25

20

20

64

22

139.5

20

77896

22

23

25

20

20

128

23

137.9

21

73111

22

24

26

21

21

256

23

148.4

21

79488

22

24

25

21

21

512

24

146.8

22

75814

23

25

27

22

22

1024

27

154.7

23

76554

27

28

29

23

23

2048

49

336.3

25

100142

47

65

74

25

25

4096

52

335.1

29

100143

55

63

76

29

29

8192

49

181.0

41

80380

46

59

62

41

41

16384

97

22.4

52

228

96

133

158

52

52

32768

185

2.8

84

260

185

187

189

84

84

63000

196

2.7

116

270

196

198

202

116

116

  • 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

143.5

22

75003

23

24

25

22

22

64

24

137.7

22

69765

23

24

26

22

22

128

24

153.7

22

82448

24

25

26

22

22

256

25

152.3

23

78269

24

25

27

23

23

512

25

150.2

23

78692

25

26

28

23

23

1024

27

157.4

25

77513

27

29

34

25

25

2048

32

161.6

27

71640

30

33

55

27

27

4096

37

191.3

31

78810

34

39

66

31

31

8192

50

225.9

43

84549

46

60

90

43

43

16384

98

29.2

54

251

98

141

159

54

54

32768

185

3.2

87

260

185

187

190

87

87

63000

197

6.0

113

272

198

199

205

113

113


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 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