Testing SR-IOV

NFVbench supports SR-IOV with the PVP and PVVP packet flow. Most use cases for SR-IOV only require single VNF chains (NxPVP). Daisy chaining VNFs with SR-IOV (PVVP) requires selecting either SR-IOV for the middle network or a fast vswitch (using the standard OVS for that purpose works but would be a serious bottleneck)

Instructions below refer to the PVP or PVVP use cases. For external chains using SR-IOV, select the VLAN tagging option that corresponds to the external chains SR-IOV setting.

Pre-requisites

To test SR-IOV you need to have compute nodes configured to support one or more SR-IOV interfaces (also knows as PF or physical function) and you need OpenStack to be configured to support SR-IOV. You will also need to know: - the name of the physical networks associated to the SR-IOV interfaces (this is a configuration in Nova compute) - the VLAN range that can be used on the switch ports that are wired to the SR-IOV ports. Such switch ports are normally configured in trunk mode with a range of VLAN ids enabled on that port

For example, in the case of 2 SR-IOV ports per compute node, 2 physical networks are generally configured in OpenStack with a distinct name. The VLAN range to use is is also allocated and reserved by the network administrator and in coordination with the corresponding top of rack switch port configuration.

Configuration

To enable SR-IOV test, you will need to provide the following configuration options to NFVbench (in the configuration file). This example instructs NFVbench to create the left and right networks of a PVP packet flow to run on 2 SRIOV ports named “phys_sriov0” and “phys_sriov1” using resp. segmentation_id 2000 and 2001:

sriov: true
internal_networks:
   left:
       segmentation_id: 2000
       physical_network: phys_sriov0
   right:
       segmentation_id: 2001
       physical_network: phys_sriov1

The segmentation ID fields must be different. In the case of PVVP, the middle network also needs to be provisioned properly. The same physical network can also be shared by the virtual networks but with different segmentation IDs.

Multi-Chaining

The above configuration works for multi-chaining and shared network (“service_chain_shared_net” set to true). In that case all VNFs will share the same left and right network/VLAN.

In the case of non shared network (“service_chain_shared_net” set to false), the segmentation_id fields must contain a list of distinct VLANs to use for each chain. Example of configuration for 3 chains:

sriov: true
internal_networks:
   left:
       segmentation_id: [2000, 2001, 2002]
       physical_network: phys_sriov0
   right:
       segmentation_id: [2100, 2101, 2102]
       physical_network: phys_sriov1

Alternatively it is also possible to specify different physnets per chain:

sriov: true
internal_networks:
   left:
       segmentation_id: [2000, 2001, 2002]
       physical_network: [phys_sriov0, phys_sriov2, phys_sriov4]
   right:
       segmentation_id: [2100, 2101, 2102]
       physical_network: [phys_sriov1, phys_srviov3, phys_sriov5]

NFVbench cores with SR-IOV

The default core count for NFVbench/TRex may not be sufficient for higher throughput line cards (greater than 10Gbps). This will result in warning messages such as:

INFO WARNING: There is a significant difference between requested TX rate (119047618) and actual TX rate (38897379).
The traffic generator may not have sufficient CPU to achieve the requested TX rate.

In that case it is recommended to try allocating more cores to TRex using the cores property in the configuration file, for example to set to 8 cores:

cores: 8

It is also advisable to increase the number of vcpus in the VMs:

VM Flavor for SR-IOV and NIC NUMA socket placement

Because SR-IOV throughput uses a lot of CPU in the VM, it is recommended to increase the vcpu count, for example to 4 vcpus:

flavor:
  # Number of vCPUs for the flavor
  vcpus: 4
  # Memory for the flavor in MB
  ram: 8192
  # Size of local disk in GB
  disk: 0
  extra_specs:
      "hw:cpu_policy": dedicated

If the 2 selected ports reside on NICs that are on different NUMA sockets, you will need to explicitly tell Nova to use 2 numa nodes in the flavor used for the VMs in order to satisfy the filters, for example:

flavor:
  # Number of vCPUs for the flavor
  vcpus: 4
  # Memory for the flavor in MB
  ram: 8192
  # Size of local disk in GB
  disk: 0
  extra_specs:
      "hw:cpu_policy": dedicated
      "hw:numa_nodes": 2

