1.1.2.5. Network Capture

The Network Capture feature allows you to capture the traffic that one or more Participants send or receive. Each Participant will generate a pcap-based file containing its traffic that can then be opened with Wireshark. For more information, see Network Capture, in the RTI Connext DDS Core Libraries User’s Manual.

The use of Network Capture has some performance penalties, both in terms of latency and throughput, because it involves the additional effort of processing RTPS frames. This processing effort comes mainly from writing the RTPS frames into an output file according to a format (e.g., pcap).

To prevent a bottleneck while writing to the output file, Connext DDS queues the RTPS frames. Then, a separate thread is responsible for reading from the queue and writing to the output file. So, when Network Capture is running, an extra copy is involved. As a result, the effect of copying the RTPS frames increases with their lengths. It means that larger payloads will affect performance more.

Furthermore, depending on the options provided to Network Capture, there will be an additional performance impact due to parsing the RTPS frames. For example, if we set the parameters so that user data is removed, the capture file will be smaller in size but at a performance cost. The performance cost comes from parsing the RTPS frames looking for user data so that it can be excluded from the capture.

Network Capture can also parse and save the results of decrypting RTPS frames. If parsing the encrypted content is enabled, instead of having one buffer (the encrypted RTPS frame), we may have up to three: the encrypted RTPS frame, its decryption (that may contain encrypted submessages), and the decrypted submessages. Processing, copying, and writing more information to the output capture file affects performance.

When performance requirements are strict, all these aspects should be considered before running Network Capture. In any case, Network Capture should only be used for debugging purposes.

This section includes the performance results of capturing traffic for two DomainParticipants, one publishing data and another subscribing to it. As usual in RTI Perftest, the latency results come from the Publisher and the throughput results results come from the Subscriber.

Network Capture, Unkeyed, Best Effort, UDPv4 10Gbps, C++98

The graph below shows the one-way latency without load between a Publisher and a Subscriber running in two Linux nodes connected locally in a 10Gbps network.

Detailed Statistics

The following table contain the raw numbers presented by RTI Perftest. These numbers are the exact output with no further processing.

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

0.7

21

121

23

23

24

33

121

64

23

0.8

21

135

23

23

24

33

135

128

23

0.6

22

121

23

23

24

34

121

256

24

0.8

22

188

23

24

25

34

188

512

24

0.9

23

484

24

25

26

33

484

1024

26

1.3

24

712

26

26

27

36

712

8192

46

3.1

43

737

46

46

47

60

737

63000

113

27.7

107

627

110

111

124

482

627


Perftest Scripts

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

Publisher Side

 1sudo /set_lat_mode.sh
 2
 3echo EXECUTABLE IS $1
 4export executable=$1
 5
 6echo OUTPUT PATH IS $2
 7export output_folder=$2
 8
 9export exec_time=30
10export nic=172.16.0.1
11export pub_string="-pub \
12        -transport UDPv4 \
13        -nic $nic \
14        -noPrint \
15        -noOutputHeaders \
16        -exec $exec_time \
17        -noXML\
18        -networkCapture \
19        -latencyTest"
20
21mkdir -p $output_folder
22
23echo ">> UNKEYED BE"
24export my_file=$output_folder/lat_udpv4_pub_unkeyed_be_networkCap.csv
25touch $my_file
26for DATALEN in 32 64 128 256 512 1024 8192 63000; do
27    export command="taskset -c 0 \
28    $executable -best -datalen $DATALEN $pub_string"
29    echo $command
30    $command >> $my_file;
31    sleep 3;
32done
33sleep 5;
34
35echo ">> UNKEYED REL"
36export my_file=$output_folder/lat_udpv4_pub_unkeyed_rel_networkCap.csv
37touch $my_file
38for DATALEN in 32 64 128 256 512 1024 8192 63000 100000 500000 1048576 1548576 4194304 10485760; do
39    export command="taskset -c 0 \
40    $executable -datalen $DATALEN $pub_string"
41    echo $command
42    $command >> $my_file;
43    sleep 3;
44done
45sleep 5;
46
47echo ">> KEYED BE"
48export my_file=$output_folder/lat_udpv4_pub_keyed_be_networkCap.csv
49touch $my_file
50for DATALEN in 32 64 128 256 512 1024 8192 63000; do
51    export command="taskset -c 0 \
52    $executable -best -keyed -instances 100000 -datalen $DATALEN $pub_string"
53    echo $command
54    $command >> $my_file;
55    sleep 3;
56done
57sleep 5;
58
59echo ">> KEYED REL"
60export my_file=$output_folder/lat_udpv4_pub_keyed_rel_networkCap.csv
61touch $my_file
62for DATALEN in 32 64 128 256 512 1024 8192 63000; do
63    export command="taskset -c 0 \
64    $executable -keyed -instances 100000 -datalen $DATALEN $pub_string"
65    echo $command
66    $command >> $my_file;
67    sleep 3;
68done

