DN techniques (such as granular policy-based controls) to switch packets to different network functions within the same machine. In order to address these issues and gain a deeper understanding about these bottlenecks, we started by creating a proof-of-concept environment. The idea was to iden- tify an ideal virtual environment for the CPE that would provide maximum flexibility and packet- processing capability on common-off-the-shelf (COTS) platform. For improvement in processing capabilities of the VNF itself, we worked with engineering teams of several vendors independently to optimize their respective code-bases to achieve higher packet processing capability on COTS platform. We pushed for the use of latest (and evolving) technolo- gies such as Data-Plane Development Kit (DPDK) and single root I/O virtualization (SR-IOV) (this is discussed in Chapter 3) in the proof-of-concept environment. Subsequent results showed that the use of these techniques, in addition to general software performance tuning that focuses on I/O optimization and CPU optimization, provided significant performance gains. The next section provides more details on the various options that were considered for creating a virtual implementation on the CPE. We will also discuss key reasons for getting higher or lower performance in each option, along with the tradeoffs one has to be aware of before selecting a spe- cific model for a virtual environment. 10.2.3 OPTIMIZING THE VIRTUAL ENVIRONMENT When we look at I/O performance in the virtual world we have to look at two areas, physical net- work interface cards (pNICs) and virtual NICs (vNICs). In a physical machine, Ethernet network traffic is handled by the pNICs installed on physical machines. Similarly, a virtual machine handles the traffic as it arrives at its virtual Ethernet interface or vNIC. The virtual environment between the pNIC and vNIC is responsible for transferring the data between the physical network and the VM/VNF. To understand the bottlenecks within the virtual environment, 