Failure to do so might cause the VM creation to fail with the Nova error “Instance creation error: Insufficient compute resources: Requested instance NUMA topology together with requested PCI devices cannot fit the given host NUMA topology.”

Example of configuration file (shared network)

Single chain or multi-chain with shared network (only requires 2 segmentation ID for all chains):

flavor:
   # Number of vCPUs for the flavor
   vcpus: 4
   # Memory for the flavor in MB
   ram: 8192
   # Size of local disk in GB
   disk: 0
   extra_specs:
      "hw:cpu_policy": dedicated
cores: 8
sriov: true
internal_networks:
   left:
      segmentation_id: 3830
      physical_network: phys_sriov0
   right:
      segmentation_id: 3831
      physical_network: phys_sriov1

Example of full run 2xPVP shared network SR-IOV:

2018-12-03 18:24:07,419 INFO Loading configuration file: /tmp/nfvbench/sriov.yaml
2018-12-03 18:24:07,423 INFO -c /tmp/nfvbench/sriov.yaml --rate 10Mpps --duration 1 -scc 2 --no-cleanup
2018-12-03 18:24:07,426 INFO Connecting to TRex (127.0.0.1)...
2018-12-03 18:24:07,575 INFO Connected to TRex
2018-12-03 18:24:07,575 INFO    Port 0: Ethernet Controller XL710 for 40GbE QSFP+ speed=40Gbps mac=3c:fd:fe:b5:3d:70 pci=0000:5e:00.0 driver=net_i40e
2018-12-03 18:24:07,575 INFO    Port 1: Ethernet Controller XL710 for 40GbE QSFP+ speed=40Gbps mac=3c:fd:fe:b5:3d:71 pci=0000:5e:00.1 driver=net_i40e
2018-12-03 18:24:07,626 INFO Found built-in VM image file nfvbenchvm-0.6.qcow2
2018-12-03 18:24:09,072 INFO Created flavor 'nfvbench.medium'
2018-12-03 18:24:10,004 INFO Created network: nfvbench-lnet.
2018-12-03 18:24:10,837 INFO Created network: nfvbench-rnet.
2018-12-03 18:24:12,065 INFO Security disabled on port nfvbench-loop-vm0-0
2018-12-03 18:24:13,425 INFO Security disabled on port nfvbench-loop-vm0-1
2018-12-03 18:24:13,425 INFO Creating instance nfvbench-loop-vm0 with AZ
2018-12-03 18:24:16,052 INFO Created instance nfvbench-loop-vm0 - waiting for placement resolution...
2018-12-03 18:24:16,240 INFO Waiting for instance nfvbench-loop-vm0 to become active (retry 1/101)...
<snip>
2018-12-03 18:24:59,266 INFO Waiting for instance nfvbench-loop-vm0 to become active (retry 21/101)...
2018-12-03 18:25:01,427 INFO Instance nfvbench-loop-vm0 is active and has been placed on nova:charter-compute-5
2018-12-03 18:25:02,819 INFO Security disabled on port nfvbench-loop-vm1-0
2018-12-03 18:25:04,198 INFO Security disabled on port nfvbench-loop-vm1-1
2018-12-03 18:25:04,199 INFO Creating instance nfvbench-loop-vm1 with AZ nova:charter-compute-5
2018-12-03 18:25:05,032 INFO Created instance nfvbench-loop-vm1 on nova:charter-compute-5
2018-12-03 18:25:05,033 INFO Instance nfvbench-loop-vm0 is ACTIVE on nova:charter-compute-5
2018-12-03 18:25:05,212 INFO Waiting for 1/2 instance to become active (retry 1/100)...
<snip>
2018-12-03 18:25:48,531 INFO Waiting for 1/2 instance to become active (retry 21/100)...
2018-12-03 18:25:50,677 INFO Instance nfvbench-loop-vm1 is ACTIVE on nova:charter-compute-5
2018-12-03 18:25:50,677 INFO All instances are active
2018-12-03 18:25:50,677 INFO Port 0: VLANs [3830, 3830]
2018-12-03 18:25:50,677 INFO Port 1: VLANs [3831, 3831]
2018-12-03 18:25:50,677 INFO Port 0: dst MAC ['fa:16:3e:de:4e:54', 'fa:16:3e:7a:26:2b']
2018-12-03 18:25:50,677 INFO Port 1: dst MAC ['fa:16:3e:6c:bb:cd', 'fa:16:3e:e0:48:45']
2018-12-03 18:25:50,678 INFO ChainRunner initialized
2018-12-03 18:25:50,678 INFO Starting 2xPVP benchmark...
2018-12-03 18:25:50,683 INFO Starting traffic generator to ensure end-to-end connectivity
2018-12-03 18:25:50,698 INFO Created 2 traffic streams for port 0.
2018-12-03 18:25:50,700 INFO Created 2 traffic streams for port 1.
2018-12-03 18:25:50,821 INFO Captured unique src mac 0/4, capturing return packets (retry 1/100)...
2018-12-03 18:25:52,944 INFO Received packet from mac: fa:16:3e:de:4e:54 (chain=0, port=0)
2018-12-03 18:25:52,945 INFO Received packet from mac: fa:16:3e:6c:bb:cd (chain=0, port=1)
2018-12-03 18:25:53,077 INFO Captured unique src mac 2/4, capturing return packets (retry 2/100)...
<snip>
2018-12-03 18:26:10,798 INFO End-to-end connectivity established
2018-12-03 18:26:10,816 INFO Cleared all existing streams
2018-12-03 18:26:10,846 INFO Created 4 traffic streams for port 0.
2018-12-03 18:26:10,849 INFO Created 4 traffic streams for port 1.
2018-12-03 18:26:10,849 INFO Starting to generate traffic...
2018-12-03 18:26:10,850 INFO Running traffic generator
2018-12-03 18:26:11,877 INFO TX: 10000004; RX: 9999999; Est. Dropped: 5; Est. Drop rate: 0.0000%
2018-12-03 18:26:11,877 INFO ...traffic generating ended.
2018-12-03 18:26:11,882 INFO Service chain 'PVP' run completed.
2018-12-03 18:26:11,936 INFO Clean up skipped.
2018-12-03 18:26:11,969 INFO
========== NFVBench Summary ==========
Date: 2018-12-03 18:25:50
NFVBench version 3.0.3.dev1
Openstack Neutron:
  vSwitch: OPENVSWITCH
  Encapsulation: VLAN