Subscriber Side

 1sudo /set_lat_mode.sh
 2
 3echo EXECUTABLE IS $1
 4export executable=$1
 5
 6echo OUTPUT PATH IS $2
 7export output_folder=$2
 8
 9export nic=172.16.0.2
10export sub_string="-sub \
11        -transport UDPv4 \
12        -nic $nic \
13        -noPrint \
14        -noOutputHeaders \
15        -networkCapture \
16        -noXML"
17
18mkdir -p $output_folder
19
20echo ">> UNKEYED BE"
21export my_file=$output_folder/lat_udpv4_sub_unkeyed_be_networkCap.csv
22touch $my_file
23for DATALEN in 32 64 128 256 512 1024 8192 63000; do
24    export command="taskset -c 0 \
25    $executable -best $sub_string -datalen $DATALEN"
26    echo $command
27    $command >> $my_file;
28    sleep 10;
29done
30sleep 5;
31
32echo ">> UNKEYED REL"
33export my_file=$output_folder/lat_udpv4_sub_unkeyed_rel_networkCap.csv
34touch $my_file
35for DATALEN in 32 64 128 256 512 1024 8192 63000 100000 500000 1048576 1548576 4194304 10485760; do
36    export command="taskset -c 0 \
37    $executable $sub_string -datalen $DATALEN"
38    echo $command
39    $command >> $my_file;
40    sleep 10;
41done
42sleep 5;
43
44echo ">> KEYED BE"
45export my_file=$output_folder/lat_udpv4_sub_keyed_be_networkCap.csv
46touch $my_file
47for DATALEN in 32 64 128 256 512 1024 8192 63000; do
48    export command="taskset -c 0 \
49    $executable -best -keyed -instances 100000 $sub_string -datalen $DATALEN"
50    echo $command
51    $command >> $my_file;
52    sleep 10;
53done
54sleep 5;
55
56echo ">> KEYED REL"
57export my_file=$output_folder/lat_udpv4_sub_keyed_rel_networkCap.csv
58touch $my_file
59for DATALEN in 32 64 128 256 512 1024 8192 63000; do
60    export command="taskset -c 0 \
61    $executable -keyed -instances 100000 $sub_string -datalen $DATALEN"
62    echo $command
63    $command >> $my_file;
64    sleep 10;
65done

Test Hardware

The following hardware was used to perform these tests:

Linux Nodes

Processor: Intel® Xeon® E-2186G 3.8GHz, 12M cache, 6C/12T, turbo (95W)
RAM: 16GB 2666MT/s DDR4 ECC UDIMM
NIC 1: Intel X550 Dual Port 10GbE BASE-T Adapter, PCIe Full Height
NIC 2: Intel Ethernet I350 Dual Port 1GbE BASE-T Adapter, PCIe Low Profile
OS: Ubuntu 18.04 -- gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0

Switch

Dell Networking S4048T-ON, 48x 10GBASE-T and 6x 40GbE QSFP+ ports, IO to PSU air, 2x AC PSU, OS9