2.2.4. C# API

The following tests have been performed by executing an RTI Perftest C# 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.4.1. UDPv4, C#

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 a simplified version of RTI Perftest for the Modern C# implementation. These numbers are the exact output with no further processing.

  • Best Effort

Sample Size (Bytes)

Ave (μs)

Std (μs)

Min (μs)

Max (μs)

50% (μs)

90% (μs)

99% (μs)

99.99% (μs)

99.9999% (μs)

32

17

3.5

17

471

17

18

19

27

471

64

18

1.4

17

471

18

18

19

27

471

128

18

2.2

17

473

18

18

20

27

473

256

18

2.4

17

476

18

18

20

27

476

512

19

4.6

18

475

19

20

21

29

475

1024

25

6.6

19

486

26

28

32

49

486

2048

29

11.4

22

971

30

34

47

530

971

4096

31

9.9

27

987

31

34

57

548

987

8192

44

12.1

37

495

40

58

62

101

495

16384

89

23.9

48

536

89

123

138

173

536

32768

131

25.9

89

622

125

167

188

194

622

63000

192

11.6

109

1257

192

194

196

230

1257

  • Reliable

Sample Size (Bytes)

Ave (μs)

Std (μs)

Min (μs)

Max (μs)

50% (μs)

90% (μs)

99% (μs)

99.99% (μs)

99.9999% (μs)

32

19

2.0

18

464

19

19

21

33

464

64

19

3.6

18

818

19

20

22

36

818

128

19

4.0

18

463

19

20

27

41

463

256

21

6.8

19

480

20

30

39

46

480

512

22

8.5

19

489

21

32

41

48

489

1024

25

8.2

20

482

26

29

54

59

482

2048

29

11.4

22

971

30

34

47

530

971

4096

31

9.9

27

987

31

34

57

548

987

8192

45

12.6

38

755

41

60

83

122

755

16384

92

28.2

49

567

91

132

149

165

567

32768

131

25.9

89

622

125

167

188

194

622

63000

193

8.9

109

1156

193

195

200

215

1156

100000

224

25.6

166

1731

228

235

255

284

1731

500000

638

71.1

550

8285

642

669

702

721

8285

1048576

1358

190.4

1225

17026

1349

1439

1458

17026

17026

1548576

1956

425.2

1768

31988

1950

1973

1998

31988

31988

4194304

5317

1424.4

4827

66919

5282

5312

5341

66919

66919

10485760

12461

5363.6

12215

164315

12267

12308

12341

164315

164315


Perftest Scripts