Benchmarks:
> Networks:
  > Components:
    > Traffic Generator:
        Profile: trex-local
        Tool: TRex
    > Versions:
      > Traffic_Generator:
          build_date: Nov 13 2017
          version: v2.32
          built_by: hhaim
          mode: STL
          build_time: 10:58:17
      > CiscoVIM: 2.9.7-17036
  > Service chain:
    > PVP:
      > Traffic:
          Profile: traffic_profile_64B
          Bidirectional: True
          Flow count: 10000
          Service chains count: 2
          Compute nodes: [u'nova:charter-compute-5']

          Run Summary:

            +-----------------+-------------+----------------------+----------------------+----------------------+
            |   L2 Frame Size |  Drop Rate  |   Avg Latency (usec) |   Min Latency (usec) |   Max Latency (usec) |
            +=================+=============+======================+======================+======================+
            |              64 |   0.0000%   |                   13 |                   10 |                  141 |
            +-----------------+-------------+----------------------+----------------------+----------------------+


          L2 frame size: 64

          Run Config:

            +-------------+---------------------------+------------------------+-----------------+---------------------------+------------------------+-----------------+
            |  Direction  |  Requested TX Rate (bps)  |  Actual TX Rate (bps)  |  RX Rate (bps)  |  Requested TX Rate (pps)  |  Actual TX Rate (pps)  |  RX Rate (pps)  |
            +=============+===========================+========================+=================+===========================+========================+=================+
            |   Forward   |       336.0000 Mbps       |     336.0000 Mbps      |  336.0000 Mbps  |        500,000 pps        |      500,000 pps       |   500,000 pps   |
            +-------------+---------------------------+------------------------+-----------------+---------------------------+------------------------+-----------------+
            |   Reverse   |       336.0000 Mbps       |     336.0000 Mbps      |  336.0000 Mbps  |        500,000 pps        |      500,000 pps       |   500,000 pps   |
            +-------------+---------------------------+------------------------+-----------------+---------------------------+------------------------+-----------------+
            |    Total    |       672.0000 Mbps       |     672.0000 Mbps      |  672.0000 Mbps  |       1,000,000 pps       |     1,000,000 pps      |  1,000,000 pps  |
            +-------------+---------------------------+------------------------+-----------------+---------------------------+------------------------+-----------------+

          Forward Chain Packet Counters and Latency:

            +---------+--------------+--------------+------------+------------+------------+
            |  Chain  |  TRex.TX.p0  |  TRex.RX.p1  |  Avg lat.  |  Min lat.  |  Max lat.  |
            +=========+==============+==============+============+============+============+
            |    0    |   250,000    |   250,000    |  17 usec   |  10 usec   |  138 usec  |
            +---------+--------------+--------------+------------+------------+------------+
            |    1    |   250,000    |   250,000    |  17 usec   |  10 usec   |  139 usec  |
            +---------+--------------+--------------+------------+------------+------------+
            |  total  |   500,000    |   500,000    |  17 usec   |  10 usec   |  139 usec  |
            +---------+--------------+--------------+------------+------------+------------+

          Reverse Chain Packet Counters and Latency:

            +---------+--------------+--------------+------------+------------+------------+
            |  Chain  |  TRex.TX.p1  |  TRex.RX.p0  |  Avg lat.  |  Min lat.  |  Max lat.  |
            +=========+==============+==============+============+============+============+
            |    0    |   250,000    |   250,000    |  12 usec   |  10 usec   |  141 usec  |
            +---------+--------------+--------------+------------+------------+------------+
            |    1    |   250,000    |   250,000    |  11 usec   |  10 usec   |  132 usec  |
            +---------+--------------+--------------+------------+------------+------------+
            |  total  |   500,000    |   500,000    |  12 usec   |  10 usec   |  141 usec  |
            +---------+--------------+--------------+------------+------------+------------+

