2.7. Practice with IxExplorer

This chapter describes a DTS practice with IXIA IxExplorer, which mainly used for performance testing. Here we take the performance case nic_single_core as an example.

2.7.1. Configuring your own execution file

First of all, you must configure execution.cfg as below:

[Execution1]
crbs=192.168.1.1
drivername=vfio-pci
test_suites=
    nic_single_core_perf,
targets=
    x86_64-native-linuxapp-gcc
parameters=nic_type=cfg:perf=true
build_type=meson
rx_mode=avx512

2.7.2. Configure CRB information

Then please add the detail information about your CRB in $DTS_CFG_FOLDER/crbs.conf as following:

[192.168.1.1]
dut_ip=192.168.1.1
dut_user=root
dut_passwd=passwd
os=linux
dut_arch=
tester_ip=192.168.1.1
tester_passwd=passwd
pktgen_group=IXIA
channels=4
bypass_core0=True
dut_cores=

2.7.3. Configure port information

ports topology as below:

IXIA port 0 <---------> DUT port 0
IXIA port 1 <---------> DUT port 1

please add port configuration in $DTS_CFG_FOLDER/ports.cfg as following:

[192.168.1.1]
ports =
    pci=0000:af:00.0,peer=IXIA:3.1;
    pci=0000:b1:00.0,peer=IXIA:3.2;

2.7.4. Configure pktgen information

please configure Pktgen information in $DTS_CFG_FOLDER/pktgen.cfg

[IXIA]
ixia_version=9.00
ixia_ip=192.168.2.1
ixia_ports=
    card=3,port=1;
    card=3,port=2;
ixia_force100g=disable

Note

The version of ixia must be consistent with your version of IxExplorer.

2.7.5. Configure your own suites

Performance tests generally have configuration files. it’s name corresponds to the suite. Below is the $DTS_CFG_FOLDER/nic_single_core_perf.cfg configuration file. You can set the test parameters according to your test needs.

[suite]
update_expected = True
test_parameters = {'1C/1T': {64: [512, 2048]},
                   '1C/2T': {64: [512, 2048]}}
