From d9a08e59581aafe44d446b5bc1ce6ff86b2b173b Mon Sep 17 00:00:00 2001 From: Peter Mikus Date: Thu, 13 Jul 2017 14:42:38 +0200 Subject: [PATCH] CSIT-618 CSIT rls1707 Report - Update I Change-Id: I7c3af55db6cc89f03004db6ddf6fcf67965132a7 Signed-off-by: Peter Mikus --- .../dpdk_performance_tests/csit_release_notes.rst | 4 +- .../dpdk_performance_tests/test_environment.rst | 284 +++++++++++-- .../csit_release_notes.rst | 12 +- .../report/honeycomb_functional_tests/overview.rst | 10 +- docs/report/index.rst | 1 + docs/report/introduction/csit_design.png | Bin 0 -> 106902 bytes docs/report/introduction/csit_design.rst | 178 +++++++++ docs/report/introduction/csit_test_naming.rst | 120 +++--- docs/report/introduction/general_notes.rst | 6 +- docs/report/introduction/index.rst | 1 + docs/report/introduction/overview.rst | 7 + .../csit_release_notes.rst | 18 + .../nsh_sfc_functional_tests/documentation.rst | 6 + docs/report/nsh_sfc_functional_tests/index.rst | 10 + docs/report/nsh_sfc_functional_tests/overview.rst | 105 +++++ .../nsh_sfc_functional_tests/test_environment.rst | 440 +++++++++++++++++++++ .../vpp_functional_tests/csit_release_notes.rst | 14 +- docs/report/vpp_functional_tests/overview.rst | 14 +- .../vpp_functional_tests/test_environment.rst | 63 +-- .../vpp_performance_tests/csit_release_notes.rst | 268 ++++++------- docs/report/vpp_performance_tests/overview.rst | 91 ++--- .../packet_latency_graphs/index.rst | 8 +- .../packet_latency_graphs/{ipv4.rst => ip4.rst} | 4 +- .../{ipv4_tunnels.rst => ip4_tunnels.rst} | 4 +- .../packet_latency_graphs/ip6.rst | 57 +++ .../{ipv6_tunnels.rst => ip6_tunnels.rst} | 0 .../packet_latency_graphs/ipsec.rst | 40 +- .../packet_latency_graphs/ipv6.rst | 58 --- .../packet_latency_graphs/l2.rst | 82 ++-- .../packet_latency_graphs/vm_vhost.rst | 30 +- .../packet_throughput_graphs/index.rst | 8 +- .../packet_throughput_graphs/{ipv4.rst => ip4.rst} | 25 +- .../{ipv4_tunnels.rst => ip4_tunnels.rst} | 8 +- .../packet_throughput_graphs/{ipv6.rst => ip6.rst} | 9 +- .../{ipv6_tunnels.rst => ip6_tunnels.rst} | 8 +- .../packet_throughput_graphs/ipsec.rst | 67 ++-- .../packet_throughput_graphs/l2.rst | 83 +++- .../packet_throughput_graphs/vm_vhost.rst | 85 ++-- .../vpp_performance_tests/test_environment.rst | 278 ++++++++++++- resources/tools/report_gen/conf.py | 11 +- resources/tools/report_gen/run_report.sh | 107 ++--- 41 files changed, 2009 insertions(+), 615 deletions(-) create mode 100644 docs/report/introduction/csit_design.png create mode 100644 docs/report/introduction/csit_design.rst create mode 100644 docs/report/nsh_sfc_functional_tests/csit_release_notes.rst create mode 100644 docs/report/nsh_sfc_functional_tests/documentation.rst create mode 100644 docs/report/nsh_sfc_functional_tests/index.rst create mode 100644 docs/report/nsh_sfc_functional_tests/overview.rst create mode 100644 docs/report/nsh_sfc_functional_tests/test_environment.rst rename docs/report/vpp_performance_tests/packet_latency_graphs/{ipv4.rst => ip4.rst} (97%) rename docs/report/vpp_performance_tests/packet_latency_graphs/{ipv4_tunnels.rst => ip4_tunnels.rst} (96%) create mode 100644 docs/report/vpp_performance_tests/packet_latency_graphs/ip6.rst rename docs/report/vpp_performance_tests/packet_latency_graphs/{ipv6_tunnels.rst => ip6_tunnels.rst} (100%) delete mode 100644 docs/report/vpp_performance_tests/packet_latency_graphs/ipv6.rst rename docs/report/vpp_performance_tests/packet_throughput_graphs/{ipv4.rst => ip4.rst} (86%) rename docs/report/vpp_performance_tests/packet_throughput_graphs/{ipv4_tunnels.rst => ip4_tunnels.rst} (96%) rename docs/report/vpp_performance_tests/packet_throughput_graphs/{ipv6.rst => ip6.rst} (97%) rename docs/report/vpp_performance_tests/packet_throughput_graphs/{ipv6_tunnels.rst => ip6_tunnels.rst} (95%) diff --git a/docs/report/dpdk_performance_tests/csit_release_notes.rst b/docs/report/dpdk_performance_tests/csit_release_notes.rst index e8f47d9986..9673754d92 100644 --- a/docs/report/dpdk_performance_tests/csit_release_notes.rst +++ b/docs/report/dpdk_performance_tests/csit_release_notes.rst @@ -4,9 +4,9 @@ CSIT Release Notes Changes in CSIT |release| ------------------------- -#. Improved Testpmd tests +#. Improved performance of testpmd tests - - Performance of NICs - 2p40GE Intel xl710, 2p10GE Intel x710 + - Performance of NICs - 2p40GE Intel xl710, 2p10GE Intel x710 #. Added L3FWD tests on 2p10GE Intel x520-DA2 diff --git a/docs/report/dpdk_performance_tests/test_environment.rst b/docs/report/dpdk_performance_tests/test_environment.rst index ed71c7fe46..e8ed76d761 100644 --- a/docs/report/dpdk_performance_tests/test_environment.rst +++ b/docs/report/dpdk_performance_tests/test_environment.rst @@ -4,17 +4,144 @@ Test Environment To execute performance tests, there are three identical testbeds, each testbed consists of two SUTs and one TG. +Naming Convention +----------------- + +Following naming convention is used within this page to specify physical +connectivity and wiring across defined CSIT testbeds: + +- testbedname: testbedN. +- hostname: + + - traffic-generator: tN-tgW. + - system-under-testX: tN-sutX. + +- portnames: + + - tN-tgW-cY/pZ. + - tN-sutX-cY/pZ. + +- where: + + - N - testbed number. + - tgW - server acts as traffic-generator with W index. + - sutX - server acts as system-under-test with X index. + - Y - PCIe slot number denoting a NIC card number within the host. + + - Y=1,2,3 - slots in Riser 1, Right PCIe Riser Board, NUMA node 0. + - Y=4,5,6 - slots in Riser 2, Left PCIe Riser Board, NUMA node 1. + - Y=m - the MLOM slot. + + - Z - port number on the NIC card. + +Server HW Configuration +----------------------- + +CSIT testbed contains following three HW configuration types of UCS x86 servers, +across total of ten servers provided: + +#. Type-1: Purpose - VPP functional and performance conformance testing. + + - Quantity: 6 computers as SUT hosts (Systems Under Test). + - Physical connectivity: + + - CIMC and host management ports. + - NIC ports connected in 3-node topologies. + + - Main HW configuration: + + - Chassis: UCSC-C240-M4SX with 6 PCIe3.0 slots. + - Processors: 2* E5-2699 2.3 GHz. + - RAM Memory: 16* 32GB DDR4-2133MHz. + - Disks: 2* 2TB 12G SAS 7.2K RPM SFF HDD. + + - NICs configuration: + + - Right PCIe Riser Board (Riser 1) (x8, x8, x8 PCIe3.0 lanes) + + - PCIe Slot1: Cisco VIC 1385 2p40GE. + + - PCIe Slot2: Intel NIC x520 2p10GE. + - PCIe Slot3: empty. + + - Left PCIe Riser Board (Riser 2) (x8, x16, x8 PCIe3.0 lanes) + + - PCIe Slot4: Intel NIC xl710 2p40GE. + - PCIe Slot5: Intel NIC x710 2p10GE. + - PCIe Slot6: Intel QAT 8950 50G (Walnut Hill) + + - MLOM slot: Cisco VIC 1227 2p10GE (x8 PCIe2.0 lanes). + +#. Type-2: Purpose - VPP functional and performance conformance testing. + + - Quantity: 3 computers as TG hosts (Traffic Generators). + - Physical connectivity: + + - CIMC and host management ports. + - NIC ports connected in 3-node topologies. + + - Main HW configuration: + + - Chassis: UCSC-C240-M4SX with 6 PCIe3.0 slots. + - Processors: 2* E5-2699 2.3 GHz. + - RAM Memory: 16* 32GB DDR4-2133MHz. + - Disks: 2* 2TB 12G SAS 7.2K RPM SFF HDD. + + - NICs configuration: + + - Right PCIe Riser Board (Riser 1) (x8, x8, x8 lanes) + + - PCIe Slot1: Intel NIC xl710 2p40GE. + - PCIe Slot2: Intel NIC x710 2p10GE. + - PCIe Slot3: Intel NIC x710 2p10GE. + + - Left PCIe Riser Board (Riser 2) (x8, x16, x8 lanes) + + - PCIe Slot4: Intel NIC xl710 2p40GE. + - PCIe Slot5: Intel NIC x710 2p10GE. + - PCIe Slot6: Intel NIC x710 2p10GE. + + - MLOM slot: empty. + +#. Type-3: Purpose - VIRL functional conformance. + + - Quantity: 3 computers as VIRL hosts. + - Physical connectivity: + + - CIMC and host management ports. + - no NIC ports, standalone setup. + + - Main HW configuration: + + - Chassis: UCSC-C240-M4SX with 6 PCIe3.0 slots. + - Processors: 2* E5-2699 2.3 GHz. + - RAM Memory: 16* 32GB DDR4-2133MHz. + - Disks: 2* 480 GB 2.5inch 6G SATA SSD. + + - NICs configuration: + + - Right PCIe Riser Board (Riser 1) (x8, x8, x8 lanes) + + - no cards. + + - Left PCIe Riser Board (Riser 2) (x8, x16, x8 lanes) + + - no cards. + + - MLOM slot: empty. + SUT Configuration - Host HW --------------------------- Host hardware details (CPU, memory, NIC layout) and physical topology are -described in detail in -`LF FDio CSIT testbed wiki page `_. +described in detail in `LF FDio CSIT testbed wiki page +`_. **Host configuration** -- All hosts are Cisco UCS C240-M4 (2x Intel(R) Xeon(R) CPU E5-2699 v3 @ 2.30GHz, - 18c, 512GB RAM) - :: +All hosts are Cisco UCS C240-M4 (2x Intel(R) Xeon(R) CPU E5-2699 v3 @ 2.30GHz, +18c, 512GB RAM) + +:: $ lscpu Architecture: x86_64 @@ -42,8 +169,9 @@ described in detail in NUMA node1 CPU(s): 18-35 Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm epb tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm xsaveopt cqm_llc cqm_occup_llc dtherm arat pln pts -- BIOS settings - :: +**BIOS settings** + +:: C240 /bios # show advanced detail Set-up parameters: @@ -114,18 +242,19 @@ described in detail in CDN Support for VIC: Disabled Out-of-Band Management: Disabled -- In addition to CIMC and Management, each TG has 4x Intel X710 10GB NIC - (=8 ports) and 2x Intel XL710 40GB NIC (=4 ports), whereas each SUT has: +**NIC models and placement** - - 1x Intel X520 NIC (10GB, 2 ports), - - 1x Cisco VIC 1385 (40GB, 2 ports), - - 1x Intel XL710 NIC (40GB, 2 ports), - - 1x Intel X710 NIC (10GB, 2 ports), - - 1x Cisco VIC 1227 (10GB, 2 ports). - - This allows for a total of five ring topologies, each using ports on - specific NIC model, enabling per NIC model benchmarking. +In addition to CIMC and Management, each TG has 4x Intel X710 10GB NIC +(=8 ports) and 2x Intel XL710 40GB NIC (=4 ports), whereas each SUT has: -**NIC models and placement** +- 1x Intel X520 NIC (10GB, 2 ports), +- 1x Cisco VIC 1385 (40GB, 2 ports), +- 1x Intel XL710 NIC (40GB, 2 ports), +- 1x Intel X710 NIC (10GB, 2 ports), +- 1x Cisco VIC 1227 (10GB, 2 ports). + +This allows for a total of five ring topologies, each using ports on specific +NIC model, enabling per NIC model benchmarking. - 0a:00.0 Ethernet controller: Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection (rev 01) Subsystem: Intel Corporation Ethernet Server @@ -157,10 +286,13 @@ described in detail in SUT Configuration - Host OS Linux --------------------------------- -Software details (OS, configuration) are described in -`CSIT/CSIT_LF_testbed `_. +Software details (OS, configuration) are described in FD.io wiki `LF FDio CSIT +testbed wiki page `_. -Below a subset of the configuration: +System provisioning is done by combination of PXE boot unattented install and +`Ansible `_ described in `CSIT Testbed Setup`_. + +Below a subset of the running configuration: :: @@ -233,11 +365,39 @@ Below a subset of the configuration: Node 1 HugePages_Free: 2048 Node 1 HugePages_Surp: 0 +**Kernel boot parameters used in CSIT performance testbeds** + +- **isolcpus=-** used for all cpu cores apart from + first core of each socket used for running VPP worker threads and Qemu/LXC + processes https://www.kernel.org/doc/Documentation/kernel-parameters.txt +- **intel_pstate=disable** - [X86] Do not enable intel_pstate as the default + scaling driver for the supported processors. Intel P-State driver decide what + P-state (CPU core power state) to use based on requesting policy from the + cpufreq core. [X86 - Either 32-bit or 64-bit x86] + https://www.kernel.org/doc/Documentation/cpu-freq/intel-pstate.txt +- **nohz_full=-** - [KNL,BOOT] In kernels built with + CONFIG_NO_HZ_FULL=y, set the specified list of CPUs whose tick will be stopped + whenever possible. The boot CPU will be forced outside the range to maintain + the timekeeping. The CPUs in this range must also be included in the + rcu_nocbs= set. Specifies the adaptive-ticks CPU cores, causing kernel to + avoid sending scheduling-clock interrupts to listed cores as long as they have + a single runnable task. [KNL - Is a kernel start-up parameter, SMP - The + kernel is an SMP kernel]. + https://www.kernel.org/doc/Documentation/timers/NO_HZ.txt +- **rcu_nocbs** - [KNL] In kernels built with CONFIG_RCU_NOCB_CPU=y, set the + specified list of CPUs to be no-callback CPUs, that never queue RCU callbacks + (read-copy update). + https://www.kernel.org/doc/Documentation/kernel-parameters.txt + +**Applied command line boot parameters:** + :: $ cat /proc/cmdline BOOT_IMAGE=/vmlinuz-4.4.0-72-generic root=UUID=35ea11e4-e44f-4f67-8cbe-12f09c49ed90 ro isolcpus=1-17,19-35 nohz_full=1-17,19-35 rcu_nocbs=1-17,19-35 intel_pstate=disable console=tty0 console=ttyS0,115200n8 +**Mount listing** + :: $ cat /proc/mounts @@ -273,6 +433,8 @@ Below a subset of the configuration: none /mnt/huge hugetlbfs rw,relatime,pagesize=2048k 0 0 lxcfs /var/lib/lxcfs fuse.lxcfs rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other 0 0 +**Package listing** + :: $ dpkg -l @@ -808,6 +970,8 @@ Below a subset of the configuration: ii zlib1g:amd64 1:1.2.8.dfsg-2ubuntu4 amd64 compression library - runtime ii zlib1g-dev:amd64 1:1.2.8.dfsg-2ubuntu4 amd64 compression library - development +**Kernel module listing** + :: $ lsmod | sort @@ -897,6 +1061,8 @@ Below a subset of the configuration: xt_CHECKSUM 16384 1 xt_tcpudp 16384 5 +**Sysctl listing** + :: $ sysctl -a @@ -1841,6 +2007,8 @@ Below a subset of the configuration: vm.vfs_cache_pressure = 100 vm.zone_reclaim_mode = 0 +**Services listing** + :: $ service --status-all @@ -1888,6 +2056,71 @@ Below a subset of the configuration: [ + ] uuidd [ - ] x11-common +**Host CFS optimizations (QEMU+VPP)** + +Applying CFS scheduler tuning on all Qemu vcpu worker threads (those are +handling testpmd - pmd threads) and VPP PMD worker threads. List of VPP PMD +threads can be obtained e.g. from: + +:: + + $ for psid in $(pgrep vpp) + $ do + $ for tid in $(ps -Lo tid --pid $psid | grep -v TID) + $ do + $ echo $tid + $ done + $ done + +Or: + +:: + + $ cat /proc/`pidof vpp`/task/*/stat | awk '{print $1" "$2" "$39}' + +Applying Round-robin scheduling with highest priority + +:: + + $ for psid in $(pgrep vpp) + $ do + $ for tid in $(ps -Lo tid --pid $psid | grep -v TID) + $ do + $ chrt -r -p 1 $tid + $ done + $ done + +More information about Linux CFS can be found in: `Sched manual pages +`_. + + +**Host IRQ affinity** + +Changing the default pinning of every IRQ to core 0. (Same does apply on both +guest VM and host OS) + +:: + + $ for l in `ls /proc/irq`; do echo 1 | sudo tee /proc/irq/$l/smp_affinity; done + +**Host RCU affinity** + +Changing the default pinning of RCU to core 0. (Same does apply on both guest VM +and host OS) + +:: + + $ for i in `pgrep rcu[^c]` ; do sudo taskset -pc 0 $i ; done + +**Host Writeback affinity** + +Changing the default pinning of writebacks to core 0. (Same does apply on both +guest VM and host OS) + +:: + + $ echo 1 | sudo tee /sys/bus/workqueue/devices/writeback/cpumask + DUT Configuration - DPDK ------------------------ @@ -1916,13 +2149,13 @@ Tagged by **2T2C** .. code-block:: bash - testpmd -c 0x403 -n 4 -- --numa --nb-ports=2 --portmask=0x3 --nb-cores=2 --max-pkt-len=9000 --txqflags=0 --forward-mode=io --rxq=1 --txq=1 --burst=64 --burst=64 --rxd=1024 --txd=1024 --disable-link-check --auto-start + testpmd -c 0x403 -n 4 -- --numa --nb-ports=2 --portmask=0x3 --nb-cores=2 --max-pkt-len=9000 --txqflags=0 --forward-mode=io --rxq=1 --txq=1 --burst=64 --rxd=1024 --txd=1024 --disable-link-check --auto-start Tagged by **4T4C** .. code-block:: bash - testpmd -c 0xc07 -n 4 -- --numa --nb-ports=2 --portmask=0x3 --nb-cores=4 --max-pkt-len=9000 --txqflags=0 --forward-mode=io --rxq=2 --txq=2 --burst=64 --burst=64 --rxd=1024 --txd=1024 --disable-link-check --auto-start + testpmd -c 0xc07 -n 4 -- --numa --nb-ports=2 --portmask=0x3 --nb-cores=4 --max-pkt-len=9000 --txqflags=0 --forward-mode=io --rxq=2 --txq=2 --burst=64 --rxd=1024 --txd=1024 --disable-link-check --auto-start **L3FWD Startup Configuration** @@ -1976,7 +2209,12 @@ DPDK v17.05 - dest_mac : [0x3c,0xfd,0xfe,0x9c,0xee,0xf4] src_mac : [0x3c,0xfd,0xfe,0x9c,0xee,0xf5] +**TG Startup Command** + +:: + + $ sh -c 'cd /scripts/ && sudo nohup ./t-rex-64 -i -c 7 --iom 0 > /dev/null 2>&1 &'> /dev/null + **TG common API - pointer to driver** `TRex driver`_ - diff --git a/docs/report/honeycomb_functional_tests/csit_release_notes.rst b/docs/report/honeycomb_functional_tests/csit_release_notes.rst index f36c7a78c0..a398fa41cf 100644 --- a/docs/report/honeycomb_functional_tests/csit_release_notes.rst +++ b/docs/report/honeycomb_functional_tests/csit_release_notes.rst @@ -6,12 +6,12 @@ Changes in CSIT |release| #. Added Honeycomb functional tests - - ACL plugin - - Routing - - SLAAC - - Proxy ARP - - DHCP Relay - - Neighbor Discovery Proxy + - ACL plugin + - Routing + - SLAAC + - Proxy ARP + - DHCP Relay + - Neighbor Discovery Proxy #. Changed execution environment from Ubuntu14.04 to Ubuntu16.04 diff --git a/docs/report/honeycomb_functional_tests/overview.rst b/docs/report/honeycomb_functional_tests/overview.rst index 9cf741e013..c73e9706f8 100644 --- a/docs/report/honeycomb_functional_tests/overview.rst +++ b/docs/report/honeycomb_functional_tests/overview.rst @@ -185,12 +185,12 @@ suites: #. **Physical port to physical port - a.k.a. NIC-to-NIC, Phy-to-Phy, P2P** - - *eth2p-ethip4-ip4base-func.robot* => 2 ports of Ethernet, IPv4 baseline - routed forwarding, functional tests. + - *eth2p-ethip4-ip4base-func.robot* => 2 ports of Ethernet, IPv4 baseline + routed forwarding, functional tests. #. **Physical port to VM (or VM chain) to physical port - a.k.a. NIC2VM2NIC, P2V2P, NIC2VMchain2NIC, P2V2V2P** - - *eth2p-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-func.robot* => 2 ports of - Ethernet, IPv4 VXLAN Ethernet, L2 bridge-domain switching to/from two vhost - interfaces and one VM, functional tests. + - *eth2p-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-func.robot* => 2 ports of + Ethernet, IPv4 VXLAN Ethernet, L2 bridge-domain switching to/from two vhost + interfaces and one VM, functional tests. diff --git a/docs/report/index.rst b/docs/report/index.rst index 29f067bd8d..be7129cb79 100644 --- a/docs/report/index.rst +++ b/docs/report/index.rst @@ -10,6 +10,7 @@ CSIT 17.07 vpp_functional_tests/index honeycomb_functional_tests/index vpp_unit_tests/index + nsh_sfc_functional_tests/index detailed_test_results/index test_configuration/index test_operational_data/index diff --git a/docs/report/introduction/csit_design.png b/docs/report/introduction/csit_design.png new file mode 100644 index 0000000000000000000000000000000000000000..175c2f597a4917abb95345f344f82f4c9f2b896b GIT binary patch literal 106902 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. diff --git a/docs/report/introduction/csit_test_naming.rst b/docs/report/introduction/csit_test_naming.rst index 682fcd941a..13eab06df5 100644 --- a/docs/report/introduction/csit_test_naming.rst +++ b/docs/report/introduction/csit_test_naming.rst @@ -19,26 +19,26 @@ Naming Convention The CSIT approach is to use tree naming convention and to encode following testing information into test suite and test case names: -1. packet network port configuration +#. packet network port configuration - * port type, physical or virtual; - * number of ports; - * NIC model, if applicable; - * port-NIC locality, if applicable; + * port type, physical or virtual; + * number of ports; + * NIC model, if applicable; + * port-NIC locality, if applicable; -2. packet encapsulations; +#. packet encapsulations; -3. VPP packet processing +#. VPP packet processing - * packet forwarding mode; - * packet processing function(s); + * packet forwarding mode; + * packet processing function(s); -4. packet forwarding path +#. packet forwarding path - * if present, network functions (processes, containers, VMs) and their - topology within the computer; + * if present, network functions (processes, containers, VMs) and their + topology within the computer; -5. main measured variable, type of test. +#. main measured variable, type of test. Proposed convention is to encode ports and NICs on the left (underlay), followed by outer-most frame header, then other stacked headers up to the @@ -58,61 +58,61 @@ topologies: 1. **Physical port to physical port - a.k.a. NIC-to-NIC, Phy-to-Phy, P2P** - * *PortNICConfig-WireEncapsulation-PacketForwardingFunction- - PacketProcessingFunction1-...-PacketProcessingFunctionN-TestType* - * *10ge2p1x520-dot1q-l2bdbasemaclrn-ndrdisc.robot* => 2 ports of 10GE on Intel - x520 NIC, dot1q tagged Ethernet, L2 bridge-domain baseline switching with - MAC learning, NDR throughput discovery. - * *10ge2p1x520-ethip4vxlan-l2bdbasemaclrn-ndrchk.robot* => 2 ports of 10GE on - Intel x520 NIC, IPv4 VXLAN Ethernet, L2 bridge-domain baseline switching - with MAC learning, NDR throughput discovery. - * *10ge2p1x520-ethip4-ip4base-ndrdisc.robot* => 2 ports of 10GE on Intel x520 - NIC, IPv4 baseline routed forwarding, NDR throughput discovery. - * *10ge2p1x520-ethip6-ip6scale200k-ndrdisc.robot* => 2 ports of 10GE on Intel - x520 NIC, IPv6 scaled up routed forwarding, NDR throughput discovery. - * *10ge2p1x520-ethip4-ip4base-iacldstbase-ndrdisc.robot* => 2 ports of 10GE on - Intel x520 NIC, IPv4 baseline routed forwarding, ingress Access Control - Lists baseline matching on destination, NDR throughput discovery. - * *40ge2p1vic1385-ethip4-ip4base-ndrdisc.robot* => 2 ports of 40GE on Cisco - vic1385 NIC, IPv4 baseline routed forwarding, NDR throughput discovery. - * *eth2p-ethip4-ip4base-func.robot* => 2 ports of Ethernet, IPv4 baseline - routed forwarding, functional tests. + * *PortNICConfig-WireEncapsulation-PacketForwardingFunction- + PacketProcessingFunction1-...-PacketProcessingFunctionN-TestType* + * *10ge2p1x520-dot1q-l2bdbasemaclrn-ndrdisc.robot* => 2 ports of 10GE on Intel + x520 NIC, dot1q tagged Ethernet, L2 bridge-domain baseline switching with + MAC learning, NDR throughput discovery. + * *10ge2p1x520-ethip4vxlan-l2bdbasemaclrn-ndrchk.robot* => 2 ports of 10GE on + Intel x520 NIC, IPv4 VXLAN Ethernet, L2 bridge-domain baseline switching + with MAC learning, NDR throughput discovery. + * *10ge2p1x520-ethip4-ip4base-ndrdisc.robot* => 2 ports of 10GE on Intel x520 + NIC, IPv4 baseline routed forwarding, NDR throughput discovery. + * *10ge2p1x520-ethip6-ip6scale200k-ndrdisc.robot* => 2 ports of 10GE on Intel + x520 NIC, IPv6 scaled up routed forwarding, NDR throughput discovery. + * *10ge2p1x520-ethip4-ip4base-iacldstbase-ndrdisc.robot* => 2 ports of 10GE on + Intel x520 NIC, IPv4 baseline routed forwarding, ingress Access Control + Lists baseline matching on destination, NDR throughput discovery. + * *40ge2p1vic1385-ethip4-ip4base-ndrdisc.robot* => 2 ports of 40GE on Cisco + vic1385 NIC, IPv4 baseline routed forwarding, NDR throughput discovery. + * *eth2p-ethip4-ip4base-func.robot* => 2 ports of Ethernet, IPv4 baseline + routed forwarding, functional tests. 2. **Physical port to VM (or VM chain) to physical port - a.k.a. NIC2VM2NIC, P2V2P, NIC2VMchain2NIC, P2V2V2P** - * *PortNICConfig-WireEncapsulation-PacketForwardingFunction- - PacketProcessingFunction1-...-PacketProcessingFunctionN-VirtEncapsulation- - VirtPortConfig-VMconfig-TestType* - * *10ge2p1x520-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc.robot* => 2 ports - of 10GE on Intel x520 NIC, dot1q tagged Ethernet, L2 bridge-domain switching - to/from two vhost interfaces and one VM, NDR throughput discovery. - * *10ge2p1x520-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc.robot* => 2 - ports of 10GE on Intel x520 NIC, IPv4 VXLAN Ethernet, L2 bridge-domain - switching to/from two vhost interfaces and one VM, NDR throughput discovery. - * *10ge2p1x520-ethip4vxlan-l2bdbasemaclrn-eth-4vhost-2vm-ndrdisc.robot* => 2 - ports of 10GE on Intel x520 NIC, IPv4 VXLAN Ethernet, L2 bridge-domain - switching to/from four vhost interfaces and two VMs, NDR throughput - discovery. - * *eth2p-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-func.robot* => 2 ports of - Ethernet, IPv4 VXLAN Ethernet, L2 bridge-domain switching to/from two vhost - interfaces and one VM, functional tests. + * *PortNICConfig-WireEncapsulation-PacketForwardingFunction- + PacketProcessingFunction1-...-PacketProcessingFunctionN-VirtEncapsulation- + VirtPortConfig-VMconfig-TestType* + * *10ge2p1x520-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc.robot* => 2 ports + of 10GE on Intel x520 NIC, dot1q tagged Ethernet, L2 bridge-domain switching + to/from two vhost interfaces and one VM, NDR throughput discovery. + * *10ge2p1x520-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc.robot* => 2 + ports of 10GE on Intel x520 NIC, IPv4 VXLAN Ethernet, L2 bridge-domain + switching to/from two vhost interfaces and one VM, NDR throughput discovery. + * *10ge2p1x520-ethip4vxlan-l2bdbasemaclrn-eth-4vhost-2vm-ndrdisc.robot* => 2 + ports of 10GE on Intel x520 NIC, IPv4 VXLAN Ethernet, L2 bridge-domain + switching to/from four vhost interfaces and two VMs, NDR throughput + discovery. + * *eth2p-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-func.robot* => 2 ports of + Ethernet, IPv4 VXLAN Ethernet, L2 bridge-domain switching to/from two vhost + interfaces and one VM, functional tests. 3. **API CRUD tests - Create (Write), Read (Retrieve), Update (Modify), Delete (Destroy) operations for configuration and operational data** - * *ManagementTestKeyword-ManagementOperation-ManagedFunction1-...- - ManagedFunctionN-ManagementAPI1-ManagementAPIN-TestType* - * *mgmt-cfg-lisp-apivat-func* => configuration of LISP with VAT API calls, - functional tests. - * *mgmt-cfg-l2bd-apihc-apivat-func* => configuration of L2 Bridge-Domain with - HoneyComb API and VAT API calls, functional tests. - * *mgmt-oper-int-apihcnc-func* => reading status and operational data of - interface with HoneyComb NetConf API calls, functional tests. - * *mgmt-cfg-int-tap-apihcnc-func* => configuration of tap interfaces with - HoneyComb NetConf API calls, functional tests. - * *mgmt-notif-int-subint-apihcnc-func* => notifications of interface and - sub-interface events with HoneyComb NetConf Notifications, functional tests. + * *ManagementTestKeyword-ManagementOperation-ManagedFunction1-...- + ManagedFunctionN-ManagementAPI1-ManagementAPIN-TestType* + * *mgmt-cfg-lisp-apivat-func* => configuration of LISP with VAT API calls, + functional tests. + * *mgmt-cfg-l2bd-apihc-apivat-func* => configuration of L2 Bridge-Domain with + HoneyComb API and VAT API calls, functional tests. + * *mgmt-oper-int-apihcnc-func* => reading status and operational data of + interface with HoneyComb NetConf API calls, functional tests. + * *mgmt-cfg-int-tap-apihcnc-func* => configuration of tap interfaces with + HoneyComb NetConf API calls, functional tests. + * *mgmt-notif-int-subint-apihcnc-func* => notifications of interface and + sub-interface events with HoneyComb NetConf Notifications, functional tests. For complete description of CSIT test naming convention please refer to `CSIT test naming wiki page `_. diff --git a/docs/report/introduction/general_notes.rst b/docs/report/introduction/general_notes.rst index d96dc00101..f91d96138f 100644 --- a/docs/report/introduction/general_notes.rst +++ b/docs/report/introduction/general_notes.rst @@ -41,9 +41,9 @@ is listed separately, as follows: functionality of VPP. Tests cover a range of CRUD operations executed against VPP. -#. **TLDK Tests** - TODO - -#. **NSH_SFC Tests** - TODO +#. **NSH_SFC Functional Tests** - NSH_SFC functional tests are executed in + virtual FD.io testbeds focusing onNSH_SFC of VPP. Tests cover a range of + CRUD operations executed against VPP. In addition to above, CSIT |release| report does also include VPP unit test results. VPP unit tests are developed within the FD.io VPP project and as they diff --git a/docs/report/introduction/index.rst b/docs/report/introduction/index.rst index 7c74f46cd1..eabbf7b7ae 100644 --- a/docs/report/introduction/index.rst +++ b/docs/report/introduction/index.rst @@ -5,5 +5,6 @@ Introduction overview general_notes + csit_design csit_test_naming csit_tag_description diff --git a/docs/report/introduction/overview.rst b/docs/report/introduction/overview.rst index 1356ca6795..7954686ad3 100644 --- a/docs/report/introduction/overview.rst +++ b/docs/report/introduction/overview.rst @@ -61,6 +61,13 @@ CSIT |release| report contains following main sections and sub-sections: *Overview* - short overview of unit test framework and executed tests; *Documentation* - source code documentation of VPP unit tests. +#. **NSH_SFC Functional Tests** - NSH_SFC functional tests executed in + virtual FD.io testbeds; *Overview* - tested virtual topologies, test + coverage and naming specifics; *CSIT Release Notes* - changes in CSIT + |release|, added tests, environment or methodology changes, known CSIT issues; + *Test Environment* - environment description ; + *Documentation* - source code documentation for NSH_SFC functional tests. + #. **Detailed Test Results** - auto-generated results from CSIT jobs executions using CSIT Robot Framework output files as source data; *VPP Performance Results*, *DPDK Performance Results*, *VPP Functional diff --git a/docs/report/nsh_sfc_functional_tests/csit_release_notes.rst b/docs/report/nsh_sfc_functional_tests/csit_release_notes.rst new file mode 100644 index 0000000000..6655a4538d --- /dev/null +++ b/docs/report/nsh_sfc_functional_tests/csit_release_notes.rst @@ -0,0 +1,18 @@ +CSIT Release Notes +================== + +Changes in CSIT |release| +------------------------- + +#. TODO + +Known Issues +------------ + +Here is the list of known issues in CSIT |release| for NSH_SFC functional tests in VIRL: + ++---+-------------------------------------------------+----------+------------------------------------------------------+ +| # | Issue | Jira ID | Description | ++---+-------------------------------------------------+----------+------------------------------------------------------+ +| 1 | TODO | CSIT-??? | TODO | ++---+-------------------------------------------------+----------+------------------------------------------------------+ diff --git a/docs/report/nsh_sfc_functional_tests/documentation.rst b/docs/report/nsh_sfc_functional_tests/documentation.rst new file mode 100644 index 0000000000..709f2a8a84 --- /dev/null +++ b/docs/report/nsh_sfc_functional_tests/documentation.rst @@ -0,0 +1,6 @@ +Documentation +============= + +`CSIT NSH_SFC Functional Tests Documentation`_ contains detailed +functional description and input parameters for each test case. + diff --git a/docs/report/nsh_sfc_functional_tests/index.rst b/docs/report/nsh_sfc_functional_tests/index.rst new file mode 100644 index 0000000000..c7678d26a0 --- /dev/null +++ b/docs/report/nsh_sfc_functional_tests/index.rst @@ -0,0 +1,10 @@ +NSH_SFC Functional Tests +======================== + +.. toctree:: + + overview + csit_release_notes + test_environment + documentation + diff --git a/docs/report/nsh_sfc_functional_tests/overview.rst b/docs/report/nsh_sfc_functional_tests/overview.rst new file mode 100644 index 0000000000..343e11dd83 --- /dev/null +++ b/docs/report/nsh_sfc_functional_tests/overview.rst @@ -0,0 +1,105 @@ +Overview +======== + +Tested Virtual Topologies +------------------------- + +CSIT NSH_SFC functional tests are executed on virtualized topologies created +using Virtual Internet Routing Lab (VIRL) simulation platform contributed by +Cisco. VIRL runs on physical baremetal servers hosted by LF FD.io project. +Majority,of the tests are executed in the three node logical test topology - +Traffic Generator (TG) node and two Systems Under Test (SUT) nodes connected in +a loop. Some tests use two node logical test topology - TG node and SUT1 node. +Both logical test topologies are shown in the figures below. + +:: + + +------------------------+ +------------------------+ + | | | | + | +------------------+ | | +------------------+ | + | | <-----------------> | | + | | | | | | | | + | | DUT1 <-----------------> DUT2 | | + | +--^--^------------+ | | +------------^--^--+ | + | | | | | | | | + | | | SUT1 | | SUT2 | | | + +------------------------+ +------------------------+ + | | | | + | | | | + | | +-----------+ | | + | +---------------> <---------------+ | + | | TG | | + +------------------> <------------------+ + +-----------+ + + +------------------------+ + | | + | +------------------+ | + +---------------> <--------------+ + | | | | | | + | |------------> DUT1 <-----------+ | + | | | +------------------+ | | | + | | | | | | + | | | SUT1 | | | + | | +------------------------+ | | + | | | | + | | | | + | | +-----------+ | | + | +---------------> <---------------+ | + | | TG | | + +------------------> <------------------+ + +-----------+ + +SUT1 and SUT2 are two VMs (Ubuntu or Centos, depending on the test suite), TG +is a Traffic Generator (TG, another Ubuntu VM). SUTs run VPP SW application in +Linux user-mode as a Device Under Test (DUT) within the VM. TG runs Scapy SW +application as a packet Traffic Generator. Logical connectivity between SUTs +and to TG is provided using virtual NICs using VMs' virtio driver. + +Virtual testbeds are created on-demand whenever a verification job is started +(e.g. triggered by the gerrit patch submission) and destroyed upon completion +of all functional tests. Each node is a Virtual Machine and each connection +that is drawn on the diagram is available for use in any test case. During the +test execution, all nodes are reachable thru the Management network connected +to every node via dedicated virtual NICs and virtual links (not shown above +for clarity). + +For the test cases that require DUT (VPP) to communicate with VM over the +vhost-user interfaces, a nested VM is created on SUT1 and/or SUT2 for the +duration of these particular test cases only. DUT (VPP) test topology with VM +is shown in the figure below including the applicable packet flow thru the VM +(marked in the figure with ``***``). + +:: + + +------------------------+ +------------------------+ + | +----------+ | | +----------+ | + | | VM | | | | VM | | + | | ****** | | | | ****** | | + | +--^----^--+ | | +--^----^--+ | + | *| |* | | *| |* | + | +------v----v------+ | | +------v----v------+ | + | | * * |**|***********|**| * * | | + | | ***** *******<----------------->******* ***** | | + | | * DUT1 | | | | DUT2 * | | + | +--^---------------+ | | +---------------^--+ | + | *| | | |* | + | *| SUT1 | | SUT2 |* | + +------------------------+ +------------------^-----+ + *| |* + *| |* + *| +-----------+ |* + *| | | |* + *+------------------> TG <------------------+* + ******************* | |******************** + +-----------+ + +NSH_SFC Functional Tests Coverage +--------------------------------- + +Following NSH_SFC functional test areas are covered in the CSIT |release| with +results listed in this report: + +- TODO + + diff --git a/docs/report/nsh_sfc_functional_tests/test_environment.rst b/docs/report/nsh_sfc_functional_tests/test_environment.rst new file mode 100644 index 0000000000..79ca0e90c7 --- /dev/null +++ b/docs/report/nsh_sfc_functional_tests/test_environment.rst @@ -0,0 +1,440 @@ +Test Environment +================ + +CSIT NSH_SFC functional tests are currently executed in FD.IO VIRL testbed. The +physical VIRL testbed infrastructure consists of three identical VIRL hosts: + +- All hosts are Cisco UCS C240-M4 (2x Intel(R) Xeon(R) CPU E5-2699 v3 @2.30GHz, + 18c, 512GB RAM) +- Hosts run Ubuntu 14.04.3 +- VIRL software versions: + + - STD server version 0.10.24.7 + - UWM server version 0.10.24.7 + +The VIRL host to run VIRL simulation is selected based on least load algorithm +per VIRL simulation. + +Every VIRL simulation uses the same three-node - Traffic Generator (TG node) and +two Systems Under Test (SUT1 and SUT2) - "double-ring" topology. The appropriate +pre-built VPP packages built by Jenkins for the patch under review are then +installed on the two SUTs, along with their /etc/vpp/startup.conf file, in all +VIRL simulations. + +SUT Configuration - VIRL Guest VM +--------------------------------- + +Configuration of the SUT VMs is defined in file + + /csit/resources/tools/virl/topologies/double-ring-nested.xenial.virl + +- List of SUT VM interfaces::: + + + + + + +- Number of 2MB hugepages: 1024 + +- Maximum number of memory map areas: 20000 + +- Kernel Shared Memory Max: 2147483648 (vm.nr_hugepages * 2 * 1024 * 1024) + +SUT Configuration - VIRL Guest OS Linux +--------------------------------------- + +In CSIT terminology, the VM operating system for both SUTs that |vpp-release| has +been tested with, is the following: + +**#. Ubuntu VIRL image** + +This image implies Ubuntu 16.04.1 LTS, current as of yyyy-mm-dd (that is, +package versions are those that would have been installed by a "apt-get update", +"apt-get upgrade" on that day), produced by CSIT disk image build scripts. + +The exact list of installed packages and their versions (including the Linux +kernel package version) are included in CSIT source repository: + + resources/tools/disk-image-builder/ubuntu/lists/|virl-image-ubuntu| + +A replica of this VM image can be built by running the "build.sh" script in CSIT +repository resources/tools/disk-image-builder/ubuntu. + +**#. CentOS VIRL image** + +The Centos7.3 image is ready to be used but no tests running on it now. +Corresponding Jenkins jobs are under preparation. + +The exact list of installed packages and their versions (including the Linux +kernel package version) are included in CSIT source repository: + + resources/tools/disk-image-builder/ubuntu/lists/|virl-image-centos| + +A replica of this VM image can be built by running the "build.sh" script in CSIT +repository resources/tools/disk-image-builder/centos. + +**#. Nested VM image** + +In addition to the "main" VM image, tests which require VPP to communicate to a +VM over a vhost-user interface, utilize a "nested" VM image. + +This "nested" VM is dynamically created and destroyed as part of a test case, +and therefore the "nested" VM image is optimized to be small, lightweight and +have a short boot time. The "nested" VM image is not built around any +established Linux distribution, but is based on `BuildRoot +`_, a tool for building embedded Linux systems. Just as +for the "main" image, scripts to produce an identical replica of the "nested" +image are included in CSIT GIT repository, and the image can be rebuilt using +the "build.sh" script at: + + resources/tools/disk-image-builder/ubuntu/lists/nested + +DUT Configuration - VPP +----------------------- + +Every System Under Test runs VPP SW application in Linux user-mode as a Device +Under Test (DUT) node. + +**DUT port configuration** + +Port configuration of DUTs is defined in topology file that is generated per +VIRL simulation based on the definition stored in file + + /csit/resources/tools/virl/topologies/double-ring-nested.xenial.yaml + +Example of DUT nodes configuration::: + + DUT1: + type: DUT + host: "10.30.51.157" + port: 22 + username: cisco + honeycomb: + user: admin + passwd: admin + port: 8183 + netconf_port: 2831 + priv_key: | + -----BEGIN RSA PRIVATE KEY----- + MIIEpgIBAAKCAQEAwUDlTpzSHpwLQotZOFS4AgcPNEWCnP1AB2hWFmvI+8Kah/gb + v8ruZU9RqhPs56tyKzxbhvNkY4VbH5F1GilHZu3mLqzM4KfghMmaeMEjO1T7BYYd + vuBfTvIluljfQ2vAlnYrDwn+ClxJk81m0pDgvrLEX4qVVh2sGh7UEkYy5r82DNa2 + 4VjzPB1J/c8a9zP8FoZUhYIzF4FLvRMjUADpbMXgJMsGpaZLmz95ap0Eot7vb1Cc + 1LvF97iyBCrtIOSKRKA50ZhLGjMKmOwnYU+cP5718tbproDVi6VJOo7zeuXyetMs + 8YBl9kWblWG9BqP9jctFvsmi5G7hXgq1Y8u+DwIDAQABAoIBAQC/W4E0DHjLMny7 + 0bvw2YKzD0Zw3fttdB94tkm4PdZv5MybooPnsAvLaXVV0hEdfVi5kzSWNl/LY/tN + EP1BgGphc2QgB59/PPxGwFIjDCvUzlsZpynBHe+B/qh5ExNQcVvsIOqWI7DXlXaN + 0i/khOzmJ6HncRRah1spKimYRsaUUDskyg7q3QqMWVaqBbbMvLs/w7ZWd/zoDqCU + MY/pCI6hkB3QbRo0OdiZLohphBl2ShABTwjvVyyKL5UA4jAEneJrhH5gWVLXnfgD + p62W5CollKEYblC8mUkPxpP7Qo277zw3xaq+oktIZhc5SUEUd7nJZtNqVAHqkItW + 79VmpKyxAoGBAPfU+kqNPaTSvp+x1n5sn2SgipzDtgi9QqNmC4cjtrQQaaqI57SG + OHw1jX8i7L2G1WvVtkHg060nlEVo5n65ffFOqeVBezLVJ7ghWI8U+oBiJJyQ4boD + GJVNsoOSUQ0rtuGd9eVwfDk3ol9aCN0KK53oPfIYli29pyu4l095kg11AoGBAMef + bPEMBI/2XmCPshLSwhGFl+dW8d+Klluj3CUQ/0vUlvma3dfBOYNsIwAgTP0iIUTg + 8DYE6KBCdPtxAUEI0YAEAKB9ry1tKR2NQEIPfslYytKErtwjAiqSi0heM6+zwEzu + f54Z4oBhsMSL0jXoOMnu+NZzEc6EUdQeY4O+jhjzAoGBAIogC3dtjMPGKTP7+93u + UE/XIioI8fWg9fj3sMka4IMu+pVvRCRbAjRH7JrFLkjbUyuMqs3Arnk9K+gbdQt/ + +m95Njtt6WoFXuPCwgbM3GidSmZwYT4454SfDzVBYScEDCNm1FuR+8ov9bFLDtGT + D4gsngnGJj1MDFXTxZEn4nzZAoGBAKCg4WmpUPaCuXibyB+rZavxwsTNSn2lJ83/ + sYJGBhf/raiV/FLDUcM1vYg5dZnu37RsB/5/vqxOLZGyYd7x+Jo5HkQGPnKgNwhn + g8BkdZIRF8uEJqxOo0ycdOU7n/2O93swIpKWo5LIiRPuqqzj+uZKnAL7vuVdxfaY + qVz2daMPAoGBALgaaKa3voU/HO1PYLWIhFrBThyJ+BQSQ8OqrEzC8AnegWFxRAM8 + EqrzZXl7ACUuo1dH0Eipm41j2+BZWlQjiUgq5uj8+yzy+EU1ZRRyJcOKzbDACeuD + BpWWSXGBI5G4CppeYLjMUHZpJYeX1USULJQd2c4crLJKb76E8gz3Z9kN + -----END RSA PRIVATE KEY----- + + interfaces: + port1: + mac_address: "fa:16:3e:9b:89:52" + pci_address: "0000:00:04.0" + link: link1 + port2: + mac_address: "fa:16:3e:7a:33:60" + pci_address: "0000:00:05.0" + link: link4 + port3: + mac_address: "fa:16:3e:29:b7:ae" + pci_address: "0000:00:06.0" + link: link3 + port4: + mac_address: "fa:16:3e:76:8d:ff" + pci_address: "0000:00:07.0" + link: link6 + DUT2: + type: DUT + host: "10.30.51.156" + port: 22 + username: cisco + honeycomb: + user: admin + passwd: admin + port: 8183 + netconf_port: 2831 + priv_key: | + -----BEGIN RSA PRIVATE KEY----- + MIIEpgIBAAKCAQEAwUDlTpzSHpwLQotZOFS4AgcPNEWCnP1AB2hWFmvI+8Kah/gb + v8ruZU9RqhPs56tyKzxbhvNkY4VbH5F1GilHZu3mLqzM4KfghMmaeMEjO1T7BYYd + vuBfTvIluljfQ2vAlnYrDwn+ClxJk81m0pDgvrLEX4qVVh2sGh7UEkYy5r82DNa2 + 4VjzPB1J/c8a9zP8FoZUhYIzF4FLvRMjUADpbMXgJMsGpaZLmz95ap0Eot7vb1Cc + 1LvF97iyBCrtIOSKRKA50ZhLGjMKmOwnYU+cP5718tbproDVi6VJOo7zeuXyetMs + 8YBl9kWblWG9BqP9jctFvsmi5G7hXgq1Y8u+DwIDAQABAoIBAQC/W4E0DHjLMny7 + 0bvw2YKzD0Zw3fttdB94tkm4PdZv5MybooPnsAvLaXVV0hEdfVi5kzSWNl/LY/tN + EP1BgGphc2QgB59/PPxGwFIjDCvUzlsZpynBHe+B/qh5ExNQcVvsIOqWI7DXlXaN + 0i/khOzmJ6HncRRah1spKimYRsaUUDskyg7q3QqMWVaqBbbMvLs/w7ZWd/zoDqCU + MY/pCI6hkB3QbRo0OdiZLohphBl2ShABTwjvVyyKL5UA4jAEneJrhH5gWVLXnfgD + p62W5CollKEYblC8mUkPxpP7Qo277zw3xaq+oktIZhc5SUEUd7nJZtNqVAHqkItW + 79VmpKyxAoGBAPfU+kqNPaTSvp+x1n5sn2SgipzDtgi9QqNmC4cjtrQQaaqI57SG + OHw1jX8i7L2G1WvVtkHg060nlEVo5n65ffFOqeVBezLVJ7ghWI8U+oBiJJyQ4boD + GJVNsoOSUQ0rtuGd9eVwfDk3ol9aCN0KK53oPfIYli29pyu4l095kg11AoGBAMef + bPEMBI/2XmCPshLSwhGFl+dW8d+Klluj3CUQ/0vUlvma3dfBOYNsIwAgTP0iIUTg + 8DYE6KBCdPtxAUEI0YAEAKB9ry1tKR2NQEIPfslYytKErtwjAiqSi0heM6+zwEzu + f54Z4oBhsMSL0jXoOMnu+NZzEc6EUdQeY4O+jhjzAoGBAIogC3dtjMPGKTP7+93u + UE/XIioI8fWg9fj3sMka4IMu+pVvRCRbAjRH7JrFLkjbUyuMqs3Arnk9K+gbdQt/ + +m95Njtt6WoFXuPCwgbM3GidSmZwYT4454SfDzVBYScEDCNm1FuR+8ov9bFLDtGT + D4gsngnGJj1MDFXTxZEn4nzZAoGBAKCg4WmpUPaCuXibyB+rZavxwsTNSn2lJ83/ + sYJGBhf/raiV/FLDUcM1vYg5dZnu37RsB/5/vqxOLZGyYd7x+Jo5HkQGPnKgNwhn + g8BkdZIRF8uEJqxOo0ycdOU7n/2O93swIpKWo5LIiRPuqqzj+uZKnAL7vuVdxfaY + qVz2daMPAoGBALgaaKa3voU/HO1PYLWIhFrBThyJ+BQSQ8OqrEzC8AnegWFxRAM8 + EqrzZXl7ACUuo1dH0Eipm41j2+BZWlQjiUgq5uj8+yzy+EU1ZRRyJcOKzbDACeuD + BpWWSXGBI5G4CppeYLjMUHZpJYeX1USULJQd2c4crLJKb76E8gz3Z9kN + -----END RSA PRIVATE KEY----- + + interfaces: + port1: + mac_address: "fa:16:3e:ad:6c:7d" + pci_address: "0000:00:04.0" + link: link2 + port2: + mac_address: "fa:16:3e:94:a4:99" + pci_address: "0000:00:05.0" + link: link5 + port3: + mac_address: "fa:16:3e:75:92:da" + pci_address: "0000:00:06.0" + link: link3 + port4: + mac_address: "fa:16:3e:2c:b1:2a" + pci_address: "0000:00:07.0" + link: link6 + +**VPP Version** + +|vpp-release| + +**VPP Installed Packages** +:: + + $ dpkg -l vpp\* + Desired=Unknown/Install/Remove/Purge/Hold + | Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend + |/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad) + ||/ Name Version Architecture Description + +++-==============-=============-============-============================================= + ii vpp 17.07-release amd64 Vector Packet Processing--executables + ii vpp-dbg 17.07-release amd64 Vector Packet Processing--debug symbols + ii vpp-dev 17.07-release amd64 Vector Packet Processing--development support + ii vpp-dpdk-dev 17.07-release amd64 Vector Packet Processing--development support + ii vpp-dpdk-dkms 17.07-release amd64 DPDK 2.1 igb_uio_driver + ii vpp-lib 17.07-release amd64 Vector Packet Processing--runtime libraries + ii vpp-plugins 17.07-release amd64 Vector Packet Processing--runtime plugins + +**VPP Startup Configuration** + +VPP startup configuration is common for all test cases. + +:: + + $ cat /etc/vpp/startup.conf + unix { + nodaemon + log /tmp/vpp.log + full-coredump + } + + api-trace { + on + } + + api-segment { + gid vpp + } + + cpu { + ## In the VPP there is one main thread and optionally the user can create worker(s) + ## The main thread and worker thread(s) can be pinned to CPU core(s) manually or automatically + + ## Manual pinning of thread(s) to CPU core(s) + + ## Set logical CPU core where main thread runs + # main-core 1 + + ## Set logical CPU core(s) where worker threads are running + # corelist-workers 2-3,18-19 + + ## Automatic pinning of thread(s) to CPU core(s) + + ## Sets number of CPU core(s) to be skipped (1 ... N-1) + ## Skipped CPU core(s) are not used for pinning main thread and working thread(s). + ## The main thread is automatically pinned to the first available CPU core and worker(s) + ## are pinned to next free CPU core(s) after core assigned to main thread + # skip-cores 4 + + ## Specify a number of workers to be created + ## Workers are pinned to N consecutive CPU cores while skipping "skip-cores" CPU core(s) + ## and main thread's CPU core + # workers 2 + + ## Set scheduling policy and priority of main and worker threads + + ## Scheduling policy options are: other (SCHED_OTHER), batch (SCHED_BATCH) + ## idle (SCHED_IDLE), fifo (SCHED_FIFO), rr (SCHED_RR) + # scheduler-policy fifo + + ## Scheduling priority is used only for "real-time policies (fifo and rr), + ## and has to be in the range of priorities supported for a particular policy + # scheduler-priority 50 + } + + dpdk { + ## Change default settings for all intefaces + # dev default { + ## Number of receive queues, enables RSS + ## Default is 1 + # num-rx-queues 3 + + ## Number of transmit queues, Default is equal + ## to number of worker threads or 1 if no workers treads + # num-tx-queues 3 + + ## Number of descriptors in transmit and receive rings + ## increasing or reducing number can impact performance + ## Default is 1024 for both rx and tx + # num-rx-desc 512 + # num-tx-desc 512 + + ## VLAN strip offload mode for interface + ## Default is off + # vlan-strip-offload on + # } + + ## Whitelist specific interface by specifying PCI address + # dev 0000:02:00.0 + + ## Whitelist specific interface by specifying PCI address and in + ## addition specify custom parameters for this interface + # dev 0000:02:00.1 { + # num-rx-queues 2 + # } + + ## Change UIO driver used by VPP, Options are: uio_pci_generic, vfio-pci + ## and igb_uio (default) + # uio-driver uio_pci_generic + + ## Disable mutli-segment buffers, improves performance but + ## disables Jumbo MTU support + # no-multi-seg + + ## Increase number of buffers allocated, needed only in scenarios with + ## large number of interfaces and worker threads. Value is per CPU socket. + ## Default is 32768 + # num-mbufs 128000 + + ## Change hugepages allocation per-socket, needed only if there is need for + ## larger number of mbufs. Default is 256M on each detected CPU socket + # socket-mem 2048,2048 + } + +TG Configuration +---------------- + +Traffic Generator node is VM running the same OS Linux as SUTs. Ports of this +VM are used as source (Tx) and destination (Rx) ports for the traffic. + +Traffic scripts of test cases are executed on this VM. + +**TG VM configuration** + +Configuration of the TG VMs is defined in file + + /csit/resources/tools/virl/topologies/double-ring-nested.xenial.virl + +- List of TG VM interfaces::: + + + + + + + + +**TG node port configuration** + +Port configuration of TG is defined in topology file that is generated per VIRL +simulation based on the definition stored in file + + /csit/resources/tools/virl/topologies/double-ring-nested.xenial.yaml + +Example of TG node configuration::: + + TG: + type: TG + host: "10.30.51.155" + port: 22 + username: cisco + priv_key: | + -----BEGIN RSA PRIVATE KEY----- + MIIEpgIBAAKCAQEAwUDlTpzSHpwLQotZOFS4AgcPNEWCnP1AB2hWFmvI+8Kah/gb + v8ruZU9RqhPs56tyKzxbhvNkY4VbH5F1GilHZu3mLqzM4KfghMmaeMEjO1T7BYYd + vuBfTvIluljfQ2vAlnYrDwn+ClxJk81m0pDgvrLEX4qVVh2sGh7UEkYy5r82DNa2 + 4VjzPB1J/c8a9zP8FoZUhYIzF4FLvRMjUADpbMXgJMsGpaZLmz95ap0Eot7vb1Cc + 1LvF97iyBCrtIOSKRKA50ZhLGjMKmOwnYU+cP5718tbproDVi6VJOo7zeuXyetMs + 8YBl9kWblWG9BqP9jctFvsmi5G7hXgq1Y8u+DwIDAQABAoIBAQC/W4E0DHjLMny7 + 0bvw2YKzD0Zw3fttdB94tkm4PdZv5MybooPnsAvLaXVV0hEdfVi5kzSWNl/LY/tN + EP1BgGphc2QgB59/PPxGwFIjDCvUzlsZpynBHe+B/qh5ExNQcVvsIOqWI7DXlXaN + 0i/khOzmJ6HncRRah1spKimYRsaUUDskyg7q3QqMWVaqBbbMvLs/w7ZWd/zoDqCU + MY/pCI6hkB3QbRo0OdiZLohphBl2ShABTwjvVyyKL5UA4jAEneJrhH5gWVLXnfgD + p62W5CollKEYblC8mUkPxpP7Qo277zw3xaq+oktIZhc5SUEUd7nJZtNqVAHqkItW + 79VmpKyxAoGBAPfU+kqNPaTSvp+x1n5sn2SgipzDtgi9QqNmC4cjtrQQaaqI57SG + OHw1jX8i7L2G1WvVtkHg060nlEVo5n65ffFOqeVBezLVJ7ghWI8U+oBiJJyQ4boD + GJVNsoOSUQ0rtuGd9eVwfDk3ol9aCN0KK53oPfIYli29pyu4l095kg11AoGBAMef + bPEMBI/2XmCPshLSwhGFl+dW8d+Klluj3CUQ/0vUlvma3dfBOYNsIwAgTP0iIUTg + 8DYE6KBCdPtxAUEI0YAEAKB9ry1tKR2NQEIPfslYytKErtwjAiqSi0heM6+zwEzu + f54Z4oBhsMSL0jXoOMnu+NZzEc6EUdQeY4O+jhjzAoGBAIogC3dtjMPGKTP7+93u + UE/XIioI8fWg9fj3sMka4IMu+pVvRCRbAjRH7JrFLkjbUyuMqs3Arnk9K+gbdQt/ + +m95Njtt6WoFXuPCwgbM3GidSmZwYT4454SfDzVBYScEDCNm1FuR+8ov9bFLDtGT + D4gsngnGJj1MDFXTxZEn4nzZAoGBAKCg4WmpUPaCuXibyB+rZavxwsTNSn2lJ83/ + sYJGBhf/raiV/FLDUcM1vYg5dZnu37RsB/5/vqxOLZGyYd7x+Jo5HkQGPnKgNwhn + g8BkdZIRF8uEJqxOo0ycdOU7n/2O93swIpKWo5LIiRPuqqzj+uZKnAL7vuVdxfaY + qVz2daMPAoGBALgaaKa3voU/HO1PYLWIhFrBThyJ+BQSQ8OqrEzC8AnegWFxRAM8 + EqrzZXl7ACUuo1dH0Eipm41j2+BZWlQjiUgq5uj8+yzy+EU1ZRRyJcOKzbDACeuD + BpWWSXGBI5G4CppeYLjMUHZpJYeX1USULJQd2c4crLJKb76E8gz3Z9kN + -----END RSA PRIVATE KEY----- + + interfaces: + port3: + mac_address: "fa:16:3e:b9:e1:27" + pci_address: "0000:00:06.0" + link: link1 + driver: virtio-pci + port4: + mac_address: "fa:16:3e:e9:c8:68" + pci_address: "0000:00:07.0" + link: link4 + driver: virtio-pci + port5: + mac_address: "fa:16:3e:e8:d3:47" + pci_address: "0000:00:08.0" + link: link2 + driver: virtio-pci + port6: + mac_address: "fa:16:3e:cf:ca:58" + pci_address: "0000:00:09.0" + link: link5 + driver: virtio-pci + +**Traffic generator** + +Functional tests utilize Scapy as a traffic generator. There was used Scapy +v2.3.1 for |vpp-release| tests. + diff --git a/docs/report/vpp_functional_tests/csit_release_notes.rst b/docs/report/vpp_functional_tests/csit_release_notes.rst index 4b682209d6..afd2a68cfa 100644 --- a/docs/report/vpp_functional_tests/csit_release_notes.rst +++ b/docs/report/vpp_functional_tests/csit_release_notes.rst @@ -6,19 +6,19 @@ Changes in CSIT |release| #. VPP functional test environment changes - - Implemented VAT command history collection for every test case as part of teardown. - - Introduction of Centos7 tests in VIRL environment. + - Implemented VAT command history collection for every test case as part of teardown. + - Introduction of Centos7 tests in VIRL environment. #. VPP functional test framework changes - - Added VAT command history collection for every test case as part of teardown. + - Added VAT command history collection for every test case as part of teardown. #. Added VPP functional tests - - IPv4 routed-forwarding with dot1q VLAN sub-interfaces. - - L2BD switched-forwarding with dot1q VLAN sub-interfaces and vhost-user to VM. - - IPv4 routed-forwarding with vhost-user interfaces to VM. - - Vhost-user interface re-connect tests. + - IPv4 routed-forwarding with dot1q VLAN sub-interfaces. + - L2BD switched-forwarding with dot1q VLAN sub-interfaces and vhost-user to VM. + - IPv4 routed-forwarding with vhost-user interfaces to VM. + - Vhost-user interface re-connect tests. Known Issues ------------ diff --git a/docs/report/vpp_functional_tests/overview.rst b/docs/report/vpp_functional_tests/overview.rst index a6de3f3282..e8f8460d34 100644 --- a/docs/report/vpp_functional_tests/overview.rst +++ b/docs/report/vpp_functional_tests/overview.rst @@ -135,20 +135,20 @@ CSIT |release| follows a common structured naming convention for all performance and system functional tests, introduced in CSIT |release-1|. The naming should be intuitive for majority of the tests. Complete -description of CSIT test naming convention is provided on `CSIT test naming -page `_. +description of CSIT test naming convention is provided on +`CSIT test naming wiki page `_. Here few illustrative examples of the new naming usage for functional test suites: #. **Physical port to physical port - a.k.a. NIC-to-NIC, Phy-to-Phy, P2P** - - *eth2p-ethip4-ip4base-func.robot* => 2 ports of Ethernet, IPv4 baseline - routed forwarding, functional tests. + - *eth2p-ethip4-ip4base-func.robot* => 2 ports of Ethernet, IPv4 baseline + routed forwarding, functional tests. #. **Physical port to VM (or VM chain) to physical port - a.k.a. NIC2VM2NIC, P2V2P, NIC2VMchain2NIC, P2V2V2P** - - *eth2p-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-func.robot* => 2 ports of - Ethernet, IPv4 VXLAN Ethernet, L2 bridge-domain switching to/from two vhost - interfaces and one VM, functional tests. + - *eth2p-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-func.robot* => 2 ports of + Ethernet, IPv4 VXLAN Ethernet, L2 bridge-domain switching to/from two vhost + interfaces and one VM, functional tests. diff --git a/docs/report/vpp_functional_tests/test_environment.rst b/docs/report/vpp_functional_tests/test_environment.rst index 8add53189c..bd57558667 100644 --- a/docs/report/vpp_functional_tests/test_environment.rst +++ b/docs/report/vpp_functional_tests/test_environment.rst @@ -16,7 +16,7 @@ Whenever a patch is submitted to gerrit for review, parallel VIRL simulations are started to reduce the time of execution of all functional tests. The number of parallel VIRL simulations is equal to number of test groups defined by TEST_GROUPS variable in csit/bootstrap.sh file. The VIRL host to run VIRL -simulation is selected randomly per VIRL simulation. +simulation is selected based on least load algorithm per VIRL simulation. Every VIRL simulation uses the same three-node - Traffic Generator (TG node) and two Systems Under Test (SUT1 and SUT2) - "double-ring" topology. The appropriate @@ -50,7 +50,7 @@ SUT Configuration - VIRL Guest OS Linux In CSIT terminology, the VM operating system for both SUTs that |vpp-release| has been tested with, is the following: -**#. |virl-image-ubuntu|** +**#. Ubuntu VIRL image** This image implies Ubuntu 16.04.1 LTS, current as of yyyy-mm-dd (that is, package versions are those that would have been installed by a "apt-get update", @@ -64,7 +64,7 @@ kernel package version) are included in CSIT source repository: A replica of this VM image can be built by running the "build.sh" script in CSIT repository resources/tools/disk-image-builder/ubuntu. -**#. |virl-image-centos|** +**#. CentOS VIRL image** The Centos7.3 image is ready to be used but no tests running on it now. Corresponding Jenkins jobs are under preparation. @@ -85,8 +85,8 @@ VM over a vhost-user interface, utilize a "nested" VM image. This "nested" VM is dynamically created and destroyed as part of a test case, and therefore the "nested" VM image is optimized to be small, lightweight and have a short boot time. The "nested" VM image is not built around any -established Linux distribution, but is based on BuildRoot -(https://buildroot.org/), a tool for building embedded Linux systems. Just as +established Linux distribution, but is based on `BuildRoot +`_, a tool for building embedded Linux systems. Just as for the "main" image, scripts to produce an identical replica of the "nested" image are included in CSIT GIT repository, and the image can be rebuilt using the "build.sh" script at: @@ -146,7 +146,7 @@ Example of DUT nodes configuration::: EqrzZXl7ACUuo1dH0Eipm41j2+BZWlQjiUgq5uj8+yzy+EU1ZRRyJcOKzbDACeuD BpWWSXGBI5G4CppeYLjMUHZpJYeX1USULJQd2c4crLJKb76E8gz3Z9kN -----END RSA PRIVATE KEY----- - + interfaces: port1: mac_address: "fa:16:3e:9b:89:52" @@ -202,7 +202,7 @@ Example of DUT nodes configuration::: EqrzZXl7ACUuo1dH0Eipm41j2+BZWlQjiUgq5uj8+yzy+EU1ZRRyJcOKzbDACeuD BpWWSXGBI5G4CppeYLjMUHZpJYeX1USULJQd2c4crLJKb76E8gz3Z9kN -----END RSA PRIVATE KEY----- - + interfaces: port1: mac_address: "fa:16:3e:ad:6c:7d" @@ -245,6 +245,7 @@ Example of DUT nodes configuration::: **VPP Startup Configuration** VPP startup configuration is common for all test cases. + :: $ cat /etc/vpp/startup.conf @@ -253,95 +254,95 @@ VPP startup configuration is common for all test cases. log /tmp/vpp.log full-coredump } - + api-trace { on } - + api-segment { gid vpp } - + cpu { ## In the VPP there is one main thread and optionally the user can create worker(s) ## The main thread and worker thread(s) can be pinned to CPU core(s) manually or automatically - + ## Manual pinning of thread(s) to CPU core(s) - + ## Set logical CPU core where main thread runs # main-core 1 - + ## Set logical CPU core(s) where worker threads are running # corelist-workers 2-3,18-19 - + ## Automatic pinning of thread(s) to CPU core(s) - + ## Sets number of CPU core(s) to be skipped (1 ... N-1) ## Skipped CPU core(s) are not used for pinning main thread and working thread(s). ## The main thread is automatically pinned to the first available CPU core and worker(s) ## are pinned to next free CPU core(s) after core assigned to main thread # skip-cores 4 - + ## Specify a number of workers to be created ## Workers are pinned to N consecutive CPU cores while skipping "skip-cores" CPU core(s) ## and main thread's CPU core # workers 2 - + ## Set scheduling policy and priority of main and worker threads - + ## Scheduling policy options are: other (SCHED_OTHER), batch (SCHED_BATCH) ## idle (SCHED_IDLE), fifo (SCHED_FIFO), rr (SCHED_RR) # scheduler-policy fifo - + ## Scheduling priority is used only for "real-time policies (fifo and rr), ## and has to be in the range of priorities supported for a particular policy # scheduler-priority 50 } - + dpdk { ## Change default settings for all intefaces # dev default { ## Number of receive queues, enables RSS ## Default is 1 # num-rx-queues 3 - + ## Number of transmit queues, Default is equal ## to number of worker threads or 1 if no workers treads # num-tx-queues 3 - + ## Number of descriptors in transmit and receive rings ## increasing or reducing number can impact performance ## Default is 1024 for both rx and tx # num-rx-desc 512 # num-tx-desc 512 - + ## VLAN strip offload mode for interface ## Default is off # vlan-strip-offload on # } - + ## Whitelist specific interface by specifying PCI address # dev 0000:02:00.0 - + ## Whitelist specific interface by specifying PCI address and in ## addition specify custom parameters for this interface # dev 0000:02:00.1 { # num-rx-queues 2 # } - + ## Change UIO driver used by VPP, Options are: uio_pci_generic, vfio-pci ## and igb_uio (default) # uio-driver uio_pci_generic - + ## Disable mutli-segment buffers, improves performance but ## disables Jumbo MTU support # no-multi-seg - + ## Increase number of buffers allocated, needed only in scenarios with ## large number of interfaces and worker threads. Value is per CPU socket. ## Default is 32768 # num-mbufs 128000 - + ## Change hugepages allocation per-socket, needed only if there is need for ## larger number of mbufs. Default is 256M on each detected CPU socket # socket-mem 2048,2048 @@ -360,7 +361,7 @@ Traffic scripts of test cases are executed on this VM. Configuration of the TG VMs is defined in file /csit/resources/tools/virl/topologies/double-ring-nested.xenial.virl - + - List of TG VM interfaces::: @@ -412,7 +413,7 @@ Example of TG node configuration::: EqrzZXl7ACUuo1dH0Eipm41j2+BZWlQjiUgq5uj8+yzy+EU1ZRRyJcOKzbDACeuD BpWWSXGBI5G4CppeYLjMUHZpJYeX1USULJQd2c4crLJKb76E8gz3Z9kN -----END RSA PRIVATE KEY----- - + interfaces: port3: mac_address: "fa:16:3e:b9:e1:27" diff --git a/docs/report/vpp_performance_tests/csit_release_notes.rst b/docs/report/vpp_performance_tests/csit_release_notes.rst index 725b40bee2..ff992df896 100644 --- a/docs/report/vpp_performance_tests/csit_release_notes.rst +++ b/docs/report/vpp_performance_tests/csit_release_notes.rst @@ -6,44 +6,34 @@ Changes in CSIT |release| #. VPP performance test environment changes - - Further optimizations of VM and vhost-user test environment - Qemu virtio - queue size increased from default value of 256 to 1024. - - Addition of HW cryptodev devices - Intel QAT 8950 50G - in all three - LF FD.io physical testbeds. + - Further optimizations of VM and vhost-user test environment - various + Qemu virtio queue size testing with value of 256 and 1024. Applied + Linux CFS optimization to run VPP worker threads and Qemu worker threads + with highest priority. #. VPP performance test framework changes - - Added VAT command history collection for every test case as part of - teardown. + - Full code review, optimization and refactor. -#. Added VPP performance tests - - - **CGNAT** - - - Carrier Grade Network Address Translation tests with varying number - of users and ports per user: 1u-15p, 10u-15p, 100u-15p, 1000u-15p, - 2000u-15p, 4000u-15p - with Intel x520 NIC. +#. T-rex changes - - **vhost-user tests with one VM** + - Full refactor of T-rex driver and introduce of traffic profiles that + improves readability, manageability of traffic profiles for various + test scenarios. - - L2 Bridge Domain switched-forwarding with Intel x710 NIC, Intel x520 - NIC, Intel xl710 NIC. - - VXLAN and L2 Bridge Domain switched-forwarding with Intel x520 NIC. +#. Added VPP performance tests - - **vhost-user tests with two VMs service chain** + - **LXC memif** - - L2 cross-connect switched-forwarding with Intel x520 NIC, Intel xl710 - NIC. - - L2 Bridge Domain switched-forwarding with Intel x520 NIC, Intel xl710 - NIC. - - IPv4 routed-forwarding with Intel x520 NIC, Intel xl710 NIC. + - Memif interface tests interconnecting two VPP instances on single SUT. + Master VPP instance running on native OS with Intel x520 NIC and guest + VPP instance running in Linux Container (LXC) doing the L2 cross + connect loop. LXC running in privileged mode is pinned to dedicated + cores. All VPP instances are same version. - - **IPSec encryption with** + - **Stateful Security Groups** - - AES-GCM, CBC-SHA1 ciphers, in combination with IPv4 routed-forwarding - with Intel xl710 NIC. - - CBC-SHA1 ciphers, in combination with LISP-GPE overlay tunneling for - IPv4-over-IPv4 with Intel xl710 NIC. + - **VM vhost use cases** Performance Improvements ------------------------ @@ -59,62 +49,56 @@ NDR Throughput Non-Drop Rate Throughput discovery tests: -+-------------------+-----------------------------------------------------------------+------------+-----------+-----------+-----------------+ -| VPP Functionality | Test Name | VPP-16.09 | VPP-17.01 | VPP-17.04 | 17.01 to 17.04 | -| | | [Mpps] | [Mpps] | [Mpps] | Relative Change | -+===================+=================================================================+============+===========+===========+=================+ -| L2XC-vhost-VM | 10ge2p1x520: 64B-1t1c-eth-l2xcbase-eth-2vhost-1vm-ndrdisc | 0.5 | 2.8 | 3.4 | 21% | -+-------------------+-----------------------------------------------------------------+------------+-----------+-----------+-----------------+ -| L2BD-vhost-VM | 10ge2p1x520: 64B-1t1c-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc | 0.4 | 2.7 | 3.1 | 15% | -+-------------------+-----------------------------------------------------------------+------------+-----------+-----------+-----------------+ -| IPv4 vhost | 10ge2p1x520: 64B-1t1c-ethip4-ip4base-eth-2vhost-1vm-ndrdisc | 0.3 | 2.6 | 3.0 | 15% | -+-------------------+-----------------------------------------------------------------+------------+-----------+-----------+-----------------+ -| IPv4 LISP | 10ge2p1x520: 64B-1t1c-ethip4lispip4-ip4base-ndrdisc | 4.4 | 4.8 | 5.5 | 15% | -+-------------------+-----------------------------------------------------------------+------------+-----------+-----------+-----------------+ -| IPv6 | 10ge2p1x520: 78B-1t1c-ethip6-ip6base-ndrdisc | 3.0 | 7.3 | 8.1 | 11% | -+-------------------+-----------------------------------------------------------------+------------+-----------+-----------+-----------------+ -| IPv6 COP | 10ge2p1x520: 78B-1t1c-ethip6-ip6base-copwhtlistbase-ndrdisc | 6.1 | 6.1 | 6.9 | 13% | -+-------------------+-----------------------------------------------------------------+------------+-----------+-----------+-----------------+ -| IPv6 iAcl | 10ge2p1x520: 78B-1t1c-ethip6-ip6base-iacldstbase-ndrdisc | 6.5 | 6.1 | 6.9 | 13% | -+-------------------+-----------------------------------------------------------------+------------+-----------+-----------+-----------------+ -| IPv6 FIB 2M | 10ge2p1x520: 78B-1t1c-ethip6-ip6scale2m-ndrdisc | 5.3 | 4.2 | 4.6 | 10% | -+-------------------+-----------------------------------------------------------------+------------+-----------+-----------+-----------------+ ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ +| VPP Functionality | Test Name | VPP-16.09 | VPP-17.01 | VPP-17.04 | VPP-17.07 | 17.04 to 17.07 | +| | | [Mpps] | [Mpps] | [Mpps] | [Mpps] | Relative Change | ++===================+=================================================================+===========+===========+===========+===========+=================+ +| L2XC-vhost-VM | 10ge2p1x520: 64B-1t1c-eth-l2xcbase-eth-2vhost-1vm-ndrdisc | 0.5 | 2.8 | 3.4 | | ??% | ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ +| L2BD-vhost-VM | 10ge2p1x520: 64B-1t1c-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc | 0.4 | 2.7 | 3.1 | | ??% | ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ +| IPv4 vhost | 10ge2p1x520: 64B-1t1c-ethip4-ip4base-eth-2vhost-1vm-ndrdisc | 0.3 | 2.6 | 3.0 | | ??% | ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ +| IPv4 LISP | 10ge2p1x520: 64B-1t1c-ethip4lispip4-ip4base-ndrdisc | 4.4 | 4.8 | 5.5 | | ??% | ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ +| IPv6 | 10ge2p1x520: 78B-1t1c-ethip6-ip6base-ndrdisc | 3.0 | 7.3 | 8.1 | | ??% | ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ +| IPv6 COP | 10ge2p1x520: 78B-1t1c-ethip6-ip6base-copwhtlistbase-ndrdisc | 6.1 | 6.1 | 6.9 | | ??% | ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ +| IPv6 iAcl | 10ge2p1x520: 78B-1t1c-ethip6-ip6base-iacldstbase-ndrdisc | 6.5 | 6.1 | 6.9 | | ??% | ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ +| IPv6 FIB 2M | 10ge2p1x520: 78B-1t1c-ethip6-ip6scale2m-ndrdisc | 5.3 | 4.2 | 4.6 | | ??% | ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ PDR Throughput ~~~~~~~~~~~~~~ Partial Drop Rate thoughput discovery tests with packet Loss Tolerance of 0.5%: -+-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------------+ -| VPP Functionality | Test Name | VPP-16.09 | VPP-17.01 | VPP-17.04 | 17.01 to 17.04 | -| | | [Mpps] | [Mpps] | [Mpps] | Relative Change | -+===================+=================================================================+===========+===========+===========+=================+ -| L2XC-vhost-VM | 10ge2p1x520: 64B-1t1c-eth-l2xcbase-eth-2vhost-1vm-pdrdisc | 2.6 | 3.2 | 3.7 | 15% | -+-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------------+ -| L2BD-vhost-VM | 10ge2p1x520: 64B-1t1c-eth-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc | 2.1 | 2.9 | 3.3 | 14% | -+-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------------+ -| IPv4 vhost | 10ge2p1x520: 64B-1t1c-ethip4-ip4base-eth-2vhost-1vm-pdrdisc | 2.0 | 2.7 | 3.0 | 11% | -+-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------------+ -| IPv4 LISP | 10ge2p1x520: 64B-1t1c-ethip4lispip4-ip4base-pdrdisc | 4.6 | 4.8 | 5.5 | 15% | -+-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------------+ -| IPv6 | 10ge2p1x520: 78B-1t1c-ethip6-ip6base-pdrdisc | 7.7 | 7.3 | 8.1 | 11% | -+-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------------+ -| IPv6 COP | 10ge2p1x520: 78B-1t1c-ethip6-ip6base-copwhtlistbase-pdrdisc | 6.1 | 6.1 | 6.9 | 13% | -+-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------------+ -| IPv6 iAcl | 10ge2p1x520: 78B-1t1c-ethip6-ip6base-iacldstbase-pdrdisc | 6.5 | 6.1 | 6.9 | 13% | -+-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------------+ -| IPv6 FIB 2M | 10ge2p1x520: 78B-1t1c-ethip6-ip6scale2m-pdrdisc | 5.3 | 4.2 | 4.6 | 10% | -+-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------------+ ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ +| VPP Functionality | Test Name | VPP-16.09 | VPP-17.01 | VPP-17.04 | VPP-17.07 | 17.04 to 17.07 | +| | | [Mpps] | [Mpps] | [Mpps] | [Mpps] | Relative Change | ++===================+=================================================================+===========+===========+===========+===========+=================+ +| L2XC-vhost-VM | 10ge2p1x520: 64B-1t1c-eth-l2xcbase-eth-2vhost-1vm-pdrdisc | 2.6 | 3.2 | 3.7 | | ??% | ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ +| L2BD-vhost-VM | 10ge2p1x520: 64B-1t1c-eth-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc | 2.1 | 2.9 | 3.3 | | ??% | ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ +| IPv4 vhost | 10ge2p1x520: 64B-1t1c-ethip4-ip4base-eth-2vhost-1vm-pdrdisc | 2.0 | 2.7 | 3.0 | | ??% | ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ +| IPv4 LISP | 10ge2p1x520: 64B-1t1c-ethip4lispip4-ip4base-pdrdisc | 4.6 | 4.8 | 5.5 | | ??% | ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ +| IPv6 | 10ge2p1x520: 78B-1t1c-ethip6-ip6base-pdrdisc | 7.7 | 7.3 | 8.1 | | ??% | ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ +| IPv6 COP | 10ge2p1x520: 78B-1t1c-ethip6-ip6base-copwhtlistbase-pdrdisc | 6.1 | 6.1 | 6.9 | | ??% | ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ +| IPv6 iAcl | 10ge2p1x520: 78B-1t1c-ethip6-ip6base-iacldstbase-pdrdisc | 6.5 | 6.1 | 6.9 | | ??% | ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ +| IPv6 FIB 2M | 10ge2p1x520: 78B-1t1c-ethip6-ip6scale2m-pdrdisc | 5.3 | 4.2 | 4.6 | | ??% | ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ Measured improvements are in line with VPP code optimizations listed in -`VPP-17.04 release notes -`_. - -Additionally, vhost-VM performance improvements are due to both VPP code -optimizations as well as due to the FD.io CSIT Linux KVM test environment -optimizations for vhost-VM tests - see section "2.1.7. Methodology: KVM VM -vhost". - +`VPP-17.07 release notes +`_. Other Performance Changes ------------------------- @@ -129,78 +113,78 @@ NDR Throughput Non-Drop Rate Throughput discovery tests: -+-------------------+-----------------------------------------------------------------+------------+-----------+-----------+-----------------+ -| VPP Functionality | Test Name | VPP-16.09 | VPP-17.01 | VPP-17.04 | 17.01 to 17.04 | -| | | [Mpps] | [Mpps] | [Mpps] | Relative Change | -+===================+=================================================================+============+===========+===========+=================+ -| L2XC | 10ge2p1x520: 64B-1t1c-eth-l2xcbase-ndrdisc | 9.4 | 12.7 | 13.1 | 3% | -+-------------------+-----------------------------------------------------------------+------------+-----------+-----------+-----------------+ -| L2XC | 10ge2p1xl710: 64B-1t1c-eth-l2xcbase-ndrdisc | 9.5 | 12.2 | 12.4 | 2% | -+-------------------+-----------------------------------------------------------------+------------+-----------+-----------+-----------------+ -| L2XC dot1ad | 10ge2p1x520: 64B-1t1c-dot1ad-l2xcbase-ndrdisc | 7.4 | 8.8 | 9.3 | 6% | -+-------------------+-----------------------------------------------------------------+------------+-----------+-----------+-----------------+ -| L2XC dot1q | 10ge2p1x520: 64B-1t1c-dot1q-l2xcbase-ndrdisc | 7.5 | 8.8 | 9.2 | 5% | -+-------------------+-----------------------------------------------------------------+------------+-----------+-----------+-----------------+ -| L2XC VxLAN | 10ge2p1x520: 64B-1t1c-ethip4vxlan-l2xcbase-ndrdisc | 5.4 | 6.5 | 6.8 | 5% | -+-------------------+-----------------------------------------------------------------+------------+-----------+-----------+-----------------+ -| L2BD | 10ge2p1x520: 64B-1t1c-eth-l2bdbasemaclrn-ndrdisc | 7.8 | 10.4 | 10.8 | 4% | -+-------------------+-----------------------------------------------------------------+------------+-----------+-----------+-----------------+ -| IPv4 | 10ge2p1x520: 64B-1t1c-ethip4-ip4base-ndrdisc | 8.7 | 9.7 | 10.6 | 9% | -+-------------------+-----------------------------------------------------------------+------------+-----------+-----------+-----------------+ -| IPv4 COP | 10ge2p1x520: 64B-1t1c-ethip4-ip4base-copwhtlistbase-ndrdisc | 7.1 | 8.3 | 9.0 | 8% | -+-------------------+-----------------------------------------------------------------+------------+-----------+-----------+-----------------+ -| IPv4 iAcl | 10ge2p1x520: 64B-1t1c-ethip4-ip4base-iacldstbase-ndrdisc | 6.9 | 7.6 | 8.3 | 9% | -+-------------------+-----------------------------------------------------------------+------------+-----------+-----------+-----------------+ -| IPv4 FIB 200k | 10ge2p1x520: 64B-1t1c-ethip4-ip4scale200k-ndrdisc | 8.5 | 9.0 | 9.7 | 8% | -+-------------------+-----------------------------------------------------------------+------------+-----------+-----------+-----------------+ -| IPv4 FIB 20k | 10ge2p1x520: 64B-1t1c-ethip4-ip4scale20k-ndrdisc | 8.5 | 9.0 | 9.7 | 8% | -+-------------------+-----------------------------------------------------------------+------------+-----------+-----------+-----------------+ -| IPv4 FIB 2M | 10ge2p1x520: 64B-1t1c-ethip4-ip4scale2m-ndrdisc | 8.5 | 7.8 | 8.1 | 4% | -+-------------------+-----------------------------------------------------------------+------------+-----------+-----------+-----------------+ -| IPv4 Policer | 10ge2p1x520: 64B-1t1c-ethip4-ip4base-ipolicemarkbase-ndrdisc | 6.9 | 7.4 | 8.1 | 9% | -+-------------------+-----------------------------------------------------------------+------------+-----------+-----------+-----------------+ -| IPv6 FIB 200k | 10ge2p1x520: 78B-1t1c-ethip6-ip6scale200k-ndrdisc | 6.5 | 5.3 | 5.3 | 0% | -+-------------------+-----------------------------------------------------------------+------------+-----------+-----------+-----------------+ -| IPv6 FIB 20k | 10ge2p1x520: 78B-1t1c-ethip6-ip6scale20k-ndrdisc | 6.9 | 6.5 | 6.9 | 6% | -+-------------------+-----------------------------------------------------------------+------------+-----------+-----------+-----------------+ ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ +| VPP Functionality | Test Name | VPP-16.09 | VPP-17.01 | VPP-17.04 | VPP-17.07 | 17.04 to 17.07 | +| | | [Mpps] | [Mpps] | [Mpps] | [Mpps] | Relative Change | ++===================+=================================================================+===========+===========+===========+===========+=================+ +| L2XC | 10ge2p1x520: 64B-1t1c-eth-l2xcbase-ndrdisc | 9.4 | 12.7 | 13.1 | | ?% | ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ +| L2XC | 10ge2p1xl710: 64B-1t1c-eth-l2xcbase-ndrdisc | 9.5 | 12.2 | 12.4 | | ?% | ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ +| L2XC dot1ad | 10ge2p1x520: 64B-1t1c-dot1ad-l2xcbase-ndrdisc | 7.4 | 8.8 | 9.3 | | ?% | ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ +| L2XC dot1q | 10ge2p1x520: 64B-1t1c-dot1q-l2xcbase-ndrdisc | 7.5 | 8.8 | 9.2 | | ?% | ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ +| L2XC VxLAN | 10ge2p1x520: 64B-1t1c-ethip4vxlan-l2xcbase-ndrdisc | 5.4 | 6.5 | 6.8 | | ?% | ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ +| L2BD | 10ge2p1x520: 64B-1t1c-eth-l2bdbasemaclrn-ndrdisc | 7.8 | 10.4 | 10.8 | | ?% | ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ +| IPv4 | 10ge2p1x520: 64B-1t1c-ethip4-ip4base-ndrdisc | 8.7 | 9.7 | 10.6 | | ?% | ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ +| IPv4 COP | 10ge2p1x520: 64B-1t1c-ethip4-ip4base-copwhtlistbase-ndrdisc | 7.1 | 8.3 | 9.0 | | ?% | ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ +| IPv4 iAcl | 10ge2p1x520: 64B-1t1c-ethip4-ip4base-iacldstbase-ndrdisc | 6.9 | 7.6 | 8.3 | | ?% | ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ +| IPv4 FIB 200k | 10ge2p1x520: 64B-1t1c-ethip4-ip4scale200k-ndrdisc | 8.5 | 9.0 | 9.7 | | ?% | ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ +| IPv4 FIB 20k | 10ge2p1x520: 64B-1t1c-ethip4-ip4scale20k-ndrdisc | 8.5 | 9.0 | 9.7 | | ?% | ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ +| IPv4 FIB 2M | 10ge2p1x520: 64B-1t1c-ethip4-ip4scale2m-ndrdisc | 8.5 | 7.8 | 8.1 | | ?% | ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ +| IPv4 Policer | 10ge2p1x520: 64B-1t1c-ethip4-ip4base-ipolicemarkbase-ndrdisc | 6.9 | 7.4 | 8.1 | | ?% | ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ +| IPv6 FIB 200k | 10ge2p1x520: 78B-1t1c-ethip6-ip6scale200k-ndrdisc | 6.5 | 5.3 | 5.3 | | ?% | ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ +| IPv6 FIB 20k | 10ge2p1x520: 78B-1t1c-ethip6-ip6scale20k-ndrdisc | 6.9 | 6.5 | 6.9 | | ?% | ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ PDR Throughput ~~~~~~~~~~~~~~ Partial Drop Rate thoughput discovery tests with packet Loss Tolerance of 0.5%: -+-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------------+ -| VPP Functionality | Test Name | VPP-16.09 | VPP-17.01 | VPP-17.04 | 17.01 to 17.04 | -| | | [Mpps] | [Mpps] | [Mpps] | Relative Change | -+===================+=================================================================+===========+===========+===========+=================+ -| L2XC | 10ge2p1x520: 64B-1t1c-eth-l2xcbase-pdrdisc | 9.4 | 12.7 | 13.4 | 6% | -+-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------------+ -| L2XC dot1ad | 10ge2p1x520: 64B-1t1c-dot1ad-l2xcbase-pdrdisc | 7.4 | 8.8 | 9.3 | 6% | -+-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------------+ -| L2XC dot1q | 10ge2p1x520: 64B-1t1c-dot1q-l2xcbase-pdrdisc | 7.5 | 8.8 | 9.2 | 5% | -+-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------------+ -| L2XC VxLAN | 10ge2p1x520: 64B-1t1c-ethip4vxlan-l2xcbase-pdrdisc | 5.4 | 6.5 | 6.8 | 5% | -+-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------------+ -| L2BD | 10ge2p1x520: 64B-1t1c-eth-l2bdbasemaclrn-pdrdisc | 7.8 | 10.6 | 10.8 | 2% | -+-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------------+ -| IPv4 | 10ge2p1x520: 64B-1t1c-ethip4-ip4base-pdrdisc | 8.7 | 9.7 | 10.6 | 9% | -+-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------------+ -| IPv4 COP | 10ge2p1x520: 64B-1t1c-ethip4-ip4base-copwhtlistbase-pdrdisc | 7.1 | 8.3 | 9.2 | 11% | -+-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------------+ -| IPv4 iAcl | 10ge2p1x520: 64B-1t1c-ethip4-ip4base-iacldstbase-pdrdisc | 7.1 | 7.6 | 8.3 | 9% | -+-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------------+ -| IPv4 FIB 200k | 10ge2p1x520: 64B-1t1c-ethip4-ip4scale200k-pdrdisc | 8.5 | 9.0 | 9.7 | 8% | -+-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------------+ -| IPv4 FIB 20k | 10ge2p1x520: 64B-1t1c-ethip4-ip4scale20k-pdrdisc | 8.5 | 9.0 | 9.7 | 8% | -+-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------------+ -| IPv4 FIB 2M | 10ge2p1x520: 64B-1t1c-ethip4-ip4scale2m-pdrdisc | 8.3 | 8.1 | 8.1 | 0% | -+-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------------+ -| IPv4 Policer | 10ge2p1x520: 64B-1t1c-ethip4-ip4base-ipolicemarkbase-pdrdisc | 7.1 | 7.4 | 8.1 | 9% | -+-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------------+ -| IPv6 FIB 200k | 10ge2p1x520: 78B-1t1c-ethip6-ip6scale200k-pdrdisc | 6.9 | 5.3 | 5.3 | 0% | -+-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------------+ -| IPv6 FIB 20k | 10ge2p1x520: 78B-1t1c-ethip6-ip6scale20k-pdrdisc | 6.9 | 6.5 | 6.9 | 6% | -+-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------------+ ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ +| VPP Functionality | Test Name | VPP-16.09 | VPP-17.01 | VPP-17.04 | VPP-17.07 | 17.04 to 17.07 | +| | | [Mpps] | [Mpps] | [Mpps] | [Mpps] | Relative Change | ++===================+=================================================================+===========+===========+===========+===========+=================+ +| L2XC | 10ge2p1x520: 64B-1t1c-eth-l2xcbase-pdrdisc | 9.4 | 12.7 | 13.4 | | ?% | ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ +| L2XC dot1ad | 10ge2p1x520: 64B-1t1c-dot1ad-l2xcbase-pdrdisc | 7.4 | 8.8 | 9.3 | | ?% | ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ +| L2XC dot1q | 10ge2p1x520: 64B-1t1c-dot1q-l2xcbase-pdrdisc | 7.5 | 8.8 | 9.2 | | ?% | ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ +| L2XC VxLAN | 10ge2p1x520: 64B-1t1c-ethip4vxlan-l2xcbase-pdrdisc | 5.4 | 6.5 | 6.8 | | ?% | ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ +| L2BD | 10ge2p1x520: 64B-1t1c-eth-l2bdbasemaclrn-pdrdisc | 7.8 | 10.6 | 10.8 | | ?% | ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ +| IPv4 | 10ge2p1x520: 64B-1t1c-ethip4-ip4base-pdrdisc | 8.7 | 9.7 | 10.6 | | ?% | ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ +| IPv4 COP | 10ge2p1x520: 64B-1t1c-ethip4-ip4base-copwhtlistbase-pdrdisc | 7.1 | 8.3 | 9.2 | | ?% | ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ +| IPv4 iAcl | 10ge2p1x520: 64B-1t1c-ethip4-ip4base-iacldstbase-pdrdisc | 7.1 | 7.6 | 8.3 | | ?% | ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ +| IPv4 FIB 200k | 10ge2p1x520: 64B-1t1c-ethip4-ip4scale200k-pdrdisc | 8.5 | 9.0 | 9.7 | | ?% | ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ +| IPv4 FIB 20k | 10ge2p1x520: 64B-1t1c-ethip4-ip4scale20k-pdrdisc | 8.5 | 9.0 | 9.7 | | ?% | ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ +| IPv4 FIB 2M | 10ge2p1x520: 64B-1t1c-ethip4-ip4scale2m-pdrdisc | 8.3 | 8.1 | 8.1 | | ?% | ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ +| IPv4 Policer | 10ge2p1x520: 64B-1t1c-ethip4-ip4base-ipolicemarkbase-pdrdisc | 7.1 | 7.4 | 8.1 | | ?% | ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ +| IPv6 FIB 200k | 10ge2p1x520: 78B-1t1c-ethip6-ip6scale200k-pdrdisc | 6.9 | 5.3 | 5.3 | | ?% | ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ +| IPv6 FIB 20k | 10ge2p1x520: 78B-1t1c-ethip6-ip6scale20k-pdrdisc | 6.9 | 6.5 | 6.9 | | ?% | ++-------------------+-----------------------------------------------------------------+-----------+-----------+-----------+-----------+-----------------+ Known Issues ------------ diff --git a/docs/report/vpp_performance_tests/overview.rst b/docs/report/vpp_performance_tests/overview.rst index ccf8063ec2..a28d8572eb 100644 --- a/docs/report/vpp_performance_tests/overview.rst +++ b/docs/report/vpp_performance_tests/overview.rst @@ -104,7 +104,8 @@ sensitivity to Linux kernel scheduler settings and behaviour, this estimation may not always yield good enough accuracy. For detailed LF FD.io test bed specification and physical topology please refer -to `LF FDio CSIT testbed wiki page `_. +to `LF FDio CSIT testbed wiki page +`_. Performance Tests Coverage -------------------------- @@ -205,38 +206,38 @@ suites: #. **Physical port to physical port - a.k.a. NIC-to-NIC, Phy-to-Phy, P2P** - - *PortNICConfig-WireEncapsulation-PacketForwardingFunction- - PacketProcessingFunction1-...-PacketProcessingFunctionN-TestType* - - *10ge2p1x520-dot1q-l2bdbasemaclrn-ndrdisc.robot* => 2 ports of 10GE on - Intel x520 NIC, dot1q tagged Ethernet, L2 bridge-domain baseline switching - with MAC learning, NDR throughput discovery. - - *10ge2p1x520-ethip4vxlan-l2bdbasemaclrn-ndrchk.robot* => 2 ports of 10GE - on Intel x520 NIC, IPv4 VXLAN Ethernet, L2 bridge-domain baseline - switching with MAC learning, NDR throughput discovery. - - *10ge2p1x520-ethip4-ip4base-ndrdisc.robot* => 2 ports of 10GE on Intel - x520 NIC, IPv4 baseline routed forwarding, NDR throughput discovery. - - *10ge2p1x520-ethip6-ip6scale200k-ndrdisc.robot* => 2 ports of 10GE on - Intel x520 NIC, IPv6 scaled up routed forwarding, NDR throughput - discovery. + - *PortNICConfig-WireEncapsulation-PacketForwardingFunction- + PacketProcessingFunction1-...-PacketProcessingFunctionN-TestType* + - *10ge2p1x520-dot1q-l2bdbasemaclrn-ndrdisc.robot* => 2 ports of 10GE on + Intel x520 NIC, dot1q tagged Ethernet, L2 bridge-domain baseline switching + with MAC learning, NDR throughput discovery. + - *10ge2p1x520-ethip4vxlan-l2bdbasemaclrn-ndrchk.robot* => 2 ports of 10GE + on Intel x520 NIC, IPv4 VXLAN Ethernet, L2 bridge-domain baseline + switching with MAC learning, NDR throughput discovery. + - *10ge2p1x520-ethip4-ip4base-ndrdisc.robot* => 2 ports of 10GE on Intel + x520 NIC, IPv4 baseline routed forwarding, NDR throughput discovery. + - *10ge2p1x520-ethip6-ip6scale200k-ndrdisc.robot* => 2 ports of 10GE on + Intel x520 NIC, IPv6 scaled up routed forwarding, NDR throughput + discovery. #. **Physical port to VM (or VM chain) to physical port - a.k.a. NIC2VM2NIC, P2V2P, NIC2VMchain2NIC, P2V2V2P** - - *PortNICConfig-WireEncapsulation-PacketForwardingFunction- - PacketProcessingFunction1-...-PacketProcessingFunctionN-VirtEncapsulation- - VirtPortConfig-VMconfig-TestType* - - *10ge2p1x520-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc.robot* => 2 ports - of 10GE on Intel x520 NIC, dot1q tagged Ethernet, L2 bridge-domain - switching to/from two vhost interfaces and one VM, NDR throughput - discovery. - - *10ge2p1x520-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc.robot* => 2 - ports of 10GE on Intel x520 NIC, IPv4 VXLAN Ethernet, L2 bridge-domain - switching to/from two vhost interfaces and one VM, NDR throughput - discovery. - - *10ge2p1x520-ethip4vxlan-l2bdbasemaclrn-eth-4vhost-2vm-ndrdisc.robot* => 2 - ports of 10GE on Intel x520 NIC, IPv4 VXLAN Ethernet, L2 bridge-domain - switching to/from four vhost interfaces and two VMs, NDR throughput - discovery. + - *PortNICConfig-WireEncapsulation-PacketForwardingFunction- + PacketProcessingFunction1-...-PacketProcessingFunctionN-VirtEncapsulation- + VirtPortConfig-VMconfig-TestType* + - *10ge2p1x520-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc.robot* => 2 ports + of 10GE on Intel x520 NIC, dot1q tagged Ethernet, L2 bridge-domain + switching to/from two vhost interfaces and one VM, NDR throughput + discovery. + - *10ge2p1x520-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc.robot* => 2 + ports of 10GE on Intel x520 NIC, IPv4 VXLAN Ethernet, L2 bridge-domain + switching to/from two vhost interfaces and one VM, NDR throughput + discovery. + - *10ge2p1x520-ethip4vxlan-l2bdbasemaclrn-eth-4vhost-2vm-ndrdisc.robot* => 2 + ports of 10GE on Intel x520 NIC, IPv4 VXLAN Ethernet, L2 bridge-domain + switching to/from four vhost interfaces and two VMs, NDR throughput + discovery. Methodology: Multi-Thread and Multi-Core ---------------------------------------- @@ -356,29 +357,29 @@ specific configuration. TRex is installed and run on the TG compute node. The typical procedure is: - - If the TRex is not already installed on TG, it is installed in the - suite setup phase - see `TRex intallation`_. - - TRex configuration is set in its configuration file - :: +- If the TRex is not already installed on TG, it is installed in the + suite setup phase - see `TRex intallation`_. +- TRex configuration is set in its configuration file + :: - /etc/trex_cfg.yaml + /etc/trex_cfg.yaml - - TRex is started in the background mode - :: +- TRex is started in the background mode + :: - sh -c 'cd /opt/trex-core-2.25/scripts/ && sudo nohup ./t-rex-64 -i -c 7 --iom 0 > /dev/null 2>&1 &' > /dev/null + $ sh -c 'cd /opt/trex-core-2.25/scripts/ && sudo nohup ./t-rex-64 -i -c 7 --iom 0 > /dev/null 2>&1 &' > /dev/null - - There are traffic streams dynamically prepared for each test. The traffic - is sent and the statistics obtained using trex_stl_lib.api.STLClient. +- There are traffic streams dynamically prepared for each test. The traffic + is sent and the statistics obtained using trex_stl_lib.api.STLClient. **Measuring packet loss** - - Create an instance of STLClient - - Connect to the client - - Add all streams - - Clear statistics - - Send the traffic for defined time - - Get the statistics +- Create an instance of STLClient +- Connect to the client +- Add all streams +- Clear statistics +- Send the traffic for defined time +- Get the statistics If there is a warm-up phase required, the traffic is sent also before test and the statistics are ignored. diff --git a/docs/report/vpp_performance_tests/packet_latency_graphs/index.rst b/docs/report/vpp_performance_tests/packet_latency_graphs/index.rst index 307bf3caf1..7db10ee0cd 100644 --- a/docs/report/vpp_performance_tests/packet_latency_graphs/index.rst +++ b/docs/report/vpp_performance_tests/packet_latency_graphs/index.rst @@ -25,9 +25,9 @@ TGint2-to-SUT2-to-SUT1-to-TGint1. .. toctree:: l2 - ipv4 - ipv6 - ipv4_tunnels - ipv6_tunnels + ip4 + ip6 + ip4_tunnels + ip6_tunnels vm_vhost ipsec diff --git a/docs/report/vpp_performance_tests/packet_latency_graphs/ipv4.rst b/docs/report/vpp_performance_tests/packet_latency_graphs/ip4.rst similarity index 97% rename from docs/report/vpp_performance_tests/packet_latency_graphs/ipv4.rst rename to docs/report/vpp_performance_tests/packet_latency_graphs/ip4.rst index 669c8a95e3..daa2397dbf 100644 --- a/docs/report/vpp_performance_tests/packet_latency_graphs/ipv4.rst +++ b/docs/report/vpp_performance_tests/packet_latency_graphs/ip4.rst @@ -20,7 +20,7 @@ git repository: .. code-block:: bash - $ cd $CSIT/tests/vpp/perf/ipv4 + $ cd $CSIT/tests/vpp/perf/ip4 $ grep -P '64B-1t1c-ethip4-ip4(base|scale)[a-z0-9]*(?!-eth-[0-9]vhost).*-ndrdisc' * 10ge2p1x520-ethip4-ip4base-copwhtlistbase-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4-ip4base-copwhtlistbase-ndrdisc @@ -47,7 +47,7 @@ git repository: .. code-block:: bash - $ cd $CSIT/tests/vpp/perf/ipv4 + $ cd $CSIT/tests/vpp/perf/ip4 $ grep -P '64B-2t2c-ethip4-ip4(base|scale)[a-z0-9]*(?!-eth-[0-9]vhost).*-ndrdisc' * 10ge2p1x520-ethip4-ip4base-copwhtlistbase-ndrpdrdisc.robot:| tc07-64B-2t2c-ethip4-ip4base-copwhtlistbase-ndrdisc diff --git a/docs/report/vpp_performance_tests/packet_latency_graphs/ipv4_tunnels.rst b/docs/report/vpp_performance_tests/packet_latency_graphs/ip4_tunnels.rst similarity index 96% rename from docs/report/vpp_performance_tests/packet_latency_graphs/ipv4_tunnels.rst rename to docs/report/vpp_performance_tests/packet_latency_graphs/ip4_tunnels.rst index 6860fedc9a..a041b103fa 100644 --- a/docs/report/vpp_performance_tests/packet_latency_graphs/ipv4_tunnels.rst +++ b/docs/report/vpp_performance_tests/packet_latency_graphs/ip4_tunnels.rst @@ -20,7 +20,7 @@ git repository: .. code-block:: bash - $ cd $CSIT/tests/vpp/perf/ipv4_tunnels + $ cd $CSIT/tests/vpp/perf/ip4_tunnels $ grep -E "64B-1t1c-ethip4[a-z0-9]+-[a-z0-9]*-ndrdisc" * 10ge2p1x520-ethip4lispip4-ip4base-ndrdisc.robot:| tc01-64B-1t1c-ethip4lispip4-ip4base-ndrdisc @@ -41,7 +41,7 @@ git repository: .. code-block:: bash - $ cd $CSIT/tests/vpp/perf/ipv4_tunnels + $ cd $CSIT/tests/vpp/perf/ip4_tunnels $ grep -E "64B-2t2c-ethip4[a-z0-9]+-[a-z0-9]*-ndrdisc" * 10ge2p1x520-ethip4lispip4-ip4base-ndrdisc.robot:| tc07-64B-2t2c-ethip4lispip4-ip4base-ndrdisc diff --git a/docs/report/vpp_performance_tests/packet_latency_graphs/ip6.rst b/docs/report/vpp_performance_tests/packet_latency_graphs/ip6.rst new file mode 100644 index 0000000000..10aa9b99c7 --- /dev/null +++ b/docs/report/vpp_performance_tests/packet_latency_graphs/ip6.rst @@ -0,0 +1,57 @@ +IPv6 Routed-Forwarding +====================== + +This section includes summary graphs of VPP Phy-to-Phy packet latency +with IPv6 Routed-Forwarding measured at 50% of discovered NDR throughput +rate. Latency is reported for VPP running in multiple configurations of +VPP worker thread(s), a.k.a. VPP data plane thread(s), and their +physical CPU core(s) placement. + +VPP packet latency in 1t1c setup (1thread, 1core) is presented in the graph below. + +.. raw:: html + + + +*Figure 1. VPP 1thread 1core - packet latency for Phy-to-Phy IPv6 Routed-Forwarding.* + +CSIT source code for the test cases used for above plots can be found in CSIT +git repository: + +.. code-block:: bash + + $ cd $CSIT/tests/vpp/perf/ip6 + $ grep -E "78B-1t1c-ethip6-ip6[a-z0-9]+-[a-z-]*ndrdisc" * + + 10ge2p1x520-ethip6-ip6base-copwhtlistbase-ndrpdrdisc.robot:| tc01-78B-1t1c-ethip6-ip6base-copwhtlistbase-ndrdisc + 10ge2p1x520-ethip6-ip6base-iacldstbase-ndrpdrdisc.robot:| tc01-78B-1t1c-ethip6-ip6base-iacldstbase-ndrdisc + 10ge2p1x520-ethip6-ip6base-ndrpdrdisc.robot:| tc01-78B-1t1c-ethip6-ip6base-ndrdisc + 10ge2p1x520-ethip6-ip6scale200k-ndrpdrdisc.robot:| tc01-78B-1t1c-ethip6-ip6scale200k-ndrdisc + 10ge2p1x520-ethip6-ip6scale20k-ndrpdrdisc.robot:| tc01-78B-1t1c-ethip6-ip6scale20k-ndrdisc + 10ge2p1x520-ethip6-ip6scale2m-ndrpdrdisc.robot:| tc01-78B-1t1c-ethip6-ip6scale2m-ndrdisc + 40ge2p1xl710-ethip6-ip6base-ndrpdrdisc.robot:| tc01-78B-1t1c-ethip6-ip6base-ndrdisc + +VPP packet latency in 2t2c setup (2thread, 2core) is presented in the graph below. + +.. raw:: html + + + +*Figure 2. VPP 2threads 2cores - packet latency for Phy-to-Phy IPv6 Routed-Forwarding.* + +CSIT source code for the test cases used for above plots can be found in CSIT +git repository: + +.. code-block:: bash + + $ cd $CSIT/tests/vpp/perf/ip6 + $ grep -E "78B-2t2c-ethip6-ip6[a-z0-9]+-[a-z-]*ndrdisc" * + + 10ge2p1x520-ethip6-ip6base-copwhtlistbase-ndrpdrdisc.robot:| tc07-78B-2t2c-ethip6-ip6base-copwhtlistbase-ndrdisc + 10ge2p1x520-ethip6-ip6base-iacldstbase-ndrpdrdisc.robot:| tc07-78B-2t2c-ethip6-ip6base-iacldstbase-ndrdisc + 10ge2p1x520-ethip6-ip6base-ndrpdrdisc.robot:| tc07-78B-2t2c-ethip6-ip6base-ndrdisc + 10ge2p1x520-ethip6-ip6scale200k-ndrpdrdisc.robot:| tc07-78B-2t2c-ethip6-ip6scale200k-ndrdisc + 10ge2p1x520-ethip6-ip6scale20k-ndrpdrdisc.robot:| tc07-78B-2t2c-ethip6-ip6scale20k-ndrdisc + 10ge2p1x520-ethip6-ip6scale2m-ndrpdrdisc.robot:| tc07-78B-2t2c-ethip6-ip6scale2m-ndrdisc + 40ge2p1xl710-ethip6-ip6base-ndrpdrdisc.robot:| tc07-78B-2t2c-ethip6-ip6base-ndrdisc + diff --git a/docs/report/vpp_performance_tests/packet_latency_graphs/ipv6_tunnels.rst b/docs/report/vpp_performance_tests/packet_latency_graphs/ip6_tunnels.rst similarity index 100% rename from docs/report/vpp_performance_tests/packet_latency_graphs/ipv6_tunnels.rst rename to docs/report/vpp_performance_tests/packet_latency_graphs/ip6_tunnels.rst diff --git a/docs/report/vpp_performance_tests/packet_latency_graphs/ipsec.rst b/docs/report/vpp_performance_tests/packet_latency_graphs/ipsec.rst index a792cac907..1b552c13b2 100644 --- a/docs/report/vpp_performance_tests/packet_latency_graphs/ipsec.rst +++ b/docs/report/vpp_performance_tests/packet_latency_graphs/ipsec.rst @@ -10,14 +10,6 @@ for VPP running in multiple configurations of VPP worker thread(s), a.k.a. VPP data plane thread(s), and their physical CPU core(s) placement. -.. note:: - - Test results have been generated by FD.io test executor jobs - `csit-vpp-perf-1704-all - `_, - with Robot Framework result files csit-vpp-perf-1704-all-.zip - `archived here <../../_static/archive/>`_. - VPP packet latency in 1t1c setup (1thread, 1core) is presented in the graph below. @@ -35,14 +27,14 @@ git repository: $ cd $CSIT/tests/vpp/perf/crypto $ grep -E "64B-1t1c-.*ipsec.*-ndrdisc" * - 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-interfaces-aes-gcm-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4ipsecscale1ip4-ip4base-interfaces-aes-gcm-ndrdisc - 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-interfaces-aes-gcm-ndrpdrdisc.robot:| tc03-64B-1t1c-ethip4ipsecscale1000ip4-ip4base-interfaces-aes-gcm-ndrdisc - 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-interfaces-cbc-sha1-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4ipsecscale1ip4-ip4base-interfaces-cbc-sha1-ndrdisc - 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-interfaces-cbc-sha1-ndrpdrdisc.robot:| tc03-64B-1t1c-ethip4ipsecscale1000ip4-ip4base-interfaces-cbc-sha1-ndrdisc - 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-tunnels-aes-gcm-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4ipsecscale1ip4-ip4base-tunnels-aes-gcm-ndrdisc - 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-tunnels-aes-gcm-ndrpdrdisc.robot:| tc03-64B-1t1c-ethip4ipsecscale1000ip4-ip4base-tunnels-aes-gcm-ndrdisc - 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-tunnels-cbc-sha1-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4ipsecscale1ip4-ip4base-tunnels-cbc-sha1-ndrdisc - 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-tunnels-cbc-sha1-ndrpdrdisc.robot:| tc03-64B-1t1c-ethip4ipsecscale1000ip4-ip4base-tunnels-cbc-sha1-ndrdisc + 40ge2p1xl710-ethip4ipsecbasetnl-ip4base-int-aes-gcm-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4ipsecbasetnl-ip4base-int-aes-gcm-ndrdisc + 40ge2p1xl710-ethip4ipsecbasetnl-ip4base-int-cbc-sha1-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4ipsecbasetnl-ip4base-int-cbc-sha1-ndrdisc + 40ge2p1xl710-ethip4ipsecbasetnl-ip4base-tnl-aes-gcm-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4ipsecbasetnl-ip4base-tnl-aes-gcm-ndrdisc + 40ge2p1xl710-ethip4ipsecbasetnl-ip4base-tnl-cbc-sha1-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4ipsecbasetnl-ip4base-tnl-cbc-sha1-ndrdisc + 40ge2p1xl710-ethip4ipsecscale1000tnl-ip4base-int-aes-gcm-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4ipsecscale1000tnl-ip4base-int-aes-gcm-ndrdisc + 40ge2p1xl710-ethip4ipsecscale1000tnl-ip4base-int-cbc-sha1-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4ipsecscale1000tnl-ip4base-int-cbc-sha1-ndrdisc + 40ge2p1xl710-ethip4ipsecscale1000tnl-ip4base-tnl-aes-gcm-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4ipsecscale1000tnl-ip4base-tnl-aes-gcm-ndrdisc + 40ge2p1xl710-ethip4ipsecscale1000tnl-ip4base-tnl-cbc-sha1-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4ipsecscale1000tnl-ip4base-tnl-cbc-sha1-ndrdisc 40ge2p1xl710-ethip4ipsectptlispgpe-ip4base-cbc-sha1-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4ipsectptlispgpe-ip4base-cbc-sha1-ndrdisc @@ -62,13 +54,13 @@ git repository: $ cd $CSIT/tests/vpp/perf/crypto $ grep -E "64B-2t2c-.*ipsec.*-ndrdisc" * - 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-interfaces-aes-gcm-ndrpdrdisc.robot:| tc13-64B-2t2c-ethip4ipsecscale1ip4-ip4base-interfaces-aes-gcm-ndrdisc - 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-interfaces-aes-gcm-ndrpdrdisc.robot:| tc15-64B-2t2c-ethip4ipsecscale1000ip4-ip4base-interfaces-aes-gcm-ndrdisc - 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-interfaces-cbc-sha1-ndrpdrdisc.robot:| tc13-64B-2t2c-ethip4ipsecscale1ip4-ip4base-interfaces-cbc-sha1-ndrdisc - 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-interfaces-cbc-sha1-ndrpdrdisc.robot:| tc15-64B-2t2c-ethip4ipsecscale1000ip4-ip4base-interfaces-cbc-sha1-ndrdisc - 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-tunnels-aes-gcm-ndrpdrdisc.robot:| tc13-64B-2t2c-ethip4ipsecscale1ip4-ip4base-tunnels-aes-gcm-ndrdisc - 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-tunnels-aes-gcm-ndrpdrdisc.robot:| tc15-64B-2t2c-ethip4ipsecscale1000ip4-ip4base-tunnels-aes-gcm-ndrdisc - 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-tunnels-cbc-sha1-ndrpdrdisc.robot:| tc13-64B-2t2c-ethip4ipsecscale1ip4-ip4base-tunnels-cbc-sha1-ndrdisc - 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-tunnels-cbc-sha1-ndrpdrdisc.robot:| tc15-64B-2t2c-ethip4ipsecscale1000ip4-ip4base-tunnels-cbc-sha1-ndrdisc + 40ge2p1xl710-ethip4ipsecbasetnl-ip4base-int-aes-gcm-ndrpdrdisc.robot:| tc07-64B-2t2c-ethip4ipsecbasetnl-ip4base-int-aes-gcm-ndrdisc + 40ge2p1xl710-ethip4ipsecbasetnl-ip4base-int-cbc-sha1-ndrpdrdisc.robot:| tc07-64B-2t2c-ethip4ipsecbasetnl-ip4base-int-cbc-sha1-ndrdisc + 40ge2p1xl710-ethip4ipsecbasetnl-ip4base-tnl-aes-gcm-ndrpdrdisc.robot:| tc07-64B-2t2c-ethip4ipsecbasetnl-ip4base-tnl-aes-gcm-ndrdisc + 40ge2p1xl710-ethip4ipsecbasetnl-ip4base-tnl-cbc-sha1-ndrpdrdisc.robot:| tc07-64B-2t2c-ethip4ipsecbasetnl-ip4base-tnl-cbc-sha1-ndrdisc + 40ge2p1xl710-ethip4ipsecscale1000tnl-ip4base-int-aes-gcm-ndrpdrdisc.robot:| tc07-64B-2t2c-ethip4ipsecscale1000tnl-ip4base-int-aes-gcm-ndrdisc + 40ge2p1xl710-ethip4ipsecscale1000tnl-ip4base-int-cbc-sha1-ndrpdrdisc.robot:| tc07-64B-2t2c-ethip4ipsecscale1000tnl-ip4base-int-cbc-sha1-ndrdisc + 40ge2p1xl710-ethip4ipsecscale1000tnl-ip4base-tnl-aes-gcm-ndrpdrdisc.robot:| tc07-64B-2t2c-ethip4ipsecscale1000tnl-ip4base-tnl-aes-gcm-ndrdisc + 40ge2p1xl710-ethip4ipsecscale1000tnl-ip4base-tnl-cbc-sha1-ndrpdrdisc.robot:| tc07-64B-2t2c-ethip4ipsecscale1000tnl-ip4base-tnl-cbc-sha1-ndrdisc 40ge2p1xl710-ethip4ipsectptlispgpe-ip4base-cbc-sha1-ndrpdrdisc.robot:| tc07-64B-2t2c-ethip4ipsectptlispgpe-ip4base-cbc-sha1-ndrdisc diff --git a/docs/report/vpp_performance_tests/packet_latency_graphs/ipv6.rst b/docs/report/vpp_performance_tests/packet_latency_graphs/ipv6.rst deleted file mode 100644 index a8e8ce7b5a..0000000000 --- a/docs/report/vpp_performance_tests/packet_latency_graphs/ipv6.rst +++ /dev/null @@ -1,58 +0,0 @@ -IPv6 Routed-Forwarding -====================== - -This section includes summary graphs of VPP Phy-to-Phy packet latency -with IPv6 Routed-Forwarding measured at 50% of discovered NDR throughput -rate. Latency is reported for VPP running in multiple configurations of -VPP worker thread(s), a.k.a. VPP data plane thread(s), and their -physical CPU core(s) placement. - -VPP packet latency in 1t1c setup (1thread, 1core) is presented in the graph below. - -.. raw:: html - - - -*Figure 1. VPP 1thread 1core - packet latency for Phy-to-Phy IPv6 Routed-Forwarding.* - -CSIT source code for the test cases used for above plots can be found in CSIT -git repository: - -.. code-block:: bash - - $ cd $CSIT/tests/vpp/perf/ipv6 - $ grep -E "78B-1t1c-ethip6-ip6[a-z0-9]+-[a-z-]*ndrdisc" * - - 10ge2p1x520-ethip6-ip6base-copwhtlistbase-ndrdisc.robot:| tc01-78B-1t1c-ethip6-ip6base-copwhtlistbase-ndrdisc - 10ge2p1x520-ethip6-ip6base-iacldstbase-ndrdisc.robot:| tc01-78B-1t1c-ethip6-ip6base-iacldstbase-ndrdisc - 10ge2p1x520-ethip6-ip6base-ndrdisc.robot:| tc01-78B-1t1c-ethip6-ip6base-ndrdisc - 10ge2p1x520-ethip6-ip6scale200k-ndrdisc.robot:| tc01-78B-1t1c-ethip6-ip6scale200k-ndrdisc - 10ge2p1x520-ethip6-ip6scale20k-ndrdisc.robot:| tc01-78B-1t1c-ethip6-ip6scale20k-ndrdisc - 10ge2p1x520-ethip6-ip6scale2m-ndrdisc.robot:| tc01-78B-1t1c-ethip6-ip6scale2m-ndrdisc - 40ge2p1xl710-ethip6-ip6base-ndrdisc.robot:| tc01-78B-1t1c-ethip6-ip6base-ndrdisc - -VPP packet latency in 2t2c setup (2thread, 2core) is presented in the graph below. - -.. raw:: html - - - -*Figure 2. VPP 2threads 2cores - packet latency for Phy-to-Phy IPv6 Routed-Forwarding.* - -CSIT source code for the test cases used for above plots can be found in CSIT -git repository: - -.. code-block:: bash - - $ cd $CSIT/tests/vpp/perf/ipv6 - $ grep -E "78B-2t2c-ethip6-ip6[a-z0-9]+-[a-z-]*ndrdisc" * - - 10ge2p1x520-ethip6-ip6base-copwhtlistbase-ndrdisc.robot:| tc07-78B-2t2c-ethip6-ip6base-copwhtlistbase-ndrdisc - 10ge2p1x520-ethip6-ip6base-iacldstbase-ndrdisc.robot:| tc07-78B-2t2c-ethip6-ip6base-iacldstbase-ndrdisc - 10ge2p1x520-ethip6-ip6base-ipolicemarkbase-ndrdisc.robot:| tc07-78B-2t2c-ethip6-ip6base-ipolicemarkbase-ndrdisc - 10ge2p1x520-ethip6-ip6base-ndrdisc.robot:| tc07-78B-2t2c-ethip6-ip6base-ndrdisc - 10ge2p1x520-ethip6-ip6scale200k-ndrdisc.robot:| tc07-78B-2t2c-ethip6-ip6scale200k-ndrdisc - 10ge2p1x520-ethip6-ip6scale20k-ndrdisc.robot:| tc07-78B-2t2c-ethip6-ip6scale20k-ndrdisc - 10ge2p1x520-ethip6-ip6scale2m-ndrdisc.robot:| tc07-78B-2t2c-ethip6-ip6scale2m-ndrdisc - 40ge2p1xl710-ethip6-ip6base-ndrdisc.robot:| tc07-78B-2t2c-ethip6-ip6base-ndrdisc - diff --git a/docs/report/vpp_performance_tests/packet_latency_graphs/l2.rst b/docs/report/vpp_performance_tests/packet_latency_graphs/l2.rst index 3b56612a13..056d3b4665 100644 --- a/docs/report/vpp_performance_tests/packet_latency_graphs/l2.rst +++ b/docs/report/vpp_performance_tests/packet_latency_graphs/l2.rst @@ -21,17 +21,54 @@ git repository: .. code-block:: bash $ cd $CSIT/tests/vpp/perf/l2 - $ grep -E "64B-1t1c-(eth|dot1q|dot1ad)-(l2xcbase|l2bdbasemaclrn)-ndrdisc" * - - 10ge2p1vic1227-eth-l2bdbasemaclrn-ndrdisc.robot:| tc01-64B-1t1c-eth-l2bdbasemaclrn-ndrdisc - 10ge2p1x520-dot1ad-l2xcbase-ndrdisc.robot:| tc01-64B-1t1c-dot1ad-l2xcbase-ndrdisc - 10ge2p1x520-dot1q-l2xcbase-ndrdisc.robot:| tc01-64B-1t1c-dot1q-l2xcbase-ndrdisc - 10ge2p1x520-eth-l2bdbasemaclrn-ndrdisc.robot:| tc01-64B-1t1c-eth-l2bdbasemaclrn-ndrdisc - 10ge2p1x520-eth-l2xcbase-ndrdisc.robot:| tc01-64B-1t1c-eth-l2xcbase-ndrdisc - 10ge2p1x710-eth-l2bdbasemaclrn-ndrdisc.robot:| tc01-64B-1t1c-eth-l2bdbasemaclrn-ndrdisc - 40ge2p1vic1385-eth-l2bdbasemaclrn-ndrdisc.robot:| tc01-64B-1t1c-eth-l2bdbasemaclrn-ndrdisc - 40ge2p1xl710-eth-l2bdbasemaclrn-ndrdisc.robot:| tc01-64B-1t1c-eth-l2bdbasemaclrn-ndrdisc - 40ge2p1xl710-eth-l2xcbase-ndrdisc.robot:| tc01-64B-1t1c-eth-l2xcbase-ndrdisc + $ grep -E "64B-1t1c-(eth|dot1q|dot1ad)-(l2xcbase|l2bdbasemaclrn)-(iacl.*|oacl.*|eth.*)*ndrdisc" * + + 10ge2p1vic1227-eth-l2bdbasemaclrn-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2bdbasemaclrn-ndrdisc + 10ge2p1x520-dot1ad-l2xcbase-ndrpdrdisc.robot:| tc01-64B-1t1c-dot1ad-l2xcbase-ndrdisc + 10ge2p1x520-dot1q-l2xcbase-ndrpdrdisc.robot:| tc01-64B-1t1c-dot1q-l2xcbase-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermit-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2bdbasemaclrn-iacl1-stateless-flows100-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermit-ndrpdrdisc.robot:| tc03-64B-1t1c-eth-l2bdbasemaclrn-iacl10-stateless-flows100-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermit-ndrpdrdisc.robot:| tc05-64B-1t1c-eth-l2bdbasemaclrn-iacl50-stateless-flows100-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermit-ndrpdrdisc.robot:| tc07-64B-1t1c-eth-l2bdbasemaclrn-iacl1-stateless-flows10k-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermit-ndrpdrdisc.robot:| tc09-64B-1t1c-eth-l2bdbasemaclrn-iacl10-stateless-flows10k-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermit-ndrpdrdisc.robot:| tc11-64B-1t1c-eth-l2bdbasemaclrn-iacl50-stateless-flows10k-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermit-ndrpdrdisc.robot:| tc13-64B-1t1c-eth-l2bdbasemaclrn-iacl1-stateless-flows100k-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermit-ndrpdrdisc.robot:| tc15-64B-1t1c-eth-l2bdbasemaclrn-iacl10-stateless-flows100k-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermit-ndrpdrdisc.robot:| tc17-64B-1t1c-eth-l2bdbasemaclrn-iacl50-stateless-flows100k-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermitreflect-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2bdbasemaclrn-iacl1-statefull-flows100-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermitreflect-ndrpdrdisc.robot:| tc03-64B-1t1c-eth-l2bdbasemaclrn-iacl10-statefull-flows100-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermitreflect-ndrpdrdisc.robot:| tc05-64B-1t1c-eth-l2bdbasemaclrn-iacl50-statefull-flows100-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermitreflect-ndrpdrdisc.robot:| tc07-64B-1t1c-eth-l2bdbasemaclrn-iacl1-statefull-flows10k-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermitreflect-ndrpdrdisc.robot:| tc09-64B-1t1c-eth-l2bdbasemaclrn-iacl10-statefull-flows10k-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermitreflect-ndrpdrdisc.robot:| tc11-64B-1t1c-eth-l2bdbasemaclrn-iacl50-statefull-flows10k-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermitreflect-ndrpdrdisc.robot:| tc13-64B-1t1c-eth-l2bdbasemaclrn-iacl1-statefull-flows100k-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermitreflect-ndrpdrdisc.robot:| tc15-64B-1t1c-eth-l2bdbasemaclrn-iacl10-statefull-flows100k-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermitreflect-ndrpdrdisc.robot:| tc17-64B-1t1c-eth-l2bdbasemaclrn-iacl50-statefull-flows100k-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermit-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2bdbasemaclrn-oacl1-stateless-flows100-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermit-ndrpdrdisc.robot:| tc03-64B-1t1c-eth-l2bdbasemaclrn-oacl10-stateless-flows100-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermit-ndrpdrdisc.robot:| tc05-64B-1t1c-eth-l2bdbasemaclrn-oacl50-stateless-flows100-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermit-ndrpdrdisc.robot:| tc07-64B-1t1c-eth-l2bdbasemaclrn-oacl1-stateless-flows10k-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermit-ndrpdrdisc.robot:| tc09-64B-1t1c-eth-l2bdbasemaclrn-oacl10-stateless-flows10k-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermit-ndrpdrdisc.robot:| tc11-64B-1t1c-eth-l2bdbasemaclrn-oacl50-stateless-flows10k-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermit-ndrpdrdisc.robot:| tc13-64B-1t1c-eth-l2bdbasemaclrn-oacl1-stateless-flows100k-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermit-ndrpdrdisc.robot:| tc15-64B-1t1c-eth-l2bdbasemaclrn-oacl10-stateless-flows100k-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermit-ndrpdrdisc.robot:| tc17-64B-1t1c-eth-l2bdbasemaclrn-oacl50-stateless-flows100k-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermitreflect-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2bdbasemaclrn-oacl1-statefull-flows100-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermitreflect-ndrpdrdisc.robot:| tc03-64B-1t1c-eth-l2bdbasemaclrn-oacl10-statefull-flows100-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermitreflect-ndrpdrdisc.robot:| tc05-64B-1t1c-eth-l2bdbasemaclrn-oacl50-statefull-flows100-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermitreflect-ndrpdrdisc.robot:| tc07-64B-1t1c-eth-l2bdbasemaclrn-oacl1-statefull-flows10k-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermitreflect-ndrpdrdisc.robot:| tc09-64B-1t1c-eth-l2bdbasemaclrn-oacl10-statefull-flows10k-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermitreflect-ndrpdrdisc.robot:| tc11-64B-1t1c-eth-l2bdbasemaclrn-oacl50-statefull-flows10k-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermitreflect-ndrpdrdisc.robot:| tc13-64B-1t1c-eth-l2bdbasemaclrn-oacl1-statefull-flows100k-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermitreflect-ndrpdrdisc.robot:| tc15-64B-1t1c-eth-l2bdbasemaclrn-oacl10-statefull-flows100k-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermitreflect-ndrpdrdisc.robot:| tc17-64B-1t1c-eth-l2bdbasemaclrn-oacl50-statefull-flows100k-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2bdbasemaclrn-ndrdisc + 10ge2p1x520-eth-l2xcbase-eth-2memif-1lxc-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2xcbase-eth-2memif-1lxc-ndrdisc + 10ge2p1x520-eth-l2xcbase-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2xcbase-ndrdisc + 10ge2p1x710-eth-l2bdbasemaclrn-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2bdbasemaclrn-ndrdisc + 40ge2p1vic1385-eth-l2bdbasemaclrn-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2bdbasemaclrn-ndrdisc + 40ge2p1xl710-eth-l2bdbasemaclrn-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2bdbasemaclrn-ndrdisc + 40ge2p1xl710-eth-l2xcbase-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2xcbase-ndrdisc VPP packet latency in 2t2c setup (2thread, 2core) is presented in the graph below. @@ -47,15 +84,16 @@ git repository: .. code-block:: bash $ cd $CSIT/tests/vpp/perf/l2 - $ grep -E "64B-2t2c-(eth|dot1q|dot1ad)-(l2xcbase|l2bdbasemaclrn)-ndrdisc" * - - 10ge2p1vic1227-eth-l2bdbasemaclrn-ndrdisc.robot:| tc07-64B-2t2c-eth-l2bdbasemaclrn-ndrdisc - 10ge2p1x520-dot1ad-l2xcbase-ndrdisc.robot:| tc07-64B-2t2c-dot1ad-l2xcbase-ndrdisc - 10ge2p1x520-dot1q-l2xcbase-ndrdisc.robot:| tc07-64B-2t2c-dot1q-l2xcbase-ndrdisc - 10ge2p1x520-eth-l2bdbasemaclrn-ndrdisc.robot:| tc07-64B-2t2c-eth-l2bdbasemaclrn-ndrdisc - 10ge2p1x520-eth-l2xcbase-ndrdisc.robot:| tc07-64B-2t2c-eth-l2xcbase-ndrdisc - 10ge2p1x710-eth-l2bdbasemaclrn-ndrdisc.robot:| tc07-64B-2t2c-eth-l2bdbasemaclrn-ndrdisc - 40ge2p1vic1385-eth-l2bdbasemaclrn-ndrdisc.robot:| tc07-64B-2t2c-eth-l2bdbasemaclrn-ndrdisc - 40ge2p1xl710-eth-l2bdbasemaclrn-ndrdisc.robot:| tc07-64B-2t2c-eth-l2bdbasemaclrn-ndrdisc - 40ge2p1xl710-eth-l2xcbase-ndrdisc.robot:| tc07-64B-2t2c-eth-l2xcbase-ndrdisc + $ grep -E "64B-2t2c-(eth|dot1q|dot1ad)-(l2xcbase|l2bdbasemaclrn)-(iacl.*|oacl.*|eth.*)*ndrdisc" * + + 10ge2p1vic1227-eth-l2bdbasemaclrn-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-l2bdbasemaclrn-ndrdisc + 10ge2p1x520-dot1ad-l2xcbase-ndrpdrdisc.robot:| tc07-64B-2t2c-dot1ad-l2xcbase-ndrdisc + 10ge2p1x520-dot1q-l2xcbase-ndrpdrdisc.robot:| tc07-64B-2t2c-dot1q-l2xcbase-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-l2bdbasemaclrn-ndrdisc + 10ge2p1x520-eth-l2xcbase-eth-2memif-1lxc-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-l2xcbase-eth-2memif-1lxc-ndrdisc + 10ge2p1x520-eth-l2xcbase-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-l2xcbase-ndrdisc + 10ge2p1x710-eth-l2bdbasemaclrn-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-l2bdbasemaclrn-ndrdisc + 40ge2p1vic1385-eth-l2bdbasemaclrn-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-l2bdbasemaclrn-ndrdisc + 40ge2p1xl710-eth-l2bdbasemaclrn-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-l2bdbasemaclrn-ndrdisc + 40ge2p1xl710-eth-l2xcbase-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-l2xcbase-ndrdisc diff --git a/docs/report/vpp_performance_tests/packet_latency_graphs/vm_vhost.rst b/docs/report/vpp_performance_tests/packet_latency_graphs/vm_vhost.rst index 59b5e8a832..01ee2a9325 100644 --- a/docs/report/vpp_performance_tests/packet_latency_graphs/vm_vhost.rst +++ b/docs/report/vpp_performance_tests/packet_latency_graphs/vm_vhost.rst @@ -26,12 +26,21 @@ git repository: 10ge2p1x520-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot:| tc01-64B-1t1c-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc 10ge2p1x520-dot1q-l2xcbase-eth-2vhost-1vm-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2xcbase-eth-2vhost-1vm-ndrdisc - 10ge2p1x520-ethip4-ip4base-eth-2vhost-1vm-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4-ip4base-eth-2vhost-1vm-ndrdisc + 10ge2p1x520-ethip4-ip4base-eth-2vhostvr1024-1vm-cfsrr1-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4-ip4base-eth-2vhostvr1024-1vm-cfsrr1-ndrdisc + 10ge2p1x520-ethip4-ip4base-eth-2vhostvr1024-1vm-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4-ip4base-eth-2vhostvr1024-1vm-ndrdisc + 10ge2p1x520-ethip4-ip4base-eth-2vhostvr256-1vm-cfsrr1-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4-ip4base-eth-2vhostvr256-1vm-cfsrr1-ndrdisc + 10ge2p1x520-ethip4-ip4base-eth-2vhostvr256-1vm-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4-ip4base-eth-2vhostvr256-1vm-ndrdisc 10ge2p1x520-ethip4-ip4base-eth-4vhost-2vm-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4-ip4base-eth-4vhost-2vm-ndrdisc 10ge2p1x520-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc - 10ge2p1x520-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-eth-2vhostvr1024-1vm-cfsrr1-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2bdbasemaclrn-eth-2vhostvr1024-1vm-cfsrr1-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-eth-2vhostvr1024-1vm-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2bdbasemaclrn-eth-2vhostvr1024-1vm-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-eth-2vhostvr256-1vm-cfsrr1-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2bdbasemaclrn-eth-2vhostvr256-1vm-cfsrr1-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-eth-2vhostvr256-1vm-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2bdbasemaclrn-eth-2vhostvr256-1vm-ndrdisc 10ge2p1x520-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrdisc - 10ge2p1x520-eth-l2xcbase-eth-2vhost-1vm-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2xcbase-eth-2vhost-1vm-ndrdisc + 10ge2p1x520-eth-l2xcbase-eth-2vhostvr1024-1vm-cfsrr1-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2xcbase-eth-2vhostvr1024-1vm-cfsrr1-ndrdisc + 10ge2p1x520-eth-l2xcbase-eth-2vhostvr1024-1vm-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2xcbase-eth-2vhostvr1024-1vm-ndrdisc + 10ge2p1x520-eth-l2xcbase-eth-2vhostvr256-1vm-cfsrr1-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2xcbase-eth-2vhostvr256-1vm-cfsrr1-ndrdisc + 10ge2p1x520-eth-l2xcbase-eth-2vhostvr256-1vm-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2xcbase-eth-2vhostvr256-1vm-ndrdisc 10ge2p1x520-eth-l2xcbase-eth-4vhost-2vm-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2xcbase-eth-4vhost-2vm-ndrdisc 10ge2p1x710-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc 40ge2p1xl710-ethip4-ip4base-eth-4vhost-2vm-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-ip4base-eth-4vhost-2vm-ndrdisc @@ -57,12 +66,21 @@ git repository: 10ge2p1x520-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot:| tc07-64B-2t2c-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc 10ge2p1x520-dot1q-l2xcbase-eth-2vhost-1vm-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-l2xcbase-eth-2vhost-1vm-ndrdisc - 10ge2p1x520-ethip4-ip4base-eth-2vhost-1vm-ndrpdrdisc.robot:| tc07-64B-2t2c-ethip4-ip4base-eth-2vhost-1vm-ndrdisc + 10ge2p1x520-ethip4-ip4base-eth-2vhostvr1024-1vm-cfsrr1-ndrpdrdisc.robot:| tc07-64B-2t2c-ethip4-ip4base-eth-2vhostvr1024-1vm-cfsrr1-ndrdisc + 10ge2p1x520-ethip4-ip4base-eth-2vhostvr1024-1vm-ndrpdrdisc.robot:| tc07-64B-2t2c-ethip4-ip4base-eth-2vhostvr1024-1vm-ndrdisc + 10ge2p1x520-ethip4-ip4base-eth-2vhostvr256-1vm-cfsrr1-ndrpdrdisc.robot:| tc07-64B-2t2c-ethip4-ip4base-eth-2vhostvr256-1vm-cfsrr1-ndrdisc + 10ge2p1x520-ethip4-ip4base-eth-2vhostvr256-1vm-ndrpdrdisc.robot:| tc07-64B-2t2c-ethip4-ip4base-eth-2vhostvr256-1vm-ndrdisc 10ge2p1x520-ethip4-ip4base-eth-4vhost-2vm-ndrpdrdisc.robot:| tc07-64B-2t2c-ethip4-ip4base-eth-4vhost-2vm-ndrdisc 10ge2p1x520-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot:| tc07-64B-2t2c-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc - 10ge2p1x520-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-eth-2vhostvr1024-1vm-cfsrr1-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-l2bdbasemaclrn-eth-2vhostvr1024-1vm-cfsrr1-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-eth-2vhostvr1024-1vm-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-l2bdbasemaclrn-eth-2vhostvr1024-1vm-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-eth-2vhostvr256-1vm-cfsrr1-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-l2bdbasemaclrn-eth-2vhostvr256-1vm-cfsrr1-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-eth-2vhostvr256-1vm-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-l2bdbasemaclrn-eth-2vhostvr256-1vm-ndrdisc 10ge2p1x520-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrdisc - 10ge2p1x520-eth-l2xcbase-eth-2vhost-1vm-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-l2xcbase-eth-2vhost-1vm-ndrdisc + 10ge2p1x520-eth-l2xcbase-eth-2vhostvr1024-1vm-cfsrr1-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-l2xcbase-eth-2vhostvr1024-1vm-cfsrr1-ndrdisc + 10ge2p1x520-eth-l2xcbase-eth-2vhostvr1024-1vm-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-l2xcbase-eth-2vhostvr1024-1vm-ndrdisc + 10ge2p1x520-eth-l2xcbase-eth-2vhostvr256-1vm-cfsrr1-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-l2xcbase-eth-2vhostvr256-1vm-cfsrr1-ndrdisc + 10ge2p1x520-eth-l2xcbase-eth-2vhostvr256-1vm-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-l2xcbase-eth-2vhostvr256-1vm-ndrdisc 10ge2p1x520-eth-l2xcbase-eth-4vhost-2vm-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-l2xcbase-eth-4vhost-2vm-ndrdisc 10ge2p1x710-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc 40ge2p1xl710-ethip4-ip4base-eth-4vhost-2vm-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-ip4base-eth-4vhost-2vm-ndrdisc diff --git a/docs/report/vpp_performance_tests/packet_throughput_graphs/index.rst b/docs/report/vpp_performance_tests/packet_throughput_graphs/index.rst index c203aa1144..91191ef412 100644 --- a/docs/report/vpp_performance_tests/packet_throughput_graphs/index.rst +++ b/docs/report/vpp_performance_tests/packet_throughput_graphs/index.rst @@ -37,9 +37,9 @@ and their indices. .. toctree:: l2 - ipv4 - ipv6 - ipv4_tunnels - ipv6_tunnels + ip4 + ip6 + ip4_tunnels + ip6_tunnels vm_vhost ipsec diff --git a/docs/report/vpp_performance_tests/packet_throughput_graphs/ipv4.rst b/docs/report/vpp_performance_tests/packet_throughput_graphs/ip4.rst similarity index 86% rename from docs/report/vpp_performance_tests/packet_throughput_graphs/ipv4.rst rename to docs/report/vpp_performance_tests/packet_throughput_graphs/ip4.rst index 89a41bcc06..a2f37af649 100644 --- a/docs/report/vpp_performance_tests/packet_throughput_graphs/ipv4.rst +++ b/docs/report/vpp_performance_tests/packet_throughput_graphs/ip4.rst @@ -24,7 +24,7 @@ git repository: .. code-block:: bash - $ cd $CSIT/tests/vpp/perf/ipv4 + $ cd $CSIT/tests/vpp/perf/ip4 $ grep -P '64B-1t1c-ethip4-ip4(base|scale)[a-z0-9]*(?!-eth-[0-9]vhost).*-ndrdisc' * 10ge2p1x520-ethip4-ip4base-copwhtlistbase-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4-ip4base-copwhtlistbase-ndrdisc @@ -35,7 +35,6 @@ git repository: 10ge2p1x520-ethip4-ip4scale200k-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4-ip4scale200k-ndrdisc 10ge2p1x520-ethip4-ip4scale20k-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4-ip4scale20k-ndrdisc 10ge2p1x520-ethip4-ip4scale2m-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4-ip4scale2m-ndrdisc - 10ge2p1x520-ethip4-ip4scale-snat-ndrpdrdisc.robot:| tc11-64B-1t1c-ethip4-ip4base-snat-4000u-15p-ndrdisc 40ge2p1xl710-ethip4-ip4base-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4-ip4base-ndrdisc VPP NDR 64B packet throughput in 2t2c setup (2thread, 2core) is presented @@ -53,7 +52,7 @@ git repository: .. code-block:: bash - $ cd $CSIT/tests/vpp/perf/ipv4 + $ cd $CSIT/tests/vpp/perf/ip4 $ grep -P '64B-2t2c-ethip4-ip4(base|scale)[a-z0-9]*(?!-eth-[0-9]vhost).*-ndrdisc' * 10ge2p1x520-ethip4-ip4base-copwhtlistbase-ndrpdrdisc.robot:| tc07-64B-2t2c-ethip4-ip4base-copwhtlistbase-ndrdisc @@ -83,19 +82,17 @@ git repository: .. code-block:: bash - $ cd $CSIT/tests/vpp/perf/ipv4 + $ cd $CSIT/tests/vpp/perf/ip4 $ grep -P '64B-1t1c-ethip4-ip4(base|scale)[a-z0-9]*(?!-eth-[0-9]vhost).*-pdrdisc' * - 10ge2p1x520-ethip4-ip4base-copwhtlistbase-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4-ip4base-copwhtlistbase-pdrdisc - 10ge2p1x520-ethip4-ip4base-iacldstbase-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4-ip4base-iacldstbase-pdrdisc - 10ge2p1x520-ethip4-ip4base-ipolicemarkbase-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4-ip4base-ipolicemarkbase-pdrdisc - 10ge2p1x520-ethip4-ip4base-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4-ip4base-pdrdisc - 10ge2p1x520-ethip4-ip4base-snat-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4-ip4base-snat-1u-1p-pdrdisc - 10ge2p1x520-ethip4-ip4scale200k-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4-ip4scale200k-pdrdisc - 10ge2p1x520-ethip4-ip4scale20k-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4-ip4scale20k-pdrdisc - 10ge2p1x520-ethip4-ip4scale2m-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4-ip4scale2m-pdrdisc - 10ge2p1x520-ethip4-ip4scale-snat-ndrpdrdisc.robot:| tc11-64B-1t1c-ethip4-ip4base-snat-4000u-15p-pdrdisc - 40ge2p1xl710-ethip4-ip4base-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4-ip4base-pdrdisc + 10ge2p1x520-ethip4-ip4base-copwhtlistbase-ndrpdrdisc.robot:| tc02-64B-1t1c-ethip4-ip4base-copwhtlistbase-pdrdisc + 10ge2p1x520-ethip4-ip4base-iacldstbase-ndrpdrdisc.robot:| tc02-64B-1t1c-ethip4-ip4base-iacldstbase-pdrdisc + 10ge2p1x520-ethip4-ip4base-ipolicemarkbase-ndrpdrdisc.robot:| tc02-64B-1t1c-ethip4-ip4base-ipolicemarkbase-pdrdisc + 10ge2p1x520-ethip4-ip4base-ndrpdrdisc.robot:| tc02-64B-1t1c-ethip4-ip4base-pdrdisc + 10ge2p1x520-ethip4-ip4base-snat-ndrpdrdisc.robot:| tc02-64B-1t1c-ethip4-ip4base-snat-1u-1p-pdrdisc + 10ge2p1x520-ethip4-ip4scale200k-ndrpdrdisc.robot:| tc02-64B-1t1c-ethip4-ip4scale200k-pdrdisc + 10ge2p1x520-ethip4-ip4scale20k-ndrpdrdisc.robot:| tc02-64B-1t1c-ethip4-ip4scale20k-pdrdisc + 10ge2p1x520-ethip4-ip4scale2m-ndrpdrdisc.robot:| tc02-64B-1t1c-ethip4-ip4scale2m-pdrdisc VPP PDR 64B packet throughput in 2t2c setup (2thread, 2core) is presented in the graph below. PDR measured for 0.5% packet loss ratio. diff --git a/docs/report/vpp_performance_tests/packet_throughput_graphs/ipv4_tunnels.rst b/docs/report/vpp_performance_tests/packet_throughput_graphs/ip4_tunnels.rst similarity index 96% rename from docs/report/vpp_performance_tests/packet_throughput_graphs/ipv4_tunnels.rst rename to docs/report/vpp_performance_tests/packet_throughput_graphs/ip4_tunnels.rst index e1204af9ec..39432ca10b 100644 --- a/docs/report/vpp_performance_tests/packet_throughput_graphs/ipv4_tunnels.rst +++ b/docs/report/vpp_performance_tests/packet_throughput_graphs/ip4_tunnels.rst @@ -25,7 +25,7 @@ git repository: .. code-block:: bash - $ cd $CSIT/tests/vpp/perf/ipv4_tunnels + $ cd $CSIT/tests/vpp/perf/ip4_tunnels $ grep -E "64B-1t1c-ethip4[a-z0-9]+-[a-z0-9]*-ndrdisc" * 10ge2p1x520-ethip4lispip4-ip4base-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4lispip4-ip4base-ndrdisc @@ -47,7 +47,7 @@ git repository: .. code-block:: bash - $ cd $CSIT/tests/vpp/perf/ipv4_tunnels + $ cd $CSIT/tests/vpp/perf/ip4_tunnels $ grep -E "64B-2t2c-ethip4[a-z0-9]+-[a-z0-9]*-ndrdisc" * 10ge2p1x520-ethip4lispip4-ip4base-ndrpdrdisc.robot:| tc07-64B-2t2c-ethip4lispip4-ip4base-ndrdisc @@ -73,7 +73,7 @@ git repository: .. code-block:: bash - $ cd $CSIT/tests/vpp/perf/ipv4_tunnels + $ cd $CSIT/tests/vpp/perf/ip4_tunnels $ grep -E "64B-1t1c-ethip4[a-z0-9]+-[a-z0-9]*-pdrdisc" * 10ge2p1x520-ethip4lispip4-ip4base-ndrpdrdisc.robot:| tc02-64B-1t1c-ethip4lispip4-ip4base-pdrdisc @@ -95,7 +95,7 @@ git repository: .. code-block:: bash - $ cd $CSIT/tests/vpp/perf/ipv4_tunnels + $ cd $CSIT/tests/vpp/perf/ip4_tunnels $ grep -E "64B-2t2c-ethip4[a-z0-9]+-[a-z0-9]*-pdrdisc" * 10ge2p1x520-ethip4lispip4-ip4base-ndrpdrdisc.robot:| tc08-64B-2t2c-ethip4lispip4-ip4base-pdrdisc diff --git a/docs/report/vpp_performance_tests/packet_throughput_graphs/ipv6.rst b/docs/report/vpp_performance_tests/packet_throughput_graphs/ip6.rst similarity index 97% rename from docs/report/vpp_performance_tests/packet_throughput_graphs/ipv6.rst rename to docs/report/vpp_performance_tests/packet_throughput_graphs/ip6.rst index 4331f492f5..09a44884c2 100644 --- a/docs/report/vpp_performance_tests/packet_throughput_graphs/ipv6.rst +++ b/docs/report/vpp_performance_tests/packet_throughput_graphs/ip6.rst @@ -25,7 +25,7 @@ git repository: .. code-block:: bash - $ cd $CSIT/tests/vpp/perf/ipv6 + $ cd $CSIT/tests/vpp/perf/ip6 $ grep -E "78B-1t1c-ethip6-ip6[a-z0-9]+-[a-z-]*ndrdisc" * 10ge2p1x520-ethip6-ip6base-copwhtlistbase-ndrpdrdisc.robot:| tc01-78B-1t1c-ethip6-ip6base-copwhtlistbase-ndrdisc @@ -51,7 +51,7 @@ git repository: .. code-block:: bash - $ cd $CSIT/tests/vpp/perf/ipv6 + $ cd $CSIT/tests/vpp/perf/ip6 $ grep -E "78B-2t2c-ethip6-ip6[a-z0-9]+-[a-z-]*ndrdisc" * 10ge2p1x520-ethip6-ip6base-copwhtlistbase-ndrpdrdisc.robot:| tc07-78B-2t2c-ethip6-ip6base-copwhtlistbase-ndrdisc @@ -80,7 +80,7 @@ git repository: .. code-block:: bash - $ cd $CSIT/tests/vpp/perf/ipv6 + $ cd $CSIT/tests/vpp/perf/ip6 $ grep -E "78B-1t1c-ethip6-ip6[a-z0-9]+-[a-z-]*pdrdisc" * 10ge2p1x520-ethip6-ip6base-copwhtlistbase-ndrpdrdisc.robot:| tc02-78B-1t1c-ethip6-ip6base-copwhtlistbase-pdrdisc @@ -105,7 +105,7 @@ git repository: .. code-block:: bash - $ cd $CSIT/tests/vpp/perf/ipv6 + $ cd $CSIT/tests/vpp/perf/ip6 $ grep -E "78B-2t2c-ethip6-ip6[a-z0-9]+-[a-z-]*pdrdisc" * 10ge2p1x520-ethip6-ip6base-copwhtlistbase-ndrpdrdisc.robot:| tc08-78B-2t2c-ethip6-ip6base-copwhtlistbase-pdrdisc @@ -114,4 +114,3 @@ git repository: 10ge2p1x520-ethip6-ip6scale200k-ndrpdrdisc.robot:| tc08-78B-2t2c-ethip6-ip6scale200k-pdrdisc 10ge2p1x520-ethip6-ip6scale20k-ndrpdrdisc.robot:| tc08-78B-2t2c-ethip6-ip6scale20k-pdrdisc 10ge2p1x520-ethip6-ip6scale2m-ndrpdrdisc.robot:| tc08-78B-2t2c-ethip6-ip6scale2m-pdrdisc - diff --git a/docs/report/vpp_performance_tests/packet_throughput_graphs/ipv6_tunnels.rst b/docs/report/vpp_performance_tests/packet_throughput_graphs/ip6_tunnels.rst similarity index 95% rename from docs/report/vpp_performance_tests/packet_throughput_graphs/ipv6_tunnels.rst rename to docs/report/vpp_performance_tests/packet_throughput_graphs/ip6_tunnels.rst index 283d79613e..b54bdfeccd 100644 --- a/docs/report/vpp_performance_tests/packet_throughput_graphs/ipv6_tunnels.rst +++ b/docs/report/vpp_performance_tests/packet_throughput_graphs/ip6_tunnels.rst @@ -25,7 +25,7 @@ git repository: .. code-block:: bash - $ cd $CSIT/tests/vpp/perf/ipv6_tunnels + $ cd $CSIT/tests/vpp/perf/ip6_tunnels $ grep -E "78B-1t1c-ethip6[a-z0-9]+-[a-z0-9]*-ndrdisc" * 10ge2p1x520-ethip6lispip4-ip6base-ndrdisc.robot:| tc01-78B-1t1c-ethip6lispip4-ip6base-ndrdisc @@ -46,7 +46,7 @@ git repository: .. code-block:: bash - $ cd $CSIT/tests/vpp/perf/ipv6_tunnels + $ cd $CSIT/tests/vpp/perf/ip6_tunnels $ grep -E "78B-2t2c-ethip6[a-z0-9]+-[a-z0-9]*-ndrdisc" * 10ge2p1x520-ethip6lispip4-ip6base-ndrdisc.robot:| tc07-78B-2t2c-ethip6lispip4-ip6base-ndrdisc @@ -70,7 +70,7 @@ git repository: .. code-block:: bash - $ cd $CSIT/tests/vpp/perf/ipv6_tunnels + $ cd $CSIT/tests/vpp/perf/ip6_tunnels $ grep -E "78B-1t1c-ethip6[a-z0-9]+-[a-z0-9]*-pdrdisc" * 10ge2p1x520-ethip6lispip4-ip6base-ndrdisc.robot:| tc02-78B-1t1c-ethip6lispip4-ip6base-pdrdisc @@ -91,7 +91,7 @@ git repository: .. code-block:: bash - $ cd $CSIT/tests/vpp/perf/ipv6_tunnels + $ cd $CSIT/tests/vpp/perf/ip6_tunnels $ grep -E "78B-2t2c-ethip6[a-z0-9]+-[a-z0-9]*-pdrdisc" * 10ge2p1x520-ethip6lispip4-ip6base-ndrdisc.robot:| tc08-78B-2t2c-ethip6lispip4-ip6base-pdrdisc diff --git a/docs/report/vpp_performance_tests/packet_throughput_graphs/ipsec.rst b/docs/report/vpp_performance_tests/packet_throughput_graphs/ipsec.rst index 1a519ecbe6..9f9fc8b4f0 100644 --- a/docs/report/vpp_performance_tests/packet_throughput_graphs/ipsec.rst +++ b/docs/report/vpp_performance_tests/packet_throughput_graphs/ipsec.rst @@ -35,17 +35,16 @@ git repository: $ cd $CSIT/tests/vpp/perf/crypto $ grep -E "64B-1t1c-.*ipsec.*-ndrdisc" * - 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-interfaces-aes-gcm-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4ipsecscale1ip4-ip4base-interfaces-aes-gcm-ndrdisc - 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-interfaces-aes-gcm-ndrpdrdisc.robot:| tc03-64B-1t1c-ethip4ipsecscale1000ip4-ip4base-interfaces-aes-gcm-ndrdisc - {NOT PLOTTED} 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-interfaces-cbc-sha1-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4ipsecscale1ip4-ip4base-interfaces-cbc-sha1-ndrdisc - 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-interfaces-cbc-sha1-ndrpdrdisc.robot:| tc03-64B-1t1c-ethip4ipsecscale1000ip4-ip4base-interfaces-cbc-sha1-ndrdisc - {NOT PLOTTED} 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-tunnels-aes-gcm-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4ipsecscale1ip4-ip4base-tunnels-aes-gcm-ndrdisc - 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-tunnels-aes-gcm-ndrpdrdisc.robot:| tc03-64B-1t1c-ethip4ipsecscale1000ip4-ip4base-tunnels-aes-gcm-ndrdisc - {NOT PLOTTED} 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-tunnels-cbc-sha1-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4ipsecscale1ip4-ip4base-tunnels-cbc-sha1-ndrdisc - 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-tunnels-cbc-sha1-ndrpdrdisc.robot:| tc03-64B-1t1c-ethip4ipsecscale1000ip4-ip4base-tunnels-cbc-sha1-ndrdisc + 40ge2p1xl710-ethip4ipsecbasetnl-ip4base-int-aes-gcm-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4ipsecbasetnl-ip4base-int-aes-gcm-ndrdisc + 40ge2p1xl710-ethip4ipsecbasetnl-ip4base-int-cbc-sha1-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4ipsecbasetnl-ip4base-int-cbc-sha1-ndrdisc + 40ge2p1xl710-ethip4ipsecbasetnl-ip4base-tnl-aes-gcm-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4ipsecbasetnl-ip4base-tnl-aes-gcm-ndrdisc + 40ge2p1xl710-ethip4ipsecbasetnl-ip4base-tnl-cbc-sha1-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4ipsecbasetnl-ip4base-tnl-cbc-sha1-ndrdisc + 40ge2p1xl710-ethip4ipsecscale1000tnl-ip4base-int-aes-gcm-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4ipsecscale1000tnl-ip4base-int-aes-gcm-ndrdisc + 40ge2p1xl710-ethip4ipsecscale1000tnl-ip4base-int-cbc-sha1-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4ipsecscale1000tnl-ip4base-int-cbc-sha1-ndrdisc + 40ge2p1xl710-ethip4ipsecscale1000tnl-ip4base-tnl-aes-gcm-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4ipsecscale1000tnl-ip4base-tnl-aes-gcm-ndrdisc + 40ge2p1xl710-ethip4ipsecscale1000tnl-ip4base-tnl-cbc-sha1-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4ipsecscale1000tnl-ip4base-tnl-cbc-sha1-ndrdisc 40ge2p1xl710-ethip4ipsectptlispgpe-ip4base-cbc-sha1-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4ipsectptlispgpe-ip4base-cbc-sha1-ndrdisc - VPP NDR 64B packet throughput in 2t2c setup (2thread, 2core) is presented in the graph below. @@ -63,14 +62,14 @@ git repository: $ cd $CSIT/tests/vpp/perf/crypto $ grep -E "64B-2t2c-.*ipsec.*-ndrdisc" * - 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-interfaces-aes-gcm-ndrpdrdisc.robot:| tc13-64B-2t2c-ethip4ipsecscale1ip4-ip4base-interfaces-aes-gcm-ndrdisc - 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-interfaces-aes-gcm-ndrpdrdisc.robot:| tc15-64B-2t2c-ethip4ipsecscale1000ip4-ip4base-interfaces-aes-gcm-ndrdisc - {NOT PLOTTED} 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-interfaces-cbc-sha1-ndrpdrdisc.robot:| tc13-64B-2t2c-ethip4ipsecscale1ip4-ip4base-interfaces-cbc-sha1-ndrdisc - 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-interfaces-cbc-sha1-ndrpdrdisc.robot:| tc15-64B-2t2c-ethip4ipsecscale1000ip4-ip4base-interfaces-cbc-sha1-ndrdisc - {NOT PLOTTED} 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-tunnels-aes-gcm-ndrpdrdisc.robot:| tc13-64B-2t2c-ethip4ipsecscale1ip4-ip4base-tunnels-aes-gcm-ndrdisc - 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-tunnels-aes-gcm-ndrpdrdisc.robot:| tc15-64B-2t2c-ethip4ipsecscale1000ip4-ip4base-tunnels-aes-gcm-ndrdisc - {NOT PLOTTED} 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-tunnels-cbc-sha1-ndrpdrdisc.robot:| tc13-64B-2t2c-ethip4ipsecscale1ip4-ip4base-tunnels-cbc-sha1-ndrdisc - 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-tunnels-cbc-sha1-ndrpdrdisc.robot:| tc15-64B-2t2c-ethip4ipsecscale1000ip4-ip4base-tunnels-cbc-sha1-ndrdisc + 40ge2p1xl710-ethip4ipsecbasetnl-ip4base-int-aes-gcm-ndrpdrdisc.robot:| tc07-64B-2t2c-ethip4ipsecbasetnl-ip4base-int-aes-gcm-ndrdisc + 40ge2p1xl710-ethip4ipsecbasetnl-ip4base-int-cbc-sha1-ndrpdrdisc.robot:| tc07-64B-2t2c-ethip4ipsecbasetnl-ip4base-int-cbc-sha1-ndrdisc + 40ge2p1xl710-ethip4ipsecbasetnl-ip4base-tnl-aes-gcm-ndrpdrdisc.robot:| tc07-64B-2t2c-ethip4ipsecbasetnl-ip4base-tnl-aes-gcm-ndrdisc + 40ge2p1xl710-ethip4ipsecbasetnl-ip4base-tnl-cbc-sha1-ndrpdrdisc.robot:| tc07-64B-2t2c-ethip4ipsecbasetnl-ip4base-tnl-cbc-sha1-ndrdisc + 40ge2p1xl710-ethip4ipsecscale1000tnl-ip4base-int-aes-gcm-ndrpdrdisc.robot:| tc07-64B-2t2c-ethip4ipsecscale1000tnl-ip4base-int-aes-gcm-ndrdisc + 40ge2p1xl710-ethip4ipsecscale1000tnl-ip4base-int-cbc-sha1-ndrpdrdisc.robot:| tc07-64B-2t2c-ethip4ipsecscale1000tnl-ip4base-int-cbc-sha1-ndrdisc + 40ge2p1xl710-ethip4ipsecscale1000tnl-ip4base-tnl-aes-gcm-ndrpdrdisc.robot:| tc07-64B-2t2c-ethip4ipsecscale1000tnl-ip4base-tnl-aes-gcm-ndrdisc + 40ge2p1xl710-ethip4ipsecscale1000tnl-ip4base-tnl-cbc-sha1-ndrpdrdisc.robot:| tc07-64B-2t2c-ethip4ipsecscale1000tnl-ip4base-tnl-cbc-sha1-ndrdisc 40ge2p1xl710-ethip4ipsectptlispgpe-ip4base-cbc-sha1-ndrpdrdisc.robot:| tc07-64B-2t2c-ethip4ipsectptlispgpe-ip4base-cbc-sha1-ndrdisc PDR Throughput @@ -93,17 +92,16 @@ git repository: $ cd $CSIT/tests/vpp/perf/crypto $ grep -E "64B-1t1c-.*ipsec.*-pdrdisc" * - 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-interfaces-aes-gcm-ndrpdrdisc.robot:| tc02-64B-1t1c-ethip4ipsecscale1ip4-ip4base-interfaces-aes-gcm-pdrdisc - 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-interfaces-aes-gcm-ndrpdrdisc.robot:| tc04-64B-1t1c-ethip4ipsecscale1000ip4-ip4base-interfaces-aes-gcm-pdrdisc - {NOT PLOTTED} 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-interfaces-cbc-sha1-ndrpdrdisc.robot:| tc02-64B-1t1c-ethip4ipsecscale1ip4-ip4base-interfaces-cbc-sha1-pdrdisc - 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-interfaces-cbc-sha1-ndrpdrdisc.robot:| tc04-64B-1t1c-ethip4ipsecscale1000ip4-ip4base-interfaces-cbc-sha1-pdrdisc - {NOT PLOTTED} 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-tunnels-aes-gcm-ndrpdrdisc.robot:| tc02-64B-1t1c-ethip4ipsecscale1ip4-ip4base-tunnels-aes-gcm-pdrdisc - 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-tunnels-aes-gcm-ndrpdrdisc.robot:| tc04-64B-1t1c-ethip4ipsecscale1000ip4-ip4base-tunnels-aes-gcm-pdrdisc - {NOT PLOTTED} 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-tunnels-cbc-sha1-ndrpdrdisc.robot:| tc02-64B-1t1c-ethip4ipsecscale1ip4-ip4base-tunnels-cbc-sha1-pdrdisc - 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-tunnels-cbc-sha1-ndrpdrdisc.robot:| tc04-64B-1t1c-ethip4ipsecscale1000ip4-ip4base-tunnels-cbc-sha1-pdrdisc + 40ge2p1xl710-ethip4ipsecbasetnl-ip4base-int-aes-gcm-ndrpdrdisc.robot:| tc02-64B-1t1c-ethip4ipsecbasetnl-ip4base-int-aes-gcm-pdrdisc + 40ge2p1xl710-ethip4ipsecbasetnl-ip4base-int-cbc-sha1-ndrpdrdisc.robot:| tc02-64B-1t1c-ethip4ipsecbasetnl-ip4base-int-cbc-sha1-pdrdisc + 40ge2p1xl710-ethip4ipsecbasetnl-ip4base-tnl-aes-gcm-ndrpdrdisc.robot:| tc02-64B-1t1c-ethip4ipsecbasetnl-ip4base-tnl-aes-gcm-pdrdisc + 40ge2p1xl710-ethip4ipsecbasetnl-ip4base-tnl-cbc-sha1-ndrpdrdisc.robot:| tc02-64B-1t1c-ethip4ipsecbasetnl-ip4base-tnl-cbc-sha1-pdrdisc + 40ge2p1xl710-ethip4ipsecscale1000tnl-ip4base-int-aes-gcm-ndrpdrdisc.robot:| tc02-64B-1t1c-ethip4ipsecscale1000tnl-ip4base-int-aes-gcm-pdrdisc + 40ge2p1xl710-ethip4ipsecscale1000tnl-ip4base-int-cbc-sha1-ndrpdrdisc.robot:| tc02-64B-1t1c-ethip4ipsecscale1000tnl-ip4base-int-cbc-sha1-pdrdisc + 40ge2p1xl710-ethip4ipsecscale1000tnl-ip4base-tnl-aes-gcm-ndrpdrdisc.robot:| tc02-64B-1t1c-ethip4ipsecscale1000tnl-ip4base-tnl-aes-gcm-pdrdisc + 40ge2p1xl710-ethip4ipsecscale1000tnl-ip4base-tnl-cbc-sha1-ndrpdrdisc.robot:| tc02-64B-1t1c-ethip4ipsecscale1000tnl-ip4base-tnl-cbc-sha1-pdrdisc 40ge2p1xl710-ethip4ipsectptlispgpe-ip4base-cbc-sha1-ndrpdrdisc.robot:| tc02-64B-1t1c-ethip4ipsectptlispgpe-ip4base-cbc-sha1-pdrdisc - VPP PDR 64B packet throughput in 2t2c setup (2thread, 2core) is presented in the graph below. PDR measured for 0.5% packet loss ratio. @@ -121,13 +119,12 @@ git repository: $ cd $CSIT/tests/vpp/perf/crypto $ grep -E "64B-2t2c-.*ipsec.*-pdrdisc" * - 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-interfaces-aes-gcm-ndrpdrdisc.robot:| tc14-64B-2t2c-ethip4ipsecscale1ip4-ip4base-interfaces-aes-gcm-pdrdisc - 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-interfaces-aes-gcm-ndrpdrdisc.robot:| tc16-64B-2t2c-ethip4ipsecscale1000ip4-ip4base-interfaces-aes-gcm-pdrdisc - {NOT PLOTTED} 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-interfaces-cbc-sha1-ndrpdrdisc.robot:| tc14-64B-2t2c-ethip4ipsecscale1ip4-ip4base-interfaces-cbc-sha1-pdrdisc - 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-interfaces-cbc-sha1-ndrpdrdisc.robot:| tc16-64B-2t2c-ethip4ipsecscale1000ip4-ip4base-interfaces-cbc-sha1-pdrdisc - {NOT PLOTTED} 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-tunnels-aes-gcm-ndrpdrdisc.robot:| tc14-64B-2t2c-ethip4ipsecscale1ip4-ip4base-tunnels-aes-gcm-pdrdisc - 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-tunnels-aes-gcm-ndrpdrdisc.robot:| tc16-64B-2t2c-ethip4ipsecscale1000ip4-ip4base-tunnels-aes-gcm-pdrdisc - {NOT PLOTTED} 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-tunnels-cbc-sha1-ndrpdrdisc.robot:| tc14-64B-2t2c-ethip4ipsecscale1ip4-ip4base-tunnels-cbc-sha1-pdrdisc - 40ge2p1xl710-ethip4ipsecscaleip4-ip4base-tunnels-cbc-sha1-ndrpdrdisc.robot:| tc16-64B-2t2c-ethip4ipsecscale1000ip4-ip4base-tunnels-cbc-sha1-pdrdisc + 40ge2p1xl710-ethip4ipsecbasetnl-ip4base-int-aes-gcm-ndrpdrdisc.robot:| tc08-64B-2t2c-ethip4ipsecbasetnl-ip4base-int-aes-gcm-pdrdisc + 40ge2p1xl710-ethip4ipsecbasetnl-ip4base-int-cbc-sha1-ndrpdrdisc.robot:| tc08-64B-2t2c-ethip4ipsecbasetnl-ip4base-int-cbc-sha1-pdrdisc + 40ge2p1xl710-ethip4ipsecbasetnl-ip4base-tnl-aes-gcm-ndrpdrdisc.robot:| tc08-64B-2t2c-ethip4ipsecbasetnl-ip4base-tnl-aes-gcm-pdrdisc + 40ge2p1xl710-ethip4ipsecbasetnl-ip4base-tnl-cbc-sha1-ndrpdrdisc.robot:| tc08-64B-2t2c-ethip4ipsecbasetnl-ip4base-tnl-cbc-sha1-pdrdisc + 40ge2p1xl710-ethip4ipsecscale1000tnl-ip4base-int-aes-gcm-ndrpdrdisc.robot:| tc08-64B-2t2c-ethip4ipsecscale1000tnl-ip4base-int-aes-gcm-pdrdisc + 40ge2p1xl710-ethip4ipsecscale1000tnl-ip4base-int-cbc-sha1-ndrpdrdisc.robot:| tc08-64B-2t2c-ethip4ipsecscale1000tnl-ip4base-int-cbc-sha1-pdrdisc + 40ge2p1xl710-ethip4ipsecscale1000tnl-ip4base-tnl-aes-gcm-ndrpdrdisc.robot:| tc08-64B-2t2c-ethip4ipsecscale1000tnl-ip4base-tnl-aes-gcm-pdrdisc + 40ge2p1xl710-ethip4ipsecscale1000tnl-ip4base-tnl-cbc-sha1-ndrpdrdisc.robot:| tc08-64B-2t2c-ethip4ipsecscale1000tnl-ip4base-tnl-cbc-sha1-pdrdisc 40ge2p1xl710-ethip4ipsectptlispgpe-ip4base-cbc-sha1-ndrpdrdisc.robot:| tc08-64B-2t2c-ethip4ipsectptlispgpe-ip4base-cbc-sha1-pdrdisc - diff --git a/docs/report/vpp_performance_tests/packet_throughput_graphs/l2.rst b/docs/report/vpp_performance_tests/packet_throughput_graphs/l2.rst index d097d64c9c..e34786f0a5 100644 --- a/docs/report/vpp_performance_tests/packet_throughput_graphs/l2.rst +++ b/docs/report/vpp_performance_tests/packet_throughput_graphs/l2.rst @@ -26,12 +26,49 @@ git repository: .. code-block:: bash $ cd $CSIT/tests/vpp/perf/l2 - $ grep -E "64B-1t1c-(eth|dot1q|dot1ad)-(l2xcbase|l2bdbasemaclrn)-ndrdisc" * + $ grep -E "64B-1t1c-(eth|dot1q|dot1ad)-(l2xcbase|l2bdbasemaclrn)-(iacl.*|oacl.*|eth.*)*ndrdisc" * 10ge2p1vic1227-eth-l2bdbasemaclrn-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2bdbasemaclrn-ndrdisc 10ge2p1x520-dot1ad-l2xcbase-ndrpdrdisc.robot:| tc01-64B-1t1c-dot1ad-l2xcbase-ndrdisc 10ge2p1x520-dot1q-l2xcbase-ndrpdrdisc.robot:| tc01-64B-1t1c-dot1q-l2xcbase-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermit-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2bdbasemaclrn-iacl1-stateless-flows100-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermit-ndrpdrdisc.robot:| tc03-64B-1t1c-eth-l2bdbasemaclrn-iacl10-stateless-flows100-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermit-ndrpdrdisc.robot:| tc05-64B-1t1c-eth-l2bdbasemaclrn-iacl50-stateless-flows100-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermit-ndrpdrdisc.robot:| tc07-64B-1t1c-eth-l2bdbasemaclrn-iacl1-stateless-flows10k-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermit-ndrpdrdisc.robot:| tc09-64B-1t1c-eth-l2bdbasemaclrn-iacl10-stateless-flows10k-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermit-ndrpdrdisc.robot:| tc11-64B-1t1c-eth-l2bdbasemaclrn-iacl50-stateless-flows10k-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermit-ndrpdrdisc.robot:| tc13-64B-1t1c-eth-l2bdbasemaclrn-iacl1-stateless-flows100k-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermit-ndrpdrdisc.robot:| tc15-64B-1t1c-eth-l2bdbasemaclrn-iacl10-stateless-flows100k-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermit-ndrpdrdisc.robot:| tc17-64B-1t1c-eth-l2bdbasemaclrn-iacl50-stateless-flows100k-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermitreflect-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2bdbasemaclrn-iacl1-statefull-flows100-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermitreflect-ndrpdrdisc.robot:| tc03-64B-1t1c-eth-l2bdbasemaclrn-iacl10-statefull-flows100-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermitreflect-ndrpdrdisc.robot:| tc05-64B-1t1c-eth-l2bdbasemaclrn-iacl50-statefull-flows100-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermitreflect-ndrpdrdisc.robot:| tc07-64B-1t1c-eth-l2bdbasemaclrn-iacl1-statefull-flows10k-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermitreflect-ndrpdrdisc.robot:| tc09-64B-1t1c-eth-l2bdbasemaclrn-iacl10-statefull-flows10k-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermitreflect-ndrpdrdisc.robot:| tc11-64B-1t1c-eth-l2bdbasemaclrn-iacl50-statefull-flows10k-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermitreflect-ndrpdrdisc.robot:| tc13-64B-1t1c-eth-l2bdbasemaclrn-iacl1-statefull-flows100k-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermitreflect-ndrpdrdisc.robot:| tc15-64B-1t1c-eth-l2bdbasemaclrn-iacl10-statefull-flows100k-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermitreflect-ndrpdrdisc.robot:| tc17-64B-1t1c-eth-l2bdbasemaclrn-iacl50-statefull-flows100k-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermit-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2bdbasemaclrn-oacl1-stateless-flows100-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermit-ndrpdrdisc.robot:| tc03-64B-1t1c-eth-l2bdbasemaclrn-oacl10-stateless-flows100-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermit-ndrpdrdisc.robot:| tc05-64B-1t1c-eth-l2bdbasemaclrn-oacl50-stateless-flows100-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermit-ndrpdrdisc.robot:| tc07-64B-1t1c-eth-l2bdbasemaclrn-oacl1-stateless-flows10k-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermit-ndrpdrdisc.robot:| tc09-64B-1t1c-eth-l2bdbasemaclrn-oacl10-stateless-flows10k-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermit-ndrpdrdisc.robot:| tc11-64B-1t1c-eth-l2bdbasemaclrn-oacl50-stateless-flows10k-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermit-ndrpdrdisc.robot:| tc13-64B-1t1c-eth-l2bdbasemaclrn-oacl1-stateless-flows100k-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermit-ndrpdrdisc.robot:| tc15-64B-1t1c-eth-l2bdbasemaclrn-oacl10-stateless-flows100k-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermit-ndrpdrdisc.robot:| tc17-64B-1t1c-eth-l2bdbasemaclrn-oacl50-stateless-flows100k-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermitreflect-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2bdbasemaclrn-oacl1-statefull-flows100-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermitreflect-ndrpdrdisc.robot:| tc03-64B-1t1c-eth-l2bdbasemaclrn-oacl10-statefull-flows100-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermitreflect-ndrpdrdisc.robot:| tc05-64B-1t1c-eth-l2bdbasemaclrn-oacl50-statefull-flows100-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermitreflect-ndrpdrdisc.robot:| tc07-64B-1t1c-eth-l2bdbasemaclrn-oacl1-statefull-flows10k-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermitreflect-ndrpdrdisc.robot:| tc09-64B-1t1c-eth-l2bdbasemaclrn-oacl10-statefull-flows10k-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermitreflect-ndrpdrdisc.robot:| tc11-64B-1t1c-eth-l2bdbasemaclrn-oacl50-statefull-flows10k-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermitreflect-ndrpdrdisc.robot:| tc13-64B-1t1c-eth-l2bdbasemaclrn-oacl1-statefull-flows100k-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermitreflect-ndrpdrdisc.robot:| tc15-64B-1t1c-eth-l2bdbasemaclrn-oacl10-statefull-flows100k-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermitreflect-ndrpdrdisc.robot:| tc17-64B-1t1c-eth-l2bdbasemaclrn-oacl50-statefull-flows100k-ndrdisc 10ge2p1x520-eth-l2bdbasemaclrn-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2bdbasemaclrn-ndrdisc + 10ge2p1x520-eth-l2xcbase-eth-2memif-1lxc-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2xcbase-eth-2memif-1lxc-ndrdisc 10ge2p1x520-eth-l2xcbase-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2xcbase-ndrdisc 10ge2p1x710-eth-l2bdbasemaclrn-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2bdbasemaclrn-ndrdisc 40ge2p1vic1385-eth-l2bdbasemaclrn-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2bdbasemaclrn-ndrdisc @@ -54,12 +91,13 @@ git repository: .. code-block:: bash $ cd $CSIT/tests/vpp/perf/l2 - $ grep -E "64B-2t2c-(eth|dot1q|dot1ad)-(l2xcbase|l2bdbasemaclrn)-ndrdisc" * + $ grep -E "64B-2t2c-(eth|dot1q|dot1ad)-(l2xcbase|l2bdbasemaclrn)-(iacl.*|oacl.*|eth.*)*ndrdisc" * 10ge2p1vic1227-eth-l2bdbasemaclrn-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-l2bdbasemaclrn-ndrdisc 10ge2p1x520-dot1ad-l2xcbase-ndrpdrdisc.robot:| tc07-64B-2t2c-dot1ad-l2xcbase-ndrdisc 10ge2p1x520-dot1q-l2xcbase-ndrpdrdisc.robot:| tc07-64B-2t2c-dot1q-l2xcbase-ndrdisc 10ge2p1x520-eth-l2bdbasemaclrn-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-l2bdbasemaclrn-ndrdisc + 10ge2p1x520-eth-l2xcbase-eth-2memif-1lxc-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-l2xcbase-eth-2memif-1lxc-ndrdisc 10ge2p1x520-eth-l2xcbase-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-l2xcbase-ndrdisc 10ge2p1x710-eth-l2bdbasemaclrn-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-l2bdbasemaclrn-ndrdisc 40ge2p1vic1385-eth-l2bdbasemaclrn-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-l2bdbasemaclrn-ndrdisc @@ -90,7 +128,44 @@ git repository: 10ge2p1vic1227-eth-l2bdbasemaclrn-ndrpdrdisc.robot:| tc02-64B-1t1c-eth-l2bdbasemaclrn-pdrdisc 10ge2p1x520-dot1ad-l2xcbase-ndrpdrdisc.robot:| tc02-64B-1t1c-dot1ad-l2xcbase-pdrdisc 10ge2p1x520-dot1q-l2xcbase-ndrpdrdisc.robot:| tc02-64B-1t1c-dot1q-l2xcbase-pdrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermit-ndrpdrdisc.robot:| tc02-64B-1t1c-eth-l2bdbasemaclrn-iacl1-stateless-flows100-pdrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermit-ndrpdrdisc.robot:| tc04-64B-1t1c-eth-l2bdbasemaclrn-iacl10-stateless-flows100-pdrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermit-ndrpdrdisc.robot:| tc06-64B-1t1c-eth-l2bdbasemaclrn-iacl50-stateless-flows100-pdrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermit-ndrpdrdisc.robot:| tc08-64B-1t1c-eth-l2bdbasemaclrn-iacl1-stateless-flows10k-pdrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermit-ndrpdrdisc.robot:| tc10-64B-1t1c-eth-l2bdbasemaclrn-iacl10-stateless-flows10k-pdrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermit-ndrpdrdisc.robot:| tc12-64B-1t1c-eth-l2bdbasemaclrn-iacl50-stateless-flows10k-pdrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermit-ndrpdrdisc.robot:| tc14-64B-1t1c-eth-l2bdbasemaclrn-iacl1-stateless-flows100k-pdrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermit-ndrpdrdisc.robot:| tc16-64B-1t1c-eth-l2bdbasemaclrn-iacl10-stateless-flows100k-pdrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermit-ndrpdrdisc.robot:| tc18-64B-1t1c-eth-l2bdbasemaclrn-iacl50-stateless-flows100k-pdrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermitreflect-ndrpdrdisc.robot:| tc02-64B-1t1c-eth-l2bdbasemaclrn-iacl1-statefull-flows100-pdrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermitreflect-ndrpdrdisc.robot:| tc04-64B-1t1c-eth-l2bdbasemaclrn-iacl10-statefull-flows100-pdrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermitreflect-ndrpdrdisc.robot:| tc06-64B-1t1c-eth-l2bdbasemaclrn-iacl50-statefull-flows100-pdrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermitreflect-ndrpdrdisc.robot:| tc08-64B-1t1c-eth-l2bdbasemaclrn-iacl1-statefull-flows10k-pdrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermitreflect-ndrpdrdisc.robot:| tc10-64B-1t1c-eth-l2bdbasemaclrn-iacl10-statefull-flows10k-pdrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermitreflect-ndrpdrdisc.robot:| tc12-64B-1t1c-eth-l2bdbasemaclrn-iacl50-statefull-flows10k-pdrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermitreflect-ndrpdrdisc.robot:| tc14-64B-1t1c-eth-l2bdbasemaclrn-iacl1-statefull-flows100k-pdrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermitreflect-ndrpdrdisc.robot:| tc16-64B-1t1c-eth-l2bdbasemaclrn-iacl10-statefull-flows100k-pdrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-aclinpermitreflect-ndrpdrdisc.robot:| tc18-64B-1t1c-eth-l2bdbasemaclrn-iacl50-statefull-flows100k-pdrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermit-ndrpdrdisc.robot:| tc02-64B-1t1c-eth-l2bdbasemaclrn-oacl1-stateless-flows100-pdrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermit-ndrpdrdisc.robot:| tc04-64B-1t1c-eth-l2bdbasemaclrn-oacl10-stateless-flows100-pdrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermit-ndrpdrdisc.robot:| tc06-64B-1t1c-eth-l2bdbasemaclrn-oacl50-stateless-flows100-pdrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermit-ndrpdrdisc.robot:| tc08-64B-1t1c-eth-l2bdbasemaclrn-oacl1-stateless-flows10k-pdrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermit-ndrpdrdisc.robot:| tc10-64B-1t1c-eth-l2bdbasemaclrn-oacl10-stateless-flows10k-pdrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermit-ndrpdrdisc.robot:| tc12-64B-1t1c-eth-l2bdbasemaclrn-oacl50-stateless-flows10k-pdrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermit-ndrpdrdisc.robot:| tc14-64B-1t1c-eth-l2bdbasemaclrn-oacl1-stateless-flows100k-pdrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermit-ndrpdrdisc.robot:| tc16-64B-1t1c-eth-l2bdbasemaclrn-oacl10-stateless-flows100k-pdrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermit-ndrpdrdisc.robot:| tc18-64B-1t1c-eth-l2bdbasemaclrn-oacl50-stateless-flows100k-pdrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermitreflect-ndrpdrdisc.robot:| tc02-64B-1t1c-eth-l2bdbasemaclrn-oacl1-statefull-flows100-pdrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermitreflect-ndrpdrdisc.robot:| tc04-64B-1t1c-eth-l2bdbasemaclrn-oacl10-statefull-flows100-pdrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermitreflect-ndrpdrdisc.robot:| tc06-64B-1t1c-eth-l2bdbasemaclrn-oacl50-statefull-flows100-pdrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermitreflect-ndrpdrdisc.robot:| tc08-64B-1t1c-eth-l2bdbasemaclrn-oacl1-statefull-flows10k-pdrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermitreflect-ndrpdrdisc.robot:| tc10-64B-1t1c-eth-l2bdbasemaclrn-oacl10-statefull-flows10k-pdrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermitreflect-ndrpdrdisc.robot:| tc12-64B-1t1c-eth-l2bdbasemaclrn-oacl50-statefull-flows10k-pdrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermitreflect-ndrpdrdisc.robot:| tc14-64B-1t1c-eth-l2bdbasemaclrn-oacl1-statefull-flows100k-pdrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermitreflect-ndrpdrdisc.robot:| tc16-64B-1t1c-eth-l2bdbasemaclrn-oacl10-statefull-flows100k-pdrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-acloutpermitreflect-ndrpdrdisc.robot:| tc18-64B-1t1c-eth-l2bdbasemaclrn-oacl50-statefull-flows100k-pdrdisc 10ge2p1x520-eth-l2bdbasemaclrn-ndrpdrdisc.robot:| tc02-64B-1t1c-eth-l2bdbasemaclrn-pdrdisc + 10ge2p1x520-eth-l2xcbase-eth-2memif-1lxc-ndrpdrdisc.robot:| tc02-64B-1t1c-eth-l2xcbase-eth-2memif-1lxc-pdrdisc 10ge2p1x520-eth-l2xcbase-ndrpdrdisc.robot:| tc02-64B-1t1c-eth-l2xcbase-pdrdisc 10ge2p1x710-eth-l2bdbasemaclrn-ndrpdrdisc.robot:| tc02-64B-1t1c-eth-l2bdbasemaclrn-pdrdisc 40ge2p1vic1385-eth-l2bdbasemaclrn-ndrpdrdisc.robot:| tc02-64B-1t1c-eth-l2bdbasemaclrn-pdrdisc @@ -111,13 +186,13 @@ git repository: .. code-block:: bash $ cd $CSIT/tests/vpp/perf/l2 - $ grep -E "64B-2t2c-(eth|dot1q|dot1ad)-(l2xcbase|l2bdbasemaclrn)-pdrdisc" * + $ grep -E "64B-2t2c-(eth|dot1q|dot1ad)-(l2xcbase|l2bdbasemaclrn)-(iacl.*|oacl.*|eth.*)*pdrdisc" * 10ge2p1vic1227-eth-l2bdbasemaclrn-ndrpdrdisc.robot:| tc08-64B-2t2c-eth-l2bdbasemaclrn-pdrdisc 10ge2p1x520-dot1ad-l2xcbase-ndrpdrdisc.robot:| tc08-64B-2t2c-dot1ad-l2xcbase-pdrdisc 10ge2p1x520-dot1q-l2xcbase-ndrpdrdisc.robot:| tc08-64B-2t2c-dot1q-l2xcbase-pdrdisc 10ge2p1x520-eth-l2bdbasemaclrn-ndrpdrdisc.robot:| tc08-64B-2t2c-eth-l2bdbasemaclrn-pdrdisc + 10ge2p1x520-eth-l2xcbase-eth-2memif-1lxc-ndrpdrdisc.robot:| tc08-64B-2t2c-eth-l2xcbase-eth-2memif-1lxc-pdrdisc 10ge2p1x520-eth-l2xcbase-ndrpdrdisc.robot:| tc08-64B-2t2c-eth-l2xcbase-pdrdisc 10ge2p1x710-eth-l2bdbasemaclrn-ndrpdrdisc.robot:| tc08-64B-2t2c-eth-l2bdbasemaclrn-pdrdisc 40ge2p1vic1385-eth-l2bdbasemaclrn-ndrpdrdisc.robot:| tc08-64B-2t2c-eth-l2bdbasemaclrn-pdrdisc - diff --git a/docs/report/vpp_performance_tests/packet_throughput_graphs/vm_vhost.rst b/docs/report/vpp_performance_tests/packet_throughput_graphs/vm_vhost.rst index fbb3bba4de..40769a6896 100644 --- a/docs/report/vpp_performance_tests/packet_throughput_graphs/vm_vhost.rst +++ b/docs/report/vpp_performance_tests/packet_throughput_graphs/vm_vhost.rst @@ -31,18 +31,27 @@ git repository: 10ge2p1x520-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot:| tc01-64B-1t1c-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc 10ge2p1x520-dot1q-l2xcbase-eth-2vhost-1vm-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2xcbase-eth-2vhost-1vm-ndrdisc - 10ge2p1x520-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc - 10ge2p1x520-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrdisc - 10ge2p1x520-eth-l2xcbase-eth-2vhost-1vm-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2xcbase-eth-2vhost-1vm-ndrdisc - 10ge2p1x520-eth-l2xcbase-eth-4vhost-2vm-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2xcbase-eth-4vhost-2vm-ndrdisc - 10ge2p1x520-ethip4-ip4base-eth-2vhost-1vm-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4-ip4base-eth-2vhost-1vm-ndrdisc + 10ge2p1x520-ethip4-ip4base-eth-2vhostvr1024-1vm-cfsrr1-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4-ip4base-eth-2vhostvr1024-1vm-cfsrr1-ndrdisc + 10ge2p1x520-ethip4-ip4base-eth-2vhostvr1024-1vm-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4-ip4base-eth-2vhostvr1024-1vm-ndrdisc + 10ge2p1x520-ethip4-ip4base-eth-2vhostvr256-1vm-cfsrr1-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4-ip4base-eth-2vhostvr256-1vm-cfsrr1-ndrdisc + 10ge2p1x520-ethip4-ip4base-eth-2vhostvr256-1vm-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4-ip4base-eth-2vhostvr256-1vm-ndrdisc 10ge2p1x520-ethip4-ip4base-eth-4vhost-2vm-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4-ip4base-eth-4vhost-2vm-ndrdisc 10ge2p1x520-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot:| tc01-64B-1t1c-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-eth-2vhostvr1024-1vm-cfsrr1-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2bdbasemaclrn-eth-2vhostvr1024-1vm-cfsrr1-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-eth-2vhostvr1024-1vm-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2bdbasemaclrn-eth-2vhostvr1024-1vm-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-eth-2vhostvr256-1vm-cfsrr1-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2bdbasemaclrn-eth-2vhostvr256-1vm-cfsrr1-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-eth-2vhostvr256-1vm-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2bdbasemaclrn-eth-2vhostvr256-1vm-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrdisc + 10ge2p1x520-eth-l2xcbase-eth-2vhostvr1024-1vm-cfsrr1-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2xcbase-eth-2vhostvr1024-1vm-cfsrr1-ndrdisc + 10ge2p1x520-eth-l2xcbase-eth-2vhostvr1024-1vm-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2xcbase-eth-2vhostvr1024-1vm-ndrdisc + 10ge2p1x520-eth-l2xcbase-eth-2vhostvr256-1vm-cfsrr1-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2xcbase-eth-2vhostvr256-1vm-cfsrr1-ndrdisc + 10ge2p1x520-eth-l2xcbase-eth-2vhostvr256-1vm-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2xcbase-eth-2vhostvr256-1vm-ndrdisc + 10ge2p1x520-eth-l2xcbase-eth-4vhost-2vm-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2xcbase-eth-4vhost-2vm-ndrdisc 10ge2p1x710-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc + 40ge2p1xl710-ethip4-ip4base-eth-4vhost-2vm-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-ip4base-eth-4vhost-2vm-ndrdisc 40ge2p1xl710-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc 40ge2p1xl710-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrdisc 40ge2p1xl710-eth-l2xcbase-eth-4vhost-2vm-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-l2xcbase-eth-4vhost-2vm-ndrdisc - 40ge2p1xl710-ethip4-ip4base-eth-4vhost-2vm-ndrpdrdisc.robot:| tc01-64B-1t1c-eth-ip4base-eth-4vhost-2vm-ndrdisc VPP NDR 64B packet throughput in 2t2c setup (2thread, 2core) is presented in the graph below. @@ -64,18 +73,27 @@ git repository: 10ge2p1x520-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot:| tc07-64B-2t2c-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc 10ge2p1x520-dot1q-l2xcbase-eth-2vhost-1vm-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-l2xcbase-eth-2vhost-1vm-ndrdisc - 10ge2p1x520-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc - 10ge2p1x520-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrdisc - 10ge2p1x520-eth-l2xcbase-eth-2vhost-1vm-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-l2xcbase-eth-2vhost-1vm-ndrdisc - 10ge2p1x520-eth-l2xcbase-eth-4vhost-2vm-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-l2xcbase-eth-4vhost-2vm-ndrdisc - 10ge2p1x520-ethip4-ip4base-eth-2vhost-1vm-ndrpdrdisc.robot:| tc07-64B-2t2c-ethip4-ip4base-eth-2vhost-1vm-ndrdisc + 10ge2p1x520-ethip4-ip4base-eth-2vhostvr1024-1vm-cfsrr1-ndrpdrdisc.robot:| tc07-64B-2t2c-ethip4-ip4base-eth-2vhostvr1024-1vm-cfsrr1-ndrdisc + 10ge2p1x520-ethip4-ip4base-eth-2vhostvr1024-1vm-ndrpdrdisc.robot:| tc07-64B-2t2c-ethip4-ip4base-eth-2vhostvr1024-1vm-ndrdisc + 10ge2p1x520-ethip4-ip4base-eth-2vhostvr256-1vm-cfsrr1-ndrpdrdisc.robot:| tc07-64B-2t2c-ethip4-ip4base-eth-2vhostvr256-1vm-cfsrr1-ndrdisc + 10ge2p1x520-ethip4-ip4base-eth-2vhostvr256-1vm-ndrpdrdisc.robot:| tc07-64B-2t2c-ethip4-ip4base-eth-2vhostvr256-1vm-ndrdisc 10ge2p1x520-ethip4-ip4base-eth-4vhost-2vm-ndrpdrdisc.robot:| tc07-64B-2t2c-ethip4-ip4base-eth-4vhost-2vm-ndrdisc 10ge2p1x520-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot:| tc07-64B-2t2c-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-eth-2vhostvr1024-1vm-cfsrr1-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-l2bdbasemaclrn-eth-2vhostvr1024-1vm-cfsrr1-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-eth-2vhostvr1024-1vm-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-l2bdbasemaclrn-eth-2vhostvr1024-1vm-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-eth-2vhostvr256-1vm-cfsrr1-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-l2bdbasemaclrn-eth-2vhostvr256-1vm-cfsrr1-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-eth-2vhostvr256-1vm-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-l2bdbasemaclrn-eth-2vhostvr256-1vm-ndrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrdisc + 10ge2p1x520-eth-l2xcbase-eth-2vhostvr1024-1vm-cfsrr1-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-l2xcbase-eth-2vhostvr1024-1vm-cfsrr1-ndrdisc + 10ge2p1x520-eth-l2xcbase-eth-2vhostvr1024-1vm-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-l2xcbase-eth-2vhostvr1024-1vm-ndrdisc + 10ge2p1x520-eth-l2xcbase-eth-2vhostvr256-1vm-cfsrr1-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-l2xcbase-eth-2vhostvr256-1vm-cfsrr1-ndrdisc + 10ge2p1x520-eth-l2xcbase-eth-2vhostvr256-1vm-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-l2xcbase-eth-2vhostvr256-1vm-ndrdisc + 10ge2p1x520-eth-l2xcbase-eth-4vhost-2vm-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-l2xcbase-eth-4vhost-2vm-ndrdisc 10ge2p1x710-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc + 40ge2p1xl710-ethip4-ip4base-eth-4vhost-2vm-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-ip4base-eth-4vhost-2vm-ndrdisc 40ge2p1xl710-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrdisc 40ge2p1xl710-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrdisc 40ge2p1xl710-eth-l2xcbase-eth-4vhost-2vm-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-l2xcbase-eth-4vhost-2vm-ndrdisc - 40ge2p1xl710-ethip4-ip4base-eth-4vhost-2vm-ndrpdrdisc.robot:| tc07-64B-2t2c-eth-ip4base-eth-4vhost-2vm-ndrdisc PDR Throughput ~~~~~~~~~~~~~~ @@ -100,18 +118,27 @@ git repository: 10ge2p1x520-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot:| tc02-64B-1t1c-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc 10ge2p1x520-dot1q-l2xcbase-eth-2vhost-1vm-ndrpdrdisc.robot:| tc02-64B-1t1c-eth-l2xcbase-eth-2vhost-1vm-pdrdisc - 10ge2p1x520-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot:| tc02-64B-1t1c-eth-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc - 10ge2p1x520-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrpdrdisc.robot:| tc02-64B-1t1c-eth-l2bdbasemaclrn-eth-4vhost-2vm-pdrdisc - 10ge2p1x520-eth-l2xcbase-eth-2vhost-1vm-ndrpdrdisc.robot:| tc02-64B-1t1c-eth-l2xcbase-eth-2vhost-1vm-pdrdisc - 10ge2p1x520-eth-l2xcbase-eth-4vhost-2vm-ndrpdrdisc.robot:| tc02-64B-1t1c-eth-l2xcbase-eth-4vhost-2vm-pdrdisc - 10ge2p1x520-ethip4-ip4base-eth-2vhost-1vm-ndrpdrdisc.robot:| tc02-64B-1t1c-ethip4-ip4base-eth-2vhost-1vm-pdrdisc + 10ge2p1x520-ethip4-ip4base-eth-2vhostvr1024-1vm-cfsrr1-ndrpdrdisc.robot:| tc02-64B-1t1c-ethip4-ip4base-eth-2vhostvr1024-1vm-cfsrr1-pdrdisc + 10ge2p1x520-ethip4-ip4base-eth-2vhostvr1024-1vm-ndrpdrdisc.robot:| tc02-64B-1t1c-ethip4-ip4base-eth-2vhostvr1024-1vm-pdrdisc + 10ge2p1x520-ethip4-ip4base-eth-2vhostvr256-1vm-cfsrr1-ndrpdrdisc.robot:| tc02-64B-1t1c-ethip4-ip4base-eth-2vhostvr256-1vm-cfsrr1-pdrdisc + 10ge2p1x520-ethip4-ip4base-eth-2vhostvr256-1vm-ndrpdrdisc.robot:| tc02-64B-1t1c-ethip4-ip4base-eth-2vhostvr256-1vm-pdrdisc 10ge2p1x520-ethip4-ip4base-eth-4vhost-2vm-ndrpdrdisc.robot:| tc02-64B-1t1c-ethip4-ip4base-eth-4vhost-2vm-pdrdisc 10ge2p1x520-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot:| tc02-64B-1t1c-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-eth-2vhostvr1024-1vm-cfsrr1-ndrpdrdisc.robot:| tc02-64B-1t1c-eth-l2bdbasemaclrn-eth-2vhostvr1024-1vm-cfsrr1-pdrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-eth-2vhostvr1024-1vm-ndrpdrdisc.robot:| tc02-64B-1t1c-eth-l2bdbasemaclrn-eth-2vhostvr1024-1vm-pdrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-eth-2vhostvr256-1vm-cfsrr1-ndrpdrdisc.robot:| tc02-64B-1t1c-eth-l2bdbasemaclrn-eth-2vhostvr256-1vm-cfsrr1-pdrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-eth-2vhostvr256-1vm-ndrpdrdisc.robot:| tc02-64B-1t1c-eth-l2bdbasemaclrn-eth-2vhostvr256-1vm-pdrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrpdrdisc.robot:| tc02-64B-1t1c-eth-l2bdbasemaclrn-eth-4vhost-2vm-pdrdisc + 10ge2p1x520-eth-l2xcbase-eth-2vhostvr1024-1vm-cfsrr1-ndrpdrdisc.robot:| tc02-64B-1t1c-eth-l2xcbase-eth-2vhostvr1024-1vm-cfsrr1-pdrdisc + 10ge2p1x520-eth-l2xcbase-eth-2vhostvr1024-1vm-ndrpdrdisc.robot:| tc02-64B-1t1c-eth-l2xcbase-eth-2vhostvr1024-1vm-pdrdisc + 10ge2p1x520-eth-l2xcbase-eth-2vhostvr256-1vm-cfsrr1-ndrpdrdisc.robot:| tc02-64B-1t1c-eth-l2xcbase-eth-2vhostvr256-1vm-cfsrr1-pdrdisc + 10ge2p1x520-eth-l2xcbase-eth-2vhostvr256-1vm-ndrpdrdisc.robot:| tc02-64B-1t1c-eth-l2xcbase-eth-2vhostvr256-1vm-pdrdisc + 10ge2p1x520-eth-l2xcbase-eth-4vhost-2vm-ndrpdrdisc.robot:| tc02-64B-1t1c-eth-l2xcbase-eth-4vhost-2vm-pdrdisc 10ge2p1x710-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot:| tc02-64B-1t1c-eth-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc + 40ge2p1xl710-ethip4-ip4base-eth-4vhost-2vm-ndrpdrdisc.robot:| tc02-64B-1t1c-eth-ip4base-eth-4vhost-2vm-pdrdisc 40ge2p1xl710-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot:| tc02-64B-1t1c-eth-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc 40ge2p1xl710-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrpdrdisc.robot:| tc02-64B-1t1c-eth-l2bdbasemaclrn-eth-4vhost-2vm-pdrdisc 40ge2p1xl710-eth-l2xcbase-eth-4vhost-2vm-ndrpdrdisc.robot:| tc02-64B-1t1c-eth-l2xcbase-eth-4vhost-2vm-pdrdisc - 40ge2p1xl710-ethip4-ip4base-eth-4vhost-2vm-ndrpdrdisc.robot:| tc02-64B-1t1c-eth-ip4base-eth-4vhost-2vm-pdrdisc VPP PDR 64B packet throughput in 2t2c setup (2thread, 2core) is presented in the graph below. PDR measured for 0.5% packet loss ratio. @@ -133,16 +160,24 @@ git repository: 10ge2p1x520-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot:| tc08-64B-2t2c-dot1q-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc 10ge2p1x520-dot1q-l2xcbase-eth-2vhost-1vm-ndrpdrdisc.robot:| tc08-64B-2t2c-eth-l2xcbase-eth-2vhost-1vm-pdrdisc - 10ge2p1x520-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot:| tc08-64B-2t2c-eth-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc - 10ge2p1x520-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrpdrdisc.robot:| tc08-64B-2t2c-eth-l2bdbasemaclrn-eth-4vhost-2vm-pdrdisc - 10ge2p1x520-eth-l2xcbase-eth-2vhost-1vm-ndrpdrdisc.robot:| tc08-64B-2t2c-eth-l2xcbase-eth-2vhost-1vm-pdrdisc - 10ge2p1x520-eth-l2xcbase-eth-4vhost-2vm-ndrpdrdisc.robot:| tc08-64B-2t2c-eth-l2xcbase-eth-4vhost-2vm-pdrdisc - 10ge2p1x520-ethip4-ip4base-eth-2vhost-1vm-ndrpdrdisc.robot:| tc08-64B-2t2c-ethip4-ip4base-eth-2vhost-1vm-pdrdisc + 10ge2p1x520-ethip4-ip4base-eth-2vhostvr1024-1vm-cfsrr1-ndrpdrdisc.robot:| tc08-64B-2t2c-ethip4-ip4base-eth-2vhostvr1024-1vm-cfsrr1-pdrdisc + 10ge2p1x520-ethip4-ip4base-eth-2vhostvr1024-1vm-ndrpdrdisc.robot:| tc08-64B-2t2c-ethip4-ip4base-eth-2vhostvr1024-1vm-pdrdisc + 10ge2p1x520-ethip4-ip4base-eth-2vhostvr256-1vm-cfsrr1-ndrpdrdisc.robot:| tc08-64B-2t2c-ethip4-ip4base-eth-2vhostvr256-1vm-cfsrr1-pdrdisc + 10ge2p1x520-ethip4-ip4base-eth-2vhostvr256-1vm-ndrpdrdisc.robot:| tc08-64B-2t2c-ethip4-ip4base-eth-2vhostvr256-1vm-pdrdisc 10ge2p1x520-ethip4-ip4base-eth-4vhost-2vm-ndrpdrdisc.robot:| tc08-64B-2t2c-ethip4-ip4base-eth-4vhost-2vm-pdrdisc 10ge2p1x520-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot:| tc08-64B-2t2c-ethip4vxlan-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-eth-2vhostvr1024-1vm-cfsrr1-ndrpdrdisc.robot:| tc08-64B-2t2c-eth-l2bdbasemaclrn-eth-2vhostvr1024-1vm-cfsrr1-pdrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-eth-2vhostvr1024-1vm-ndrpdrdisc.robot:| tc08-64B-2t2c-eth-l2bdbasemaclrn-eth-2vhostvr1024-1vm-pdrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-eth-2vhostvr256-1vm-cfsrr1-ndrpdrdisc.robot:| tc08-64B-2t2c-eth-l2bdbasemaclrn-eth-2vhostvr256-1vm-cfsrr1-pdrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-eth-2vhostvr256-1vm-ndrpdrdisc.robot:| tc08-64B-2t2c-eth-l2bdbasemaclrn-eth-2vhostvr256-1vm-pdrdisc + 10ge2p1x520-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrpdrdisc.robot:| tc08-64B-2t2c-eth-l2bdbasemaclrn-eth-4vhost-2vm-pdrdisc + 10ge2p1x520-eth-l2xcbase-eth-2vhostvr1024-1vm-cfsrr1-ndrpdrdisc.robot:| tc08-64B-2t2c-eth-l2xcbase-eth-2vhostvr1024-1vm-cfsrr1-pdrdisc + 10ge2p1x520-eth-l2xcbase-eth-2vhostvr1024-1vm-ndrpdrdisc.robot:| tc08-64B-2t2c-eth-l2xcbase-eth-2vhostvr1024-1vm-pdrdisc + 10ge2p1x520-eth-l2xcbase-eth-2vhostvr256-1vm-cfsrr1-ndrpdrdisc.robot:| tc08-64B-2t2c-eth-l2xcbase-eth-2vhostvr256-1vm-cfsrr1-pdrdisc + 10ge2p1x520-eth-l2xcbase-eth-2vhostvr256-1vm-ndrpdrdisc.robot:| tc08-64B-2t2c-eth-l2xcbase-eth-2vhostvr256-1vm-pdrdisc + 10ge2p1x520-eth-l2xcbase-eth-4vhost-2vm-ndrpdrdisc.robot:| tc08-64B-2t2c-eth-l2xcbase-eth-4vhost-2vm-pdrdisc 10ge2p1x710-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot:| tc08-64B-2t2c-eth-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc + 40ge2p1xl710-ethip4-ip4base-eth-4vhost-2vm-ndrpdrdisc.robot:| tc08-64B-2t2c-eth-ip4base-eth-4vhost-2vm-pdrdisc 40ge2p1xl710-eth-l2bdbasemaclrn-eth-2vhost-1vm-ndrpdrdisc.robot:| tc08-64B-2t2c-eth-l2bdbasemaclrn-eth-2vhost-1vm-pdrdisc 40ge2p1xl710-eth-l2bdbasemaclrn-eth-4vhost-2vm-ndrpdrdisc.robot:| tc08-64B-2t2c-eth-l2bdbasemaclrn-eth-4vhost-2vm-pdrdisc 40ge2p1xl710-eth-l2xcbase-eth-4vhost-2vm-ndrpdrdisc.robot:| tc08-64B-2t2c-eth-l2xcbase-eth-4vhost-2vm-pdrdisc - 40ge2p1xl710-ethip4-ip4base-eth-4vhost-2vm-ndrpdrdisc.robot:| tc08-64B-2t2c-eth-ip4base-eth-4vhost-2vm-pdrdisc - diff --git a/docs/report/vpp_performance_tests/test_environment.rst b/docs/report/vpp_performance_tests/test_environment.rst index 2ce5f8ad4f..68f4365a4d 100644 --- a/docs/report/vpp_performance_tests/test_environment.rst +++ b/docs/report/vpp_performance_tests/test_environment.rst @@ -4,6 +4,132 @@ Test Environment To execute performance tests, there are three identical testbeds, each testbed consists of two SUTs and one TG. +Naming Convention +----------------- + +Following naming convention is used within this page to specify physical +connectivity and wiring across defined CSIT testbeds: + +- testbedname: testbedN. +- hostname: + + - traffic-generator: tN-tgW. + - system-under-testX: tN-sutX. + +- portnames: + + - tN-tgW-cY/pZ. + - tN-sutX-cY/pZ. + +- where: + + - N - testbed number. + - tgW - server acts as traffic-generator with W index. + - sutX - server acts as system-under-test with X index. + - Y - PCIe slot number denoting a NIC card number within the host. + + - Y=1,2,3 - slots in Riser 1, Right PCIe Riser Board, NUMA node 0. + - Y=4,5,6 - slots in Riser 2, Left PCIe Riser Board, NUMA node 1. + - Y=m - the MLOM slot. + + - Z - port number on the NIC card. + +Server HW Configuration +----------------------- + +CSIT testbed contains following three HW configuration types of UCS x86 servers, +across total of ten servers provided: + +#. Type-1: Purpose - VPP functional and performance conformance testing. + + - Quantity: 6 computers as SUT hosts (Systems Under Test). + - Physical connectivity: + + - CIMC and host management ports. + - NIC ports connected in 3-node topologies. + + - Main HW configuration: + + - Chassis: UCSC-C240-M4SX with 6 PCIe3.0 slots. + - Processors: 2* E5-2699 2.3 GHz. + - RAM Memory: 16* 32GB DDR4-2133MHz. + - Disks: 2* 2TB 12G SAS 7.2K RPM SFF HDD. + + - NICs configuration: + + - Right PCIe Riser Board (Riser 1) (x8, x8, x8 PCIe3.0 lanes) + + - PCIe Slot1: Cisco VIC 1385 2p40GE. + + - PCIe Slot2: Intel NIC x520 2p10GE. + - PCIe Slot3: empty. + + - Left PCIe Riser Board (Riser 2) (x8, x16, x8 PCIe3.0 lanes) + + - PCIe Slot4: Intel NIC xl710 2p40GE. + - PCIe Slot5: Intel NIC x710 2p10GE. + - PCIe Slot6: Intel QAT 8950 50G (Walnut Hill) + + - MLOM slot: Cisco VIC 1227 2p10GE (x8 PCIe2.0 lanes). + +#. Type-2: Purpose - VPP functional and performance conformance testing. + + - Quantity: 3 computers as TG hosts (Traffic Generators). + - Physical connectivity: + + - CIMC and host management ports. + - NIC ports connected in 3-node topologies. + + - Main HW configuration: + + - Chassis: UCSC-C240-M4SX with 6 PCIe3.0 slots. + - Processors: 2* E5-2699 2.3 GHz. + - RAM Memory: 16* 32GB DDR4-2133MHz. + - Disks: 2* 2TB 12G SAS 7.2K RPM SFF HDD. + + - NICs configuration: + + - Right PCIe Riser Board (Riser 1) (x8, x8, x8 lanes) + + - PCIe Slot1: Intel NIC xl710 2p40GE. + - PCIe Slot2: Intel NIC x710 2p10GE. + - PCIe Slot3: Intel NIC x710 2p10GE. + + - Left PCIe Riser Board (Riser 2) (x8, x16, x8 lanes) + + - PCIe Slot4: Intel NIC xl710 2p40GE. + - PCIe Slot5: Intel NIC x710 2p10GE. + - PCIe Slot6: Intel NIC x710 2p10GE. + + - MLOM slot: empty. + +#. Type-3: Purpose - VIRL functional conformance. + + - Quantity: 3 computers as VIRL hosts. + - Physical connectivity: + + - CIMC and host management ports. + - no NIC ports, standalone setup. + + - Main HW configuration: + + - Chassis: UCSC-C240-M4SX with 6 PCIe3.0 slots. + - Processors: 2* E5-2699 2.3 GHz. + - RAM Memory: 16* 32GB DDR4-2133MHz. + - Disks: 2* 480 GB 2.5inch 6G SATA SSD. + + - NICs configuration: + + - Right PCIe Riser Board (Riser 1) (x8, x8, x8 lanes) + + - no cards. + + - Left PCIe Riser Board (Riser 2) (x8, x16, x8 lanes) + + - no cards. + + - MLOM slot: empty. + SUT Configuration - Host HW --------------------------- Host hardware details (CPU, memory, NIC layout) and physical topology are @@ -12,9 +138,10 @@ described in detail in **Host configuration** -- All hosts are Cisco UCS C240-M4 (2x Intel(R) Xeon(R) CPU E5-2699 v3 @ 2.30GHz, - 18c, 512GB RAM) - :: +All hosts are Cisco UCS C240-M4 (2x Intel(R) Xeon(R) CPU E5-2699 v3 @ 2.30GHz, +18c, 512GB RAM) + +:: $ lscpu Architecture: x86_64 @@ -42,8 +169,9 @@ described in detail in NUMA node1 CPU(s): 18-35 Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm epb tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm xsaveopt cqm_llc cqm_occup_llc dtherm arat pln pts -- BIOS settings - :: +**BIOS settings** + +:: C240 /bios # show advanced detail Set-up parameters: @@ -114,18 +242,19 @@ described in detail in CDN Support for VIC: Disabled Out-of-Band Management: Disabled -- In addition to CIMC and Management, each TG has 4x Intel X710 10GB NIC - (=8 ports) and 2x Intel XL710 40GB NIC (=4 ports), whereas each SUT has: +**NIC models and placement** - - 1x Intel X520 NIC (10GB, 2 ports), - - 1x Cisco VIC 1385 (40GB, 2 ports), - - 1x Intel XL710 NIC (40GB, 2 ports), - - 1x Intel X710 NIC (10GB, 2 ports), - - 1x Cisco VIC 1227 (10GB, 2 ports). - - This allows for a total of five ring topologies, each using ports on - specific NIC model, enabling per NIC model benchmarking. +In addition to CIMC and Management, each TG has 4x Intel X710 10GB NIC +(=8 ports) and 2x Intel XL710 40GB NIC (=4 ports), whereas each SUT has: -**NIC models and placement** +- 1x Intel X520 NIC (10GB, 2 ports), +- 1x Cisco VIC 1385 (40GB, 2 ports), +- 1x Intel XL710 NIC (40GB, 2 ports), +- 1x Intel X710 NIC (10GB, 2 ports), +- 1x Cisco VIC 1227 (10GB, 2 ports). + +This allows for a total of five ring topologies, each using ports on specific +NIC model, enabling per NIC model benchmarking. - 0a:00.0 Ethernet controller: Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection (rev 01) Subsystem: Intel Corporation Ethernet Server @@ -157,10 +286,13 @@ described in detail in SUT Configuration - Host OS Linux --------------------------------- -Software details (OS, configuration) are described in -`CSIT/CSIT_LF_testbed `_. +Software details (OS, configuration) are described in `LF FDio CSIT testbed +wiki page `_. + +System provisioning is done by combination of PXE boot unattented install and +`Ansible `_ described in `CSIT Testbed Setup`_. -Below a subset of the configuration: +Below a subset of the running configuration: :: @@ -233,11 +365,39 @@ Below a subset of the configuration: Node 1 HugePages_Free: 2048 Node 1 HugePages_Surp: 0 +**Kernel boot parameters used in CSIT performance testbeds** + +- **isolcpus=-** used for all cpu cores apart from + first core of each socket used for running VPP worker threads and Qemu/LXC + processes https://www.kernel.org/doc/Documentation/kernel-parameters.txt +- **intel_pstate=disable** - [X86] Do not enable intel_pstate as the default + scaling driver for the supported processors. Intel P-State driver decide what + P-state (CPU core power state) to use based on requesting policy from the + cpufreq core. [X86 - Either 32-bit or 64-bit x86] + https://www.kernel.org/doc/Documentation/cpu-freq/intel-pstate.txt +- **nohz_full=-** - [KNL,BOOT] In kernels built with + CONFIG_NO_HZ_FULL=y, set the specified list of CPUs whose tick will be stopped + whenever possible. The boot CPU will be forced outside the range to maintain + the timekeeping. The CPUs in this range must also be included in the + rcu_nocbs= set. Specifies the adaptive-ticks CPU cores, causing kernel to + avoid sending scheduling-clock interrupts to listed cores as long as they have + a single runnable task. [KNL - Is a kernel start-up parameter, SMP - The + kernel is an SMP kernel]. + https://www.kernel.org/doc/Documentation/timers/NO_HZ.txt +- **rcu_nocbs** - [KNL] In kernels built with CONFIG_RCU_NOCB_CPU=y, set the + specified list of CPUs to be no-callback CPUs, that never queue RCU callbacks + (read-copy update). + https://www.kernel.org/doc/Documentation/kernel-parameters.txt + +**Applied command line boot parameters:** + :: $ cat /proc/cmdline BOOT_IMAGE=/vmlinuz-4.4.0-72-generic root=UUID=35ea11e4-e44f-4f67-8cbe-12f09c49ed90 ro isolcpus=1-17,19-35 nohz_full=1-17,19-35 rcu_nocbs=1-17,19-35 intel_pstate=disable console=tty0 console=ttyS0,115200n8 +**Mount listing** + :: $ cat /proc/mounts @@ -273,6 +433,8 @@ Below a subset of the configuration: none /mnt/huge hugetlbfs rw,relatime,pagesize=2048k 0 0 lxcfs /var/lib/lxcfs fuse.lxcfs rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other 0 0 +**Package listing** + :: $ dpkg -l @@ -808,6 +970,8 @@ Below a subset of the configuration: ii zlib1g:amd64 1:1.2.8.dfsg-2ubuntu4 amd64 compression library - runtime ii zlib1g-dev:amd64 1:1.2.8.dfsg-2ubuntu4 amd64 compression library - development +**Kernel module listing** + :: $ lsmod | sort @@ -897,6 +1061,8 @@ Below a subset of the configuration: xt_CHECKSUM 16384 1 xt_tcpudp 16384 5 +**Sysctl listing** + :: $ sysctl -a @@ -1841,6 +2007,8 @@ Below a subset of the configuration: vm.vfs_cache_pressure = 100 vm.zone_reclaim_mode = 0 +**Services listing** + :: $ service --status-all @@ -1888,6 +2056,72 @@ Below a subset of the configuration: [ + ] uuidd [ - ] x11-common +**Host CFS optimizations (QEMU+VPP)** + +Applying CFS scheduler tuning on all Qemu vcpu worker threads (those are +handling testpmd - pmd threads) and VPP PMD worker threads. List of VPP PMD +threads can be obtained e.g. from: + +:: + + $ for psid in $(pgrep vpp) + $ do + $ for tid in $(ps -Lo tid --pid $psid | grep -v TID) + $ do + $ echo $tid + $ done + $ done + +Or: + +:: + + $ cat /proc/`pidof vpp`/task/*/stat | awk '{print $1" "$2" "$39}' + +Applying Round-robin scheduling with highest priority + +:: + + $ for psid in $(pgrep vpp) + $ do + $ for tid in $(ps -Lo tid --pid $psid | grep -v TID) + $ do + $ chrt -r -p 1 $tid + $ done + $ done + +More information about Linux CFS can be found in: `Sched manual pages +`_. + + +**Host IRQ affinity** + +Changing the default pinning of every IRQ to core 0. (Same does apply on both +guest VM and host OS) + +:: + + $ for l in `ls /proc/irq`; do echo 1 | sudo tee /proc/irq/$l/smp_affinity; done + +**Host RCU affinity** + +Changing the default pinning of RCU to core 0. (Same does apply on both guest VM +and host OS) + +:: + + $ for i in `pgrep rcu[^c]` ; do sudo taskset -pc 0 $i ; done + +**Host Writeback affinity** + +Changing the default pinning of writebacks to core 0. (Same does apply on both +guest VM and host OS) + +:: + + $ echo 1 | sudo tee /sys/bus/workqueue/devices/writeback/cpumask + + DUT Configuration - VPP ----------------------- @@ -1903,7 +2137,7 @@ DUT Configuration - VPP :: - $ dpkg -i --force-all + $ dpkg -i --force-all vpp* **VPP Startup Configuration** @@ -2040,6 +2274,12 @@ DPDK v17.05 - dest_mac : [0x3c,0xfd,0xfe,0x9c,0xee,0xf4] src_mac : [0x3c,0xfd,0xfe,0x9c,0xee,0xf5] +**TG Startup Command** + +:: + + $ sh -c 'cd /scripts/ && sudo nohup ./t-rex-64 -i -c 7 --iom 0 > /dev/null 2>&1 &'> /dev/null + **TG common API - pointer to driver** `TRex driver`_ diff --git a/resources/tools/report_gen/conf.py b/resources/tools/report_gen/conf.py index 4c90e55ddf..93f39024c6 100644 --- a/resources/tools/report_gen/conf.py +++ b/resources/tools/report_gen/conf.py @@ -69,14 +69,17 @@ rst_epilog = """ .. _tag documentation rst file: https://git.fd.io/csit/tree/docs/tag_documentation.rst?h=rls1707 .. _TRex intallation: https://git.fd.io/csit/tree/resources/tools/trex/trex_installer.sh?h=rls1707 .. _TRex driver: https://git.fd.io/csit/tree/resources/tools/trex/trex_stateless_profile.py?h=rls1707 -.. _CSIT Honeycomb Functional Tests Documentation: https://docs.fd.io/csit/rls1707/doc/tests.func.html -.. _CSIT DPDK Performance Tests Documentation: https://docs.fd.io/csit/rls1707/doc/tests.perf.html -.. _CSIT VPP Functional Tests Documentation: https://docs.fd.io/csit/rls1707/doc/tests.func.html -.. _CSIT VPP Performance Tests Documentation: https://docs.fd.io/csit/rls1707/doc/tests.perf.html +.. _CSIT Honeycomb Functional Tests Documentation: https://docs.fd.io/csit/rls1707/doc/tests.vpp.func.html +.. _CSIT DPDK Performance Tests Documentation: https://docs.fd.io/csit/rls1707/doc/tests.dpdk.perf.html +.. _CSIT VPP Functional Tests Documentation: https://docs.fd.io/csit/rls1707/doc/tests.vpp.func.html +.. _CSIT VPP Performance Tests Documentation: https://docs.fd.io/csit/rls1707/doc/tests.vpp.perf.html +.. _CSIT NSH_SFC Functional Tests Documentation: https://docs.fd.io/csit/rls1707/doc/tests.nsh_sfc.func.html .. _VPP test framework documentation: https://docs.fd.io/vpp/17.07/vpp_make_test/html/ .. _FD.io test executor vpp performance jobs: https://jenkins.fd.io/view/csit/job/csit-vpp-perf-1707-all .. _FD.io test executor dpdk performance jobs: https://jenkins.fd.io/view/csit/job/csit-dpdk-perf-1707-all .. _FD.io VPP compile job: https://jenkins.fd.io/view/vpp/job/vpp-merge-1707-ubuntu1604/ +.. _FD.io VPP compile job: https://jenkins.fd.io/view/vpp/job/vpp-merge-1707-ubuntu1604/ +.. _CSIT Testbed Setup: https://git.fd.io/csit/tree/resources/tools/testbed-setup/README.md?h=rls1707 """ # The language for content autogenerated by Sphinx. Refer to documentation diff --git a/resources/tools/report_gen/run_report.sh b/resources/tools/report_gen/run_report.sh index e11c68e8ee..494ec5650a 100755 --- a/resources/tools/report_gen/run_report.sh +++ b/resources/tools/report_gen/run_report.sh @@ -41,18 +41,18 @@ sudo apt-get -y update sudo apt-get -y install libxml2 libxml2-dev libxslt-dev build-essential \ zlib1g-dev unzip -# Clean-up when finished: +# Clean-up when finished trap 'rm -rf ${WORKING_DIR}; exit' EXIT trap 'rm -rf ${WORKING_DIR}; exit' ERR -# Remove the old build: +# Remove the old build rm -rf ${BUILD_DIR} || true rm -rf ${WORKING_DIR} || true # Create working directories mkdir ${BUILD_DIR} -# Create virtual environment: +# Create virtual environment virtualenv ${WORKING_DIR}/env . ${WORKING_DIR}/env/bin/activate @@ -72,22 +72,23 @@ mkdir -p ${PLOT_DPDK_SOURCE_DIR} ### VPP PERFORMANCE SOURCE DATA JEN_FILE_PERF='output_perf_data.xml' -JEN_JOB='csit-vpp-perf-1704-all' -JEN_BUILD=(6 7 8 9 10 12 14 15 16 17) +JEN_JOB='csit-vpp-perf-master-all' +JEN_BUILD=(1567) +JEN_FBUILD=1567 for i in "${JEN_BUILD[@]}"; do curl --fail -fs ${CSIT_JEN_URL}/${JEN_JOB}/${i}/robot/report/output_perf_data.xml \ -o ${PLOT_VPP_SOURCE_DIR}/${JEN_JOB}-${i}.xml if [[ ${DEBUG} -eq 1 ]] ; then - cp ./${JEN_JOB}-10.zip ${STATIC_DIR_ARCH}/${JEN_JOB}-10.zip + cp ./${JEN_JOB}-${JEN_FBUILD}.zip ${STATIC_DIR_ARCH}/${JEN_JOB}-${JEN_FBUILD}.zip else curl --fail -fs ${CSIT_JEN_URL}/${JEN_JOB}/${i}/robot/report/\*zip\*/robot-plugin.zip \ -o ${STATIC_DIR_ARCH}/${JEN_JOB}-${i}.zip fi done -unzip -o ${STATIC_DIR_ARCH}/${JEN_JOB}-10.zip -d ${WORKING_DIR}/ +unzip -o ${STATIC_DIR_ARCH}/${JEN_JOB}-${JEN_FBUILD}.zip -d ${WORKING_DIR}/ python run_robot_data.py -i ${WORKING_DIR}/robot-plugin/output.xml \ --output ${DTR_PERF_SOURCE_DIR}/vpp_performance_results.rst \ --formatting rst --start 4 --level 2 @@ -97,48 +98,52 @@ python run_robot_teardown_data.py -i ${WORKING_DIR}/robot-plugin/output.xml \ python run_robot_teardown_data.py -i ${WORKING_DIR}/robot-plugin/output.xml \ -o ${DTO_PERF_SOURCE_OPER_DIR}/vpp_performance_operational_data.rst \ --data "SH_RUN" -f "rst" --start 4 --level 2 -sed -i -e "s@###JOB###@${JEN_JOB}\/75@g" \ - ${DTR_PERF_SOURCE_DIR}/index.rst -sed -i -e "s@###LINK###@${CSIT_JEN_URL}\/${JEN_JOB}\/75@g" \ - ${DTR_PERF_SOURCE_DIR}/index.rst -sed -i -e "s@###JOB###@${JEN_JOB}\/75@g" \ - ${DTC_PERF_SOURCE_DIR}/index.rst -sed -i -e "s@###LINK###@${CSIT_JEN_URL}\/${JEN_JOB}\/75@g" \ - ${DTC_PERF_SOURCE_DIR}/index.rst -sed -i -e "s@###JOB###@${JEN_JOB}\/75@g" \ - ${DTO_PERF_SOURCE_OPER_DIR}/index.rst -sed -i -e "s@###LINK###@${CSIT_JEN_URL}\/${JEN_JOB}\/75@g" \ - ${DTO_PERF_SOURCE_OPER_DIR}/index.rst +if [[ ${DEBUG} -eq 0 ]] ; +then + sed -i -e "s@###JOB###@${JEN_JOB}\/${JEN_FBUILD}@g" \ + ${DTR_PERF_SOURCE_DIR}/index.rst + sed -i -e "s@###LINK###@${CSIT_JEN_URL}\/${JEN_JOB}\/${JEN_FBUILD}@g" \ + ${DTR_PERF_SOURCE_DIR}/index.rst + sed -i -e "s@###JOB###@${JEN_JOB}\/${JEN_FBUILD}@g" \ + ${DTC_PERF_SOURCE_DIR}/index.rst + sed -i -e "s@###LINK###@${CSIT_JEN_URL}\/${JEN_JOB}\/${JEN_FBUILD}@g" \ + ${DTC_PERF_SOURCE_DIR}/index.rst + sed -i -e "s@###JOB###@${JEN_JOB}\/${JEN_FBUILD}@g" \ + ${DTO_PERF_SOURCE_OPER_DIR}/index.rst + sed -i -e "s@###LINK###@${CSIT_JEN_URL}\/${JEN_JOB}\/${JEN_FBUILD}@g" \ + ${DTO_PERF_SOURCE_OPER_DIR}/index.rst +fi ### DPDK PERFORMANCE SOURCE DATA -JEN_JOB='csit-dpdk-perf-master-all' -JEN_BUILD=(13 14 15 16) +JEN_JOB='csit-dpdk-perf-1707-all' +JEN_BUILD=(1 2 3 4) for i in "${JEN_BUILD[@]}"; do curl --fail -fs ${CSIT_JEN_URL}/${JEN_JOB}/${i}/robot/report/output_perf_data.xml \ -o ${PLOT_DPDK_SOURCE_DIR}/${JEN_JOB}-${i}.xml if [[ ${DEBUG} -eq 1 ]] ; then - cp ./${JEN_JOB}-16.zip ${STATIC_DIR_ARCH}/${JEN_JOB}-16.zip + cp ./${JEN_JOB}-${JEN_BUILD[-1]}.zip ${STATIC_DIR_ARCH}/${JEN_JOB}-${JEN_BUILD[-1]}.zip else curl --fail -fs ${CSIT_JEN_URL}/${JEN_JOB}/${i}/robot/report/\*zip\*/robot-plugin.zip \ -o ${STATIC_DIR_ARCH}/${JEN_JOB}-${i}.zip + + sed -i -e "s@###JOB###@${JEN_JOB}\/${JEN_BUILD[-1]}@g" \ + ${DTR_DPDK_SOURCE_DIR}/index.rst + sed -i -e "s@###LINK###@${CSIT_JEN_URL}\/${JEN_JOB}\/${JEN_BUILD[-1]}@g" \ + ${DTR_DPDK_SOURCE_DIR}/index.rst fi done -unzip -o ${STATIC_DIR_ARCH}/${JEN_JOB}-16.zip -d ${WORKING_DIR}/ +unzip -o ${STATIC_DIR_ARCH}/${JEN_JOB}-${JEN_BUILD[-1]}.zip -d ${WORKING_DIR}/ python run_robot_data.py -i ${WORKING_DIR}/robot-plugin/output.xml \ --output ${DTR_DPDK_SOURCE_DIR}/dpdk_performance_results.rst \ - --formatting rst --start 3 --level 2 -sed -i -e "s@###JOB###@${JEN_JOB}\/16@g" \ - ${DTR_DPDK_SOURCE_DIR}/index.rst -sed -i -e "s@###LINK###@${CSIT_JEN_URL}\/${JEN_JOB}\/16@g" \ - ${DTR_DPDK_SOURCE_DIR}/index.rst + --formatting rst --start 4 --level 2 ### FUNCTIONAL SOURCE DATA -JEN_JOB='csit-vpp-functional-master-ubuntu1604-virl' +JEN_JOB='csit-vpp-functional-1707-ubuntu1604-virl' JEN_BUILD='lastSuccessfulBuild' if [[ ${DEBUG} -eq 1 ]] ; @@ -147,6 +152,15 @@ then else curl -fs ${CSIT_JEN_URL}/${JEN_JOB}/${JEN_BUILD}/robot/report/\*zip\*/robot-plugin.zip \ -o ${STATIC_DIR_ARCH}/${JEN_JOB}-${JEN_BUILD}.zip + + sed -i -e "s@###JOB###@${JEN_JOB}\/${JEN_BUILD}@g" \ + ${DTR_FUNC_SOURCE_DIR}/index.rst + sed -i -e "s@###LINK###@${CSIT_JEN_URL}\/${JEN_JOB}\/${JEN_BUILD}@g" \ + ${DTR_FUNC_SOURCE_DIR}/index.rst + sed -i -e "s@###JOB###@${JEN_JOB}\/${JEN_BUILD}@g" \ + ${DTC_FUNC_SOURCE_DIR}/index.rst + sed -i -e "s@###LINK###@${CSIT_JEN_URL}\/${JEN_JOB}\/${JEN_BUILD}@g" \ + ${DTC_FUNC_SOURCE_DIR}/index.rst fi unzip -o ${STATIC_DIR_ARCH}/${JEN_JOB}-${JEN_BUILD}.zip -d ${WORKING_DIR}/ @@ -156,18 +170,10 @@ python run_robot_data.py -i ${WORKING_DIR}/robot-plugin/output.xml \ python run_robot_teardown_data.py -i ${WORKING_DIR}/robot-plugin/output.xml \ --output ${DTC_FUNC_SOURCE_DIR}/vpp_functional_configuration.rst \ --data "VAT_H" -f "rst" --start 5 --level 2 -sed -i -e "s@###JOB###@${JEN_JOB}\/${JEN_BUILD}@g" \ - ${DTR_FUNC_SOURCE_DIR}/index.rst -sed -i -e "s@###LINK###@${CSIT_JEN_URL}\/${JEN_JOB}\/${JEN_BUILD}@g" \ - ${DTR_FUNC_SOURCE_DIR}/index.rst -sed -i -e "s@###JOB###@${JEN_JOB}\/${JEN_BUILD}@g" \ - ${DTC_FUNC_SOURCE_DIR}/index.rst -sed -i -e "s@###LINK###@${CSIT_JEN_URL}\/${JEN_JOB}\/${JEN_BUILD}@g" \ - ${DTC_FUNC_SOURCE_DIR}/index.rst ### HONEYCOMB SOURCE DATA -JEN_JOB='hc2vpp-csit-integration-master-ubuntu1604' +JEN_JOB='hc2vpp-csit-integration-1707-ubuntu1604' JEN_BUILD='lastSuccessfulBuild' if [[ ${DEBUG} -eq 1 ]] ; @@ -176,21 +182,22 @@ then else curl -fs ${HC_JEN_URL}/${JEN_JOB}/${JEN_BUILD}/robot/report/\*zip\*/robot-plugin.zip \ -o ${STATIC_DIR_ARCH}/${JEN_JOB}-${JEN_BUILD}.zip + + sed -i -e "s@###JOB###@${JEN_JOB}\/${JEN_BUILD}@g" \ + ${DTR_HONEYCOMB_SOURCE_DIR}/index.rst + sed -i -e "s@###LINK###@${HC_JEN_URL}\/${JEN_JOB}\/${JEN_BUILD}@g" \ + ${DTR_HONEYCOMB_SOURCE_DIR}/index.rst fi unzip -o ${STATIC_DIR_ARCH}/${JEN_JOB}-${JEN_BUILD}.zip -d ${WORKING_DIR}/ python run_robot_data.py -i ${WORKING_DIR}/robot-plugin/output.xml \ --output ${DTR_HONEYCOMB_SOURCE_DIR}/honeycomb_functional_results.rst \ - --formatting rst --start 3 --level 2 -sed -i -e "s@###JOB###@${JEN_JOB}\/${JEN_BUILD}@g" \ - ${DTR_HONEYCOMB_SOURCE_DIR}/index.rst -sed -i -e "s@###LINK###@${HC_JEN_URL}\/${JEN_JOB}\/${JEN_BUILD}@g" \ - ${DTR_HONEYCOMB_SOURCE_DIR}/index.rst + --formatting rst --start 5 --level 2 # Delete temporary json files find ${SOURCE_DIR} -name "*.json" -type f -delete -# Generate the documentation: +# Generate the documentation DATE=$(date -u '+%d-%b-%Y') @@ -354,11 +361,13 @@ python run_plot.py --input ${PLOT_DPDK_SOURCE_DIR} \ python run_plot.py --input ${PLOT_DPDK_SOURCE_DIR} \ --output ${STATIC_DIR_DPDK}/64B-1t1c-ipv4-ndrdisc \ --title "64B-1t1c-ethip4-ip4base-l3fwd-ndrdisc" \ - --xpath '//*[@framesize="64B" and contains(@tags,"BASE") and contains(@tags,"NDRDISC") and contains(@tags,"1T1C") and contains(@tags,"IP4FWD")]' + --xpath '//*[@framesize="64B" and contains(@tags,"BASE") and contains(@tags,"NDRDISC") and contains(@tags,"1T1C") and contains(@tags,"IP4FWD")]' \ + --lower 2000000 --upper 12000000 python run_plot.py --input ${PLOT_DPDK_SOURCE_DIR} \ --output ${STATIC_DIR_DPDK}/64B-2t2c-ipv4-ndrdisc \ --title "64B-2t2c-ethip4-ip4base-l3fwd-ndrdisc" \ - --xpath '//*[@framesize="64B" and contains(@tags,"BASE") and contains(@tags,"NDRDISC") and contains(@tags,"2T2C") and contains(@tags,"IP4FWD")]' + --xpath '//*[@framesize="64B" and contains(@tags,"BASE") and contains(@tags,"NDRDISC") and contains(@tags,"2T2C") and contains(@tags,"IP4FWD")]' \ + --lower 2000000 --upper 12000000 python run_plot.py --input ${PLOT_DPDK_SOURCE_DIR} \ --output ${STATIC_DIR_DPDK}/64B-1t1c-l2-pdrdisc \ @@ -371,11 +380,13 @@ python run_plot.py --input ${PLOT_DPDK_SOURCE_DIR} \ python run_plot.py --input ${PLOT_DPDK_SOURCE_DIR} \ --output ${STATIC_DIR_DPDK}/64B-1t1c-ipv4-pdrdisc \ --title "64B-1t1c-ethip4-ip4base-l3fwd-pdrdisc" \ - --xpath '//*[@framesize="64B" and contains(@tags,"BASE") and contains(@tags,"PDRDISC") and not(contains(@tags,"NDRDISC")) and contains(@tags,"1T1C") and contains(@tags,"IP4FWD")]' + --xpath '//*[@framesize="64B" and contains(@tags,"BASE") and contains(@tags,"PDRDISC") and not(contains(@tags,"NDRDISC")) and contains(@tags,"1T1C") and contains(@tags,"IP4FWD")]' \ + --lower 20000000 --upper 30000000 python run_plot.py --input ${PLOT_DPDK_SOURCE_DIR} \ --output ${STATIC_DIR_DPDK}/64B-2t2c-ipv4-pdrdisc \ --title "64B-2t2c-ethip4-ip4base-l3fwd-pdrdisc" \ - --xpath '//*[@framesize="64B" and contains(@tags,"BASE") and contains(@tags,"PDRDISC") and not(contains(@tags,"NDRDISC")) and contains(@tags,"2T2C") and contains(@tags,"IP4FWD")]' + --xpath '//*[@framesize="64B" and contains(@tags,"BASE") and contains(@tags,"PDRDISC") and not(contains(@tags,"NDRDISC")) and contains(@tags,"2T2C") and contains(@tags,"IP4FWD")]' \ + --lower 20000000 --upper 30000000 # Plot latency -- 2.16.6