Example of configuration file (non shared network)

Multi-chain with non shared network (requires 2 segmentation ID per chain), example with 2 chains sharing the same 2 SRIOV ports (or PF):

flavor:
   # Number of vCPUs for the flavor
   vcpus: 4
   # Memory for the flavor in MB
   ram: 8192
   # Size of local disk in GB
   disk: 0
   extra_specs:
      "hw:cpu_policy": dedicated
cores: 8
sriov: true
internal_networks:
   left:
        segmentation_id: [3830, 3831]
        physical_network: phys_sriov0
   right:
        segmentation_id: [3832, 3833]
        physical_network: phys_sriov1

Example of full run 2xPVP non-shared network SR-IOV:

2018-12-04 17:15:25,284 INFO -c /tmp/nfvbench/sriov.yaml --rate 1Mpps --duration 1 -scc 2 --no-cleanup
2018-12-04 17:15:25,287 INFO Connecting to TRex (127.0.0.1)...
2018-12-04 17:15:25,463 INFO Connected to TRex
2018-12-04 17:15:25,464 INFO    Port 0: Ethernet Controller XL710 for 40GbE QSFP+ speed=40Gbps mac=3c:fd:fe:b5:3d:70 pci=0000:5e:00.0 driver=net_i40e
2018-12-04 17:15:25,464 INFO    Port 1: Ethernet Controller XL710 for 40GbE QSFP+ speed=40Gbps mac=3c:fd:fe:b5:3d:71 pci=0000:5e:00.1 driver=net_i40e
2018-12-04 17:15:25,515 INFO Found built-in VM image file nfvbenchvm-0.6.qcow2
2018-12-04 17:15:26,457 INFO Created flavor 'nfvbench.medium'
2018-12-04 17:15:27,449 INFO Created network: nfvbench-lnet0.
2018-12-04 17:15:28,368 INFO Created network: nfvbench-rnet0.
2018-12-04 17:15:29,143 INFO Created port nfvbench-loop-vm0-0
2018-12-04 17:15:29,626 INFO Security disabled on port nfvbench-loop-vm0-0
2018-12-04 17:15:30,636 INFO Created port nfvbench-loop-vm0-1
2018-12-04 17:15:31,139 INFO Security disabled on port nfvbench-loop-vm0-1
2018-12-04 17:15:31,140 INFO Creating instance nfvbench-loop-vm0 with AZ
2018-12-04 17:15:34,893 INFO Created instance nfvbench-loop-vm0 - waiting for placement resolution...
2018-12-04 17:15:35,068 INFO Waiting for instance nfvbench-loop-vm0 to become active (retry 1/101)...
<snip>
2018-12-04 17:16:22,253 INFO Instance nfvbench-loop-vm0 is active and has been placed on nova:charter-compute-4
2018-12-04 17:16:23,154 INFO Created network: nfvbench-lnet1.
2018-12-04 17:16:23,863 INFO Created network: nfvbench-rnet1.
2018-12-04 17:16:24,799 INFO Created port nfvbench-loop-vm1-0
2018-12-04 17:16:25,267 INFO Security disabled on port nfvbench-loop-vm1-0
2018-12-04 17:16:26,006 INFO Created port nfvbench-loop-vm1-1
2018-12-04 17:16:26,612 INFO Security disabled on port nfvbench-loop-vm1-1
2018-12-04 17:16:26,612 INFO Creating instance nfvbench-loop-vm1 with AZ nova:charter-compute-4
2018-12-04 17:16:27,610 INFO Created instance nfvbench-loop-vm1 on nova:charter-compute-4
2018-12-04 17:16:27,610 INFO Instance nfvbench-loop-vm0 is ACTIVE on nova:charter-compute-4
2018-12-04 17:16:27,788 INFO Waiting for 1/2 instance to become active (retry 1/100)...
<snip>