rx_desc_16byte = 'y'
test_duration = 60
accepted_tolerance = 1
expected_throughput = {
     'I40E_40G-QSFP_A': {
         '1C/1T': {64: {512: 0.00, 2048: 0.00}},
         '1C/2T': {64: {512: 0.00, 2048: 0.00}}}}
  • accepted_tolerance: defines the accepted tolerance between real pps and expected pps.

  • test_parameters: defines the combination of frame size and descriptor numbers, and the pattern is {‘frame size’: [‘descriptor number #1’, ‘descriptor number #2’]}.

  • rx_desc_16byte: 16byte configuration and default by enabled.

  • test_duration: how many seconds each combination performance will be recorded.

  • expected_throughput: it’s a dictionary defining expected throughput numbers based on NIC, and the pattern is {‘NIC’: {‘frame size’: {‘descriptor number’: ‘excepted throughput’}}} Every user should fill it out with your actual numbers.

  • update_expected: if update_expected==True, and add argument “–update-expected” in bash command, all objects in this file will changed after the run:

    ./dts --update-expected
    

At the beginning, please change test_parameters according to your requirements, then run ./dts –update-expected to get the absolute results which will replace the default numbers 0.00 in this configuration. So you will have your own private configuration, and could start your tests as usual.

2.7.6. Run DTS performance test with IXIA

Now you can start DTS performance test with IXIA:

root@test1:~/dts# ./dts
              dts:
DUT 192.168.1.1
                    tester: ssh root@192.168.1.1
                    ...
pktgen: ssh root@192.168.1.1
                    pktgen: tclsh
                    pktgen: source ./IxiaWish.tcl
                    pktgen: set ::env(IXIA_VERSION) 9.00
                    pktgen: package req IxTclHal
                    pktgen: ixConnectToTclServer 192.168.2.1
                    pktgen: ixLogin IxiaTclUser
                    pktgen: ixConnectToChassis 192.168.2.1
                    pktgen: set chasId [ixGetChassisID 192.168.2.1]
                    pktgen: ixClearOwnership [list [list 1 3 1] [list 1 3 2]]
                    pktgen: ixTakeOwnership [list [list 1 3 1] [list 1 3 2]] force
                    pktgen: stat getLineSpeed 1 3 1
                    pktgen: stat getLineSpeed 1 3 2
                    ...

TestNicSingleCorePerf: Test Case test_perf_nic_single_core Begin
TestNicSingleCorePerf: Executing Test Using cores: ['28', '29'] of config 1C/1T
TestNicSingleCorePerf: Test running at parameters: framesize: 64, rxd/txd: 512
dut.192.168.1.1: x86_64-native-linuxapp-gcc/app/dpdk-testpmd -l 28,29 -n 6 -a 0000:af:00.0 -a 0000:b1:00.0 -- -i --portmask=0x3 --rxq=2 --txq=2 --txd=512 --rxd=512 --nb-cores=1
dut.192.168.1.1: start
               pktgen: stat getLineSpeed 1 1 1
               pktgen: stat getLineSpeed 1 1 2
               pktgen: scp -v dumppcap.py root@192.168.1.1:~/
               pktgen: scapy -c dumppcap.py 2>/dev/null
               pktgen: scp -v dumppcap.py root@192.168.1.1:~/
               pktgen: scapy -c dumppcap.py 2>/dev/null
               pktgen: scp -v dumppcap.py root@192.168.1.1:~/
               pktgen: scapy -c dumppcap.py 2>/dev/null
               pktgen: scp -v dumppcap.py root@192.168.1.1:~/
               pktgen: scapy -c dumppcap.py 2>/dev/null
               pktgen: begin traffic ......
               tester: scp -v ixiaConfig.tcl root@192.168.1.1:~/
               pktgen: source ixiaConfig.tcl
               pktgen: begin get port statistic ...
               pktgen: stat getRate statAllStats 1 3 2
               pktgen: stat cget -framesReceived
               pktgen: stat cget -bitsReceived
               pktgen: stat cget -oversize
               pktgen: stat getRate statAllStats 1 3 1
               pktgen: stat cget -framesReceived
               pktgen: stat cget -bitsReceived
               pktgen: stat cget -oversize
               pktgen: stat getRate statAllStats 1 3 2
               pktgen: stat cget -framesReceived
               pktgen: stat cget -bitsReceived
               pktgen: stat cget -oversize
               pktgen: stat getRate statAllStats 1 3 1
               pktgen: stat cget -framesReceived
               pktgen: stat cget -bitsReceived
               pktgen: stat cget -oversize
               pktgen: throughput: pps_rx 69504677.000000, bps_rx 35586394625.000000
               pktgen: ixStopTransmit portList
               pktgen: traffic completed.
  dut.192.168.1.1: stop
  dut.192.168.1.1: quit
  TestNicSingleCorePerf: Trouthput of framesize: 64, rxd/txd: 512 is :69.504677 Mpps
  ...

     TestNicSingleCorePerf:
  +----------+------------+---------+-------------+---------+---------------------+-----------------------+
  | Fwd_core | Frame Size | TXD/RXD | Throughput  |  Rate   | Expected Throughput | Throughput Difference |
  +==========+============+=========+=============+=========+=====================+=======================+
  | 1C/1T    | 64         | 512     | 69.505 Mpps | 93.414% | 0.000 Mpps          | 69.505 Mpps           |
  +----------+------------+---------+-------------+---------+---------------------+-----------------------+
  | 1C/1T    | 64         | 2048    | 51.078 Mpps | 68.649% | 0.000 Mpps          | 51.078 Mpps           |
  +----------+------------+---------+-------------+---------+---------------------+-----------------------+
  | 1C/2T    | 64         | 512     | 74.404 Mpps | 99.999% | 0.000 Mpps          | 74.404 Mpps           |
  +----------+------------+---------+-------------+---------+---------------------+-----------------------+
  | 1C/2T    | 64         | 2048    | 67.851 Mpps | 91.192% | 0.000 Mpps          | 67.851 Mpps           |
  +----------+------------+---------+-------------+---------+---------------------+-----------------------+
     TestNicSingleCorePerf: Test Case test_perf_nic_single_core Result PASSED:

2.7.7. Test result

After the Test Suite finished the validation, we can find the result files as below in output folder.

I40E_25G-25G_SFP28_single_core_perf.json  dts.log  TestNicSingleCorePerf.log test_results.json

The performance case will save the data results in the jison file. And the pattern is “nic name + suite name.json”. Below is the json file of nic_single_core:

vim I40E_25G-25G_SFP28_single_core_perf.json

{"test_perf_nic_single_core": [{
          "performance": [{"name": "Throughput", "value": 69.505, "unit": "Mpps", "delta": 69.505}],
          "parameters":  [{"name": "Txd/Rxd", "value": 512, "unit": "descriptor"},
                         {"name": "frame_size", "value": 64, "unit": "bytes"},
                         {"name": "Fwd_core", "value": "1C/1T"}], "status": "PASS"},
          {"performance": [{"name": "Throughput", "value": 51.078, "unit": "Mpps", "delta": 51.078}],
           "parameters": [{"name": "Txd/Rxd", "value": 2048, "unit": "descriptor"},
                          {"name": "frame_size", "value": 64, "unit": "bytes"},
                          {"name": "Fwd_core", "value": "1C/1T"}], "status": "PASS"},
         {"performance": [{"name": "Throughput", "value": 74.404, "unit": "Mpps", "delta": 74.404}],
          "parameters": [{"name": "Txd/Rxd", "value": 512, "unit": "descriptor"},
                          {"name": "frame_size", "value": 64, "unit": "bytes"},
                          {"name": "Fwd_core", "value": "1C/2T"}], "status": "PASS"},
         {"performance": [{"name": "Throughput", "value": 67.851, "unit": "Mpps", "delta": 67.851}],
          "parameters": [{"name": "Txd/Rxd", "value": 2048, "unit": "descriptor"},
                         {"name": "frame_size", "value": 64, "unit": "bytes"},
                         {"name": "Fwd_core", "value": "1C/2T"}], "status": "PASS"}]}

You can set your own expectations in con/suite.cfg based on the json data. If the actual data differs too much from the expected data, the case fails.