To produce these tests, we executed RTI Perftest for C#. The exact script used can be found here:

  1#!/bin/bash
  2filename=$0
  3script_location=$(cd "$(dirname "$filename")" || exit 255; pwd)
  4
  5export datasizes="32 64 128 256 512 1024 2048 4096 8192 16384 32768 63000"
  6export datasizes_extended="${datasizes} 100000 500000 1048576 1548576 4194304 10485760"
  7
  8export domain="2"
  9export exec_time=20
 10export num_reps=1
 11export instance_number=100000
 12export core=0
 13export run_batching_tests="1"
 14export run_no_batching_tests="1"
 15
 16# We will use some colors to improve visibility of errors and info messages.
 17RED='\033[0;31m'
 18GREEN='\033[0;32m'
 19YELLOW='\033[0;33m'
 20BLUE='\033[0;34m'
 21LIGHTBLUE='\033[0;36m'
 22NC='\033[0m'
 23INFO_TAG="${GREEN}[INFO][$role]:${NC}"
 24WARNING_TAG="${YELLOW}[WARNING][$role]:${NC}"
 25ERROR_TAG="${RED}[ERROR][$role]:${NC}"
 26
 27################################################################################
 28
 29function disable_colors() {
 30    export RED=""
 31    export GREEN=""
 32    export YELLOW=""
 33    export NC=""
 34    export BLUE=""
 35    export LIGHTBLUE=""
 36    export INFO_TAG="${GREEN}[INFO][$role]:${NC}"
 37    export WARNING_TAG="${YELLOW}[WARNING][$role]:${NC}"
 38    export ERROR_TAG="${RED}[ERROR][$role]:${NC}"
 39}
 40
 41function change_domain() {
 42    if [[ "$domain" == "1" ]]; then
 43        export domain="2"
 44    else
 45        export domain="1"
 46    fi
 47}
 48
 49# Function to process and append lines to the output file
 50function append_to_output_file() {
 51    local line=${1?line required}; readonly line
 52    local append=$(echo "${2?append required}" | tr -s ' '); readonly append
 53    local file=${3?file required}; readonly file
 54    if [[ "${line: -1}" == $'\n' ]]; then
 55        line="${line::-1}"
 56    fi
 57    echo "${line}${append}" >> "$file"
 58}
 59
 60# Usage: execute_test <keyed/unkeyed> <rel/be> <datasizes> <batchSize>
 61function execute_test() {
 62
 63    local keyed_unkeyed=$1
 64    local rel_be=$2
 65    local datasizes_test=$3
 66    local other_args=$4
 67    local name_suffix=$5
 68
 69    local commands_string_test=$commands_string
 70    local tag=""
 71
 72    if [[ "${keyed_unkeyed}" == "keyed" ]]; then
 73        commands_string_test="${commands_string_test} -keyed -instances $instance_number"
 74        tag="[${YELLOW}${transport}${NC}|${BLUE}K${NC}|"
 75    else
 76        tag="[${YELLOW}${transport}${NC}|${LIGHTBLUE}UK${NC}|"
 77    fi
 78
 79    if [[ "${rel_be}" == "be" ]]; then
 80        commands_string_test="${commands_string_test} -bestEffort"
 81        tag="${tag}${YELLOW}BE${NC}]"
 82    else
 83        tag="${tag}${RED}REL${NC}]"
 84    fi
 85
 86    # If batch_size is set, we will add it to the command line of the publisher side.
 87    if [[ "$batch_size" != "" && "$role" == "pub" ]]; then
 88        commands_string_test="${commands_string_test} -batchSize $batch_size"
 89    fi
 90
 91    tag="${tag}[${LIGHTBLUE}${lat_thr}${NC}]"
 92
 93    local output_file=$output_folder/${lat_thr}_${role}_${keyed_unkeyed}_${rel_be}${name_suffix}.csv
 94
 95    if [[ "$role" == "pub" ]]; then
 96        echo -e "${YELLOW}[TEST]: $keyed_unkeyed, $rel_be, Is a no-batching test = $no_batching_tests. ${NC}"
 97    fi
 98
 99    if [[ "$thread_cpu_affinity" != "" ]]; then
100        commands_string_test="${commands_string_test} -threadCPUAffinity $thread_cpu_affinity"
101    fi
102
103    local pre_command_string=""
104
105    if [[ "$thread_priorities" != "" ]]; then
106        echo -e "${WARNING_TAG} Thread priorities enabled, this requires using sudo"
107        # When using sudo, the LD_LIBRARY_PATH is emptied, hence we need to set it again in the command itself
108        export LD_LIBRARY_PATH_COPIED="$LD_LIBRARY_PATH"
109        pre_command_string="sudo LD_LIBRARY_PATH=$LD_LIBRARY_PATH_COPIED "
110        commands_string_test="${commands_string_test} -threadPriorities $thread_priorities"
111    fi
112
113    if [[ "$no_taskset" == "" && "$thread_cpu_affinity" == "" && "$LANGUAGE" != "java" && "$LANGUAGE" != "cs" ]]; then
114        pre_command_string="$pre_command_string taskset -c $core"
115    fi
116
117    if [[ "$LANGUAGE" == "python" ]]; then
118        pre_command_string="$pre_command_string python3 "
119    fi
120
121    if [[ "$DOCKER" == "1" ]]; then
122        pre_command_string="$pre_command_string docker run --net=host -v /home/perfuser/rti_license_connextpro.dat:/opt/rti.com/rti_connext_dds-7.3.0/rti_license.dat rticom/perftest:7.3.0-EAR "
123        executable=""
124    fi
125
126    # Get the aprox time this will take:
127    total_tests=$((`wc -w <<< "$datasizes_test"` * num_reps))
128    total_time=$((total_tests * exec_time))
129
130    touch $output_file
131    local no_headers=""
132    local current_test=0
133    for index in $(seq 1 ${num_reps}); do
134        for DATALEN in ${datasizes_test}; do
135            current_test=$((current_test + 1))
136
137            if [[ ! -s $output_file ]]; then
138                echo -e "${INFO_TAG} Output file is empty, filling the header."
139                no_headers=""
140            else
141                echo -e "${INFO_TAG} Output file is not empty."
142                no_headers=" -noOutputHeaders"
143            fi
144
145            export command="$pre_command_string $executable -domain $domain -dataLen $DATALEN $commands_string_test $other_args $no_headers"
146            if [[ "$role" == "pub" ]]; then
147                echo -e "Test ${tag} (${current_test}/${total_tests}) -- Total time = ${total_time}s"
148                echo -e ${BLUE}$command${NC}
149            else
150                echo -e ${LIGHTBLUE}$command${NC}
151            fi
152
153            # In certain cases we need to wait a bit before running the test, this is
154            # because the previous test might not be finished on the other side yet, or because the
155            # discovery mechanism does not work like in connext DDS.
156            if [[ "$LANGUAGE" == "cs" && "$role" == "pub" ]]; then
157                sleep 3
158            fi
159            if [[ "$raw" == "1" && "$role" == "sub" ]]; then
160                sleep 5
161            fi
162
163            # Gather netstat info before running the test
164            if [[ "${get_netstat_info}" == "1" ]]; then
165                echo -e "${INFO_TAG} Getting netstat info before"
166                netstat -s -u | grep -e "error" -e "packet" > $output_folder/${lat_thr}_${role}_${keyed_unkeyed}_${rel_be}${name_suffix}_netstat_before.txt
167            fi
168
169            # Execute the command and capture the output
170            if [[ $LANGUAGE == "c++98" || $LANGUAGE == "" ]]; then
171                echo -e "${INFO_TAG} Using C++98, using -outputFile option"
172                touch ${output_file}_tmp_line
173                chmod 777 ${output_file}_tmp_line
174                eval $command -outputFile ${output_file}_tmp_line
175            else
176                eval $command > ${output_file}_tmp_line
177            fi
178
179            number_of_lines=$(wc -l < ${output_file}_tmp_line)
180            echo -e "${INFO_TAG} Size of the output text: $number_of_lines lines"
181
182            # Check if this is the first test for this output file.
183            local is_first_test=0
184            if [[ ! -s $output_file ]]; then
185                is_first_test=1
186            fi
187            local expected_lines=$((is_first_test+1))
188
189            if [[ $number_of_lines -ne ${expected_lines} ]]; then
190                echo -e "${WARNING_TAG} The output text should have ${expected_lines} lines, but it has ${number_of_lines}."
191                echo -e "${RED} The content is: \n\"\"\""
192                cat ${output_file}_tmp_line
193                echo -e "\"\"\""
194                echo -e "Not adding it to the output file. ${NC}"
195            else
196                if [[ $number_of_lines -gt 1 ]]; then
197                    header_line=$(head -n 1 "${output_file}_tmp_line")
198                    echo -e "${INFO_TAG} Header line is: $header_line"
199                fi
200                result_line=$(tail -n 1 "${output_file}_tmp_line")
201                echo -e "${INFO_TAG} Result line is: $result_line"
202
203                # If this is the first test, we need to add the header line to the output file
204                if [[ $is_first_test -eq 1 ]]; then
205                    append_to_output_file "$header_line" ", command-line" $output_file
206                fi
207
208                command=$(echo $command | sed 's/,/:comma:/g')
209                # Remove the `"` characters from the command line
210                command=$(echo $command | sed 's/\"//g')
211
212                # Append the result line to the output file
213                append_to_output_file "$result_line" ", $command" $output_file
214            fi
215
216            # Always remove the temporary file
217            rm -rf ${output_file}_tmp_line
218
219            # Gather netstat info after running the test
220            if [[ "${get_netstat_info}" == "1" ]]; then
221                echo -e "${INFO_TAG} Getting netstat info after"
222                netstat -s -u | grep -e "error" -e "packet" > $output_folder/${lat_thr}_${role}_${keyed_unkeyed}_${rel_be}${name_suffix}_netstat_after.txt
223                touch "$output_folder/${lat_thr}_${role}_${keyed_unkeyed}_${rel_be}${name_suffix}_netstat.csv"
224                python3 $script_location/../../../tools/diff_netstat_output.py \
225                    -n $output_folder/${lat_thr}_${role}_${keyed_unkeyed}_${rel_be}${name_suffix}_netstat_after.txt \
226                    -o $output_folder/${lat_thr}_${role}_${keyed_unkeyed}_${rel_be}${name_suffix}_netstat_before.txt \
227                    -d $DATALEN $no_header_netstat \
228                    -csv >> "$output_folder/${lat_thr}_${role}_${keyed_unkeyed}_${rel_be}${name_suffix}_netstat.csv"
229                rm -rf $output_folder/${lat_thr}_${role}_${keyed_unkeyed}_${rel_be}${name_suffix}_netstat_*.txt
230                no_header_netstat=" -nh"
231            fi
232
233            change_domain
234        done
235    done
236}
237
238################################################################################
239# PARSE COMMAND LINE OPTIONS:
240
241while [ "$1" != "" ]; do
242    case $1 in
243        --executable)
244            executable=$2
245            shift
246            ;;
247        --docker)
248            DOCKER="1"
249            ;;
250        --output-folder)
251            output_folder=$2
252            shift
253            ;;
254        --role)
255            export role=$2
256            shift
257            ;;
258        --core)
259            export core=$2
260            shift
261            ;;
262        --assign-core-list | --thread-cpu-affinity)
263            export thread_cpu_affinity=$2
264            shift
265            ;;
266        --assign-thread-priorities | --thread-priorities)
267            export thread_priorities=$2
268            shift
269            ;;
270        --test-kind)
271            export lat_thr=$2
272            shift
273            ;;
274        --interface1)
275            export interface=$2
276            shift
277            ;;
278        --interface2)
279            export interface2=$2
280            shift
281            ;;
282        --ip1)
283            export ip1=$2
284            shift
285            ;;
286        --ip2)
287            export ip2=$2
288            shift
289            ;;
290        --repetitions)
291            export num_reps=$2
292            shift
293            ;;
294        --domain)
295            export domain=$2
296            shift
297            ;;
298        --execution-time)
299            export exec_time=$2
300            shift
301            ;;
302        --transport)
303            export transport=$2
304            shift
305            ;;
306        --datalen)
307            export datalen_input=$2
308            shift
309            ;;
310        --file-suffix)
311            export file_suffix=$2
312            shift
313            ;;
314        --folder-suffix)
315            export folder_suffix=$2
316            shift
317            ;;
318        --sub-folder)
319            sub_folder=$2
320            shift
321            ;;
322        --executable-suffix)
323            export executable_suffix=$2
324            shift
325            ;;
326        --extra-arguments)
327            export extra_arguments=$2
328            shift
329            ;;
330        --extra-arguments-pub)
331            export extra_arguments_pub=$2
332            shift
333            ;;
334        --extra-arguments-sub)
335            export extra_arguments_sub=$2
336            shift
337            ;;
338        --skip-be)
339            export skip_be_tests="1"
340            ;;
341        --skip-rel)
342            export skip_rel_tests="1"
343            ;;
344        --skip-keyed)
345            export skip_keyed_data="1"
346            ;;
347        --skip-large-data)
348            export skip_large_data="1"
349            ;;
350        --large-data)
351            export large_data="1"
352            ;;
353        --keyed)
354            export skip_unkeyed="1"
355            ;;
356        --unkeyed)
357            export skip_keyed_data="1"
358            ;;
359        --no-batching | --skip-batching)
360            export run_batching_tests="0"
361            export run_no_batching_tests="1"
362            ;;
363        --skip-no-batching)
364            export run_batching_tests="1"
365            export run_no_batching_tests="0"
366            ;;
367        --batch-size)
368            export batch_size=$2
369            shift
370            ;;
371        --reliable)
372            export skip_be_tests="1"
373            ;;
374        --best-effort)
375            export skip_rel_tests="1"
376            ;;
377        --security-gov)
378            export security_only="$2"
379            shift
380            ;;
381        --micro)
382            export micro="1"
383            ;;
384        --cert)
385            export cert="1"
386            ;;
387        --raw | --raw-transport)
388            export raw="1"
389            ;;
390        --tss)
391            export tss="1"
392            ;;
393        --no-colors)
394            export NO_COLORS="1"
395            ;;
396        --language)
397            export LANGUAGE=$2
398            shift
399            ;;
400        --loss-rate)
401            export loss_rate=$2
402            shift
403            ;;
404        --get-netstat-info | --netstat)
405            export get_netstat_info="1"
406            ;;
407        --reduced-data-sizes-set)
408            export REDUCED_DATA_SIZES_SET="1"
409            ;;
410        --dont-change-tuned-settings)
411            export dont_change_tuned_settings="1"
412            ;;
413        --no-taskset)
414            export no_taskset=1
415            ;;
416        *)
417            echo -e "unknown parameter \"$1\""
418            exit 255
419            ;;
420    esac
421    shift
422done
423
424if [[ "$NO_COLORS" == "1" ]]; then
425    disable_colors
426fi
427
428export folder_base="$(dirname "${executable}")"/../../..
429
430if [[ $LANGUAGE == "java"  || "$LANGUAGE" == "cs" ]]; then
431    export folder_base="$(dirname "${executable}")"/../..
432fi
433if [[ $tss == "1" ]]; then
434    export folder_base="$(dirname "${executable}")"/../../../../..
435fi
436
437if [[ "${executable_suffix}" != "" ]]; then
438    export executable="${executable}${executable_suffix}"
439fi
440
441if [[ -n "${folder_suffix}" ]]; then
442    export output_folder="${output_folder}${folder_suffix}"
443fi
444
445if [[ -n "${sub_folder}" ]]; then
446    export output_folder="${output_folder}/${sub_folder}"
447fi
448
449echo -e "${INFO_TAG} Perftest executable is: $executable"
450echo -e "${INFO_TAG} Output folder is: $output_folder"
451
452################################################################################
453
454if [[ "$LANGUAGE" == "python" ]]; then
455    export skip_keyed_data="1"
456    export skip_large_data="1"
457    export skip_be_tests="1"
458    export run_no_batching_tests="0"
459fi
460
461if [[ "${skip_large_data}" == "1" ]]; then
462    export datasizes_extended=${datasizes}
463elif [[ "${large_data}" == "1" ]]; then
464    export datasizes=${datasizes_extended}
465fi
466
467if [[ "${datalen_input}" != "" ]]; then
468    echo -e "${YELLOW}[TEST] Testing only for ${datalen_input}${NC}"
469    export datasizes=${datalen_input}
470    export datasizes_extended=${datalen_input}
471    if [[ "${run_no_batching_tests}" == "1" && "${run_batching_tests}" == "0" ]]; then
472        export skip_large_data="1"
473    fi
474else 
475    if [[ "${REDUCED_DATA_SIZES_SET}" != "" ]]; then
476        echo -e "${YELLOW}[TEST] Testing Reduced set of datasizes ${NC}"
477        export datasizes="32 128 512 2048 8192 32768 63000"
478        export datasizes_extended="${datasizes} 102400 1048576 10485760"
479    fi
480fi
481
482if [[ "$role" != "pub" && "$role" != "sub" ]]; then
483    echo -e "${ERROR_TAG} It must be either publisher or subscriber"
484    exit 255
485fi
486
487if [[ "$lat_thr" != "thr" && "$lat_thr" != "lat" ]]; then
488    echo -e "${ERROR_TAG} It must be either lat or thr"
489    exit 255
490fi
491
492if [[ "${interface}" == "" ]]; then
493    echo "Using default nics"
494    export nic_publisher=${ip_machine_1}
495    export nic_subscriber=${ip_machine_2}
496elif [[ "${interface}" == "both" ]]; then
497    export nic_publisher="enp1s0f0,eno1"
498    export nic_subscriber="enp1s0f0,eno1"
499    echo -e "${INFO_TAG} Using nic_publisher: ${nic_publisher}"
500    echo -e "${INFO_TAG} Using nic_subscriber: ${nic_subscriber}"
501else
502    export nic_publisher=$interface
503    echo -e "${INFO_TAG} Using nic_publisher: ${nic_publisher}"
504
505    if [[ "${interface2}" == "" ]]; then
506        export nic_subscriber=$interface
507    else
508        export nic_subscriber=$interface2
509    fi
510    echo -e "${INFO_TAG} Using nic_subscriber: ${nic_subscriber}"
511
512    if [[ "${ip1}" != "" ]]; then
513        export ip_publisher=$ip1
514        echo "Using ip_publisher: ${ip_publisher}"
515    fi
516
517    if [[ "${ip2}" != "" ]]; then
518        export ip_subscriber=$ip2
519        echo "Using ip_subscriber: ${ip_subscriber}"
520    fi
521
522fi
523
524export transport_string="-transport $transport"
525
526if [[ "$transport" == "UDPv4" ]]; then
527
528    export transport_string_pub="$transport_string -nic $nic_publisher"
529    export transport_string_sub="$transport_string -nic $nic_subscriber"
530
531    if [[ "$raw" == "1" ]]; then
532        export transport_string_pub="$transport_string_pub -peer ${ip_subscriber}"
533        export transport_string_sub="$transport_string_sub -peer ${ip_publisher}"
534    fi
535
536    if [[ "$micro" == "1" || "$cert" == "1" ]]; then
537        export transport_string_pub="$transport_string_pub -peer _udp://${ip_subscriber}"
538        export transport_string_sub="$transport_string_sub -peer _udp://${ip_publisher}"
539    fi
540
541elif [[ "$transport" == "TCP" ]]; then
542    export transport_string_pub="$transport_string \
543        -nic $nic_publisher \
544        -peer 0@tcpv4_lan://${ip_subscriber}:7400"
545    export transport_string_sub="$transport_string \
546        -nic $nic_subscriber \
547        -peer 0@tcpv4_lan://${ip_publisher}:7400"
548elif [[ "$transport" == "TLS" ]]; then
549    export transport_string_pub="$transport_string \
550        -nic $nic_publisher \
551        -peer tlsv4_lan://${ip_subscriber}:7400"
552    export transport_string_sub="$transport_string \
553        -nic $nic_subscriber \
554        -peer tlsv4_lan://${ip_publisher}:7400"
555elif [[ "$transport" == "UDPv4_WAN" ]]; then
556    export transport_string_pub="$transport_string \
557        -nic $nic_publisher \
558        -transportPublicAddress $ip_publisher:7400"
559    export transport_string_sub="$transport_string \
560        -nic $nic_subscriber \
561        -peer 0@udpv4_wan://${ip_publisher}:7400"
562else
563    export transport_string_pub="$transport_string"
564    export transport_string_sub="$transport_string"
565fi
566
567################################################################################
568
569export pub_string="-pub \
570        ${transport_string_pub} \
571        -noPrintIntervals \
572        -executionTime $exec_time"
573
574if [[ ${lat_thr} == "lat" ]]; then
575    export pub_string="$pub_string \
576        -latencyTest"
577fi
578
579export sub_string="-sub \
580        ${transport_string_sub} \
581        -noPrintIntervals"
582
583if [[ "$role" == "pub" ]]; then
584    echo -e "$INFO_TAG Publisher side running"
585    export commands_string=${pub_string}
586    export extra_arguments="${extra_arguments} ${extra_arguments_pub}"
587else
588    echo -e "$INFO_TAG Subscriber side running"
589    export commands_string=${sub_string}
590    export extra_arguments="${extra_arguments} ${extra_arguments_sub}"
591fi
592
593###############################################################################
594
595if [[ "$dont_change_tuned_settings" != "1" ]]; then
596    echo -e "${INFO_TAG} Executing: /set_${lat_thr}_mode.sh"
597    sudo /set_${lat_thr}_mode.sh
598    sleep 5
599fi
600
601echo -e "${INFO_TAG} Disabling any loss rate"
602sudo tc qdisc add dev $nic_publisher root netem loss 0%
603sudo tc qdisc del dev $nic_publisher root netem loss 0%
604
605if [[ "$role" == "pub" && "${loss_rate}" != "" ]]; then
606    echo -e "${INFO_TAG} Setting loss rate to ${loss_rate}%"
607    sudo tc qdisc add dev $nic_publisher root netem loss $loss_rate%
608fi
609
610cd $folder_base
611echo -e "${INFO_TAG} Folder Base is: $PWD"
612mkdir -p $output_folder
613
614if [[ "${batch_size}" != "" ]]; then
615    if [[ "${lat_thr}" == "thr" ]]; then
616        if [[ "${batch_size}" -eq 0 ]]; then
617            echo -e "${INFO_TAG} Batch size is set to 0"
618            export run_batching_tests="0"
619            export run_no_batching_tests="1"
620        else
621            echo -e "${INFO_TAG} Batch size is set to ${batch_size}"
622            export run_batching_tests="1"
623            export run_no_batching_tests="0"
624        fi
625    else
626        echo -e "${INFO_TAG} Batch size is set to ${batch_size}. This value will be ignored for latency tests."
627        unset batch_size
628    fi
629fi
630
631# Tests that may use batching (when doing throughput tests). Also Latency tests.
632if [[ ${run_batching_tests} == "1" ]]; then
633
634    # UNKEYED
635    if [[ "${skip_unkeyed}" == "" ]]; then
636
637        # RELIABLE
638        if [[ "${skip_rel_tests}" == "" ]]; then
639            execute_test "unkeyed" "rel" "${datasizes_extended}" "${extra_arguments}" "$file_suffix"
640        fi
641
642        # BEST EFFORT
643        if [[ "${skip_be_tests}" == "" ]]; then
644            execute_test "unkeyed" "be" "${datasizes}" "${extra_arguments}" "$file_suffix"
645        fi
646    fi
647
648    # KEYED
649    if [[ "${skip_keyed_data}" == "" ]]; then
650
651        # RELIABLE
652        if [[ "${skip_rel_tests}" == "" ]]; then
653            execute_test "keyed" "rel" "${datasizes}" "${extra_arguments}" "$file_suffix"
654        fi
655
656        # BEST EFFORT
657        if [[ "${skip_be_tests}" == "" ]]; then
658            execute_test "keyed" "be" "${datasizes}" "${extra_arguments}" "$file_suffix"
659        fi
660    fi
661
662fi
663
664# Tests that will not use batching
665if [[ "${lat_thr}" == "thr" && "${run_no_batching_tests}" == "1" ]]; then
666
667    if [[ "$role" == "pub" ]]; then
668        export commands_string="${commands_string} -batchSize 0"
669    fi
670
671    # UNKEYED
672    if [[ "${skip_unkeyed}" == "" ]]; then
673
674        # RELIABLE
675        if [[ "${skip_rel_tests}" == "" ]]; then
676            execute_test "unkeyed" "rel" "${datasizes}" "${extra_arguments}" "_noBatch${file_suffix}"
677        fi
678
679        # BEST EFFORT
680        if [[ "${skip_be_tests}" == "" ]]; then
681            execute_test "unkeyed" "be" "${datasizes}" "${extra_arguments}" "_noBatch${file_suffix}"
682        fi
683    fi
684
685    # KEYED
686    if [[ "${skip_keyed_data}" == "" ]]; then
687
688        # RELIABLE
689        if [[ "${skip_rel_tests}" == "" ]]; then
690            execute_test "keyed" "rel" "${datasizes}" "${extra_arguments}" "_noBatch${file_suffix}"
691        fi
692
693        # BEST EFFORT
694        if [[ "${skip_be_tests}" == "" ]]; then
695            execute_test "keyed" "be" "${datasizes}" "${extra_arguments}" "_noBatch${file_suffix}"
696        fi
697    fi
698
699fi
700
701if [[ "$role" == "pub" && "${loss_rate}" != "" ]]; then
702    echo -e "${INFO_TAG} Disabling loss rate"
703    sudo tc qdisc del dev $nic_publisher root netem loss $loss_rate%
704fi
1#!/bin/bash
2filename=$0
3script_location=$(cd "$(dirname "$filename")" || exit 255; pwd)
4
5echo -e "[Calling base_script/script.sh]"
6"${script_location}/../base_script/script.sh" $@ --transport UDPv4

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 (10Gbps and 1Gbps interfaces)