2018-12-04 17:17:04,258 INFO Instance nfvbench-loop-vm1 is ACTIVE on nova:charter-compute-4
2018-12-04 17:17:04,258 INFO All instances are active
2018-12-04 17:17:04,259 INFO Port 0: VLANs [3830, 3831]
2018-12-04 17:17:04,259 INFO Port 1: VLANs [3832, 3833]
2018-12-04 17:17:04,259 INFO Port 0: dst MAC ['fa:16:3e:ef:f4:b0', 'fa:16:3e:e5:74:cd']
2018-12-04 17:17:04,259 INFO Port 1: dst MAC ['fa:16:3e:d6:dc:84', 'fa:16:3e:8e:d9:30']
2018-12-04 17:17:04,259 INFO ChainRunner initialized
2018-12-04 17:17:04,260 INFO Starting 2xPVP benchmark...
2018-12-04 17:17:04,266 INFO Starting traffic generator to ensure end-to-end connectivity
2018-12-04 17:17:04,297 INFO Created 2 traffic streams for port 0.
2018-12-04 17:17:04,300 INFO Created 2 traffic streams for port 1.
2018-12-04 17:17:04,420 INFO Captured unique src mac 0/4, capturing return packets (retry 1/100)...
2018-12-04 17:17:06,532 INFO Received packet from mac: fa:16:3e:d6:dc:84 (chain=0, port=1)
2018-12-04 17:17:06,532 INFO Received packet from mac: fa:16:3e:ef:f4:b0 (chain=0, port=0)
2018-12-04 17:17:06,644 INFO Captured unique src mac 2/4, capturing return packets (retry 2/100)...
<snip>

2018-12-04 17:17:24,337 INFO Received packet from mac: fa:16:3e:8e:d9:30 (chain=1, port=1)
2018-12-04 17:17:24,338 INFO Received packet from mac: fa:16:3e:e5:74:cd (chain=1, port=0)
2018-12-04 17:17:24,338 INFO End-to-end connectivity established
2018-12-04 17:17:24,355 INFO Cleared all existing streams
2018-12-04 17:17:24,383 INFO Created 4 traffic streams for port 0.
2018-12-04 17:17:24,386 INFO Created 4 traffic streams for port 1.
2018-12-04 17:17:24,386 INFO Starting to generate traffic...
2018-12-04 17:17:24,386 INFO Running traffic generator
2018-12-04 17:17:25,415 INFO TX: 1000004; RX: 1000004; Est. Dropped: 0; Est. Drop rate: 0.0000%
2018-12-04 17:17:25,415 INFO ...traffic generating ended.
2018-12-04 17:17:25,420 INFO Service chain 'PVP' run completed.
2018-12-04 17:17:25,471 INFO Clean up skipped.
2018-12-04 17:17:25,508 INFO
========== NFVBench Summary ==========
Date: 2018-12-04 17:17:04
NFVBench version 3.0.3.dev1
Openstack Neutron:
  vSwitch: OPENVSWITCH
  Encapsulation: VLAN
Benchmarks:
> Networks:
  > Components:
    > Traffic Generator:
        Profile: trex-local
        Tool: TRex
    > Versions:
      > Traffic_Generator:
          build_date: Nov 13 2017
          version: v2.32
          built_by: hhaim
          mode: STL
          build_time: 10:58:17
      > CiscoVIM: 2.9.7-17036
  > Service chain:
    > PVP:
      > Traffic:
          Profile: traffic_profile_64B
          Bidirectional: True
          Flow count: 10000
          Service chains count: 2
          Compute nodes: [u'nova:charter-compute-4']

            Run Summary:

              +-----------------+-------------+----------------------+----------------------+----------------------+
              |   L2 Frame Size |  Drop Rate  |   Avg Latency (usec) |   Min Latency (usec) |   Max Latency (usec) |
              +=================+=============+======================+======================+======================+
              |              64 |   0.0000%   |                   18 |                   10 |                  120 |
              +-----------------+-------------+----------------------+----------------------+----------------------+


            L2 frame size: 64

            Run Config:

              +-------------+---------------------------+------------------------+-----------------+---------------------------+------------------------+-----------------+
              |  Direction  |  Requested TX Rate (bps)  |  Actual TX Rate (bps)  |  RX Rate (bps)  |  Requested TX Rate (pps)  |  Actual TX Rate (pps)  |  RX Rate (pps)  |
              +=============+===========================+========================+=================+===========================+========================+=================+
              |   Forward   |       336.0000 Mbps       |     336.0013 Mbps      |  336.0013 Mbps  |        500,000 pps        |      500,002 pps       |   500,002 pps   |
              +-------------+---------------------------+------------------------+-----------------+---------------------------+------------------------+-----------------+
              |   Reverse   |       336.0000 Mbps       |     336.0013 Mbps      |  336.0013 Mbps  |        500,000 pps        |      500,002 pps       |   500,002 pps   |
              +-------------+---------------------------+------------------------+-----------------+---------------------------+------------------------+-----------------+
              |    Total    |       672.0000 Mbps       |     672.0027 Mbps      |  672.0027 Mbps  |       1,000,000 pps       |     1,000,004 pps      |  1,000,004 pps  |
              +-------------+---------------------------+------------------------+-----------------+---------------------------+------------------------+-----------------+

            Forward Chain Packet Counters and Latency:

              +---------+--------------+--------------+------------+------------+------------+
              |  Chain  |  TRex.TX.p0  |  TRex.RX.p1  |  Avg lat.  |  Min lat.  |  Max lat.  |
              +=========+==============+==============+============+============+============+
              |    0    |   250,001    |   250,001    |  26 usec   |  10 usec   |  70 usec   |
              +---------+--------------+--------------+------------+------------+------------+
              |    1    |   250,001    |   250,001    |  11 usec   |  10 usec   |  39 usec   |
              +---------+--------------+--------------+------------+------------+------------+
              |  total  |   500,002    |   500,002    |  19 usec   |  10 usec   |  70 usec   |
              +---------+--------------+--------------+------------+------------+------------+

            Reverse Chain Packet Counters and Latency:

              +---------+--------------+--------------+------------+------------+------------+
              |  Chain  |  TRex.TX.p1  |  TRex.RX.p0  |  Avg lat.  |  Min lat.  |  Max lat.  |
              +=========+==============+==============+============+============+============+
              |    0    |   250,001    |   250,001    |  19 usec   |  10 usec   |  119 usec  |
              +---------+--------------+--------------+------------+------------+------------+
              |    1    |   250,001    |   250,001    |  19 usec   |  10 usec   |  120 usec  |
              +---------+--------------+--------------+------------+------------+------------+
              |  total  |   500,002    |   500,002    |  19 usec   |  10 usec   |  120 usec  |
              +---------+--------------+--------------+------------+------------+------------+