It is commonly accepted that decoupling network functions (NFs) from the underlying physical infrastructure using virtualization and cloud technologies enables service innovation. By means of Software Defined Networking (SDN), the programmability of the Network Function Virtualization (NFV) infrastructure has gained a huge potential for supporting the deployment of NFs in a variety of (virtualized) environments, including Internet and cloud service providers, campus and enterprise networks, and over-the-top applications.
One of the fundamental questions is: Are the software-based solutions (ever going to be) able to cope with the forever changing and increasing traffic demands? Network Function Performance Analyzer is a publicly available, open-source measurement application, which is not only in accordance with standardized methodologies (RFC 2544), but also makes possible to comprehensively compare performance metrics of NFs in an exhaustive range of dimensions. More precisely, NFPA answers
- how a software-based NF
- implemented in a generic language (e.g., C/C++)
- running on a generic platform (e.g., Intel Xeon)
- over a generic operating system (e.g., Linux)
- in different environments (e.g., virtual machine)
- using different drivers performs
- under different traffic patterns.

Complying with RFC 2544, our NFPA is a standalone benchmarking tool, connected to the Device Under Test (DUT), as depicted in the figure above. The NFPA user connects to an NFPA node, i.e., a computer that is able to run NFPA and is connected directly to a separate computer running the desired network function. It's typically connected via two interfaces, however, it is possible to use only one bidirectional link. Then, the user determines the measurement target on the NFPA node by all its relevant parameters, e.g., details of the hardware and software components, number of repeated measurements and their duration, and selects the traffic traces to be used. Afterwards, NFPA sends packets on port 0 (and also on port 1 in case of bidirectional measurements), while receives (a portion of those) packets on port 1 (and also on port 0 respectively), then it calculates the throughput of the DUT in terms of packet/s and bit/s. Once the measurement is finished, NFPA analyzes the results and plots them in the preset units, and in parallel saves the measurement data in a local database.
In addition, we provide a central server with a web-based API, whereby the NFPA user can upload and share the results for further comparison, and in return the user can browse the set of results measured by others.
NFPA’s engine is implemented in Python and relies on standard libraries. It can be configured both by config files and via a lightweight web GUI. In order to avoid the limitation of kernel space network card drivers, NFPA’s network interface is built on Intel’s DataPlane Development Kit (DPDK) for fast packet processing: in particular, for sending and receiving traffic, NFPA uses PktGen with custom Lua scripts for parameterizing, automating and controlling the measurements. In order to support portability, the results are stored in a local SQLite database. Result charts are created using Gnuplot. The overall set of measurements at our central node is stored in PostgreSQL database.
With the increased number of measurement needs and users, new traffic traces have been published, where in most cases the header fields have been randomized. Why is it important to use and match for random header fields? The answer is not trivial, but we have measured that in some cases network functions, such as Open vSwitch, are able to use prefix-es for flow rules making it to be more efficient than it might be in a more realistic scenario (for more details, see how caching (micro and megaflow cache) is implemented in Open vSwitch).
Nevertheless, to ease the usage of these pcap files for your network functions, we extended our site with a Use-cases page, where more details can be found.
Name | #diff. flows | Description | Packet Size (bytes) | Use-case | ![]() |
|||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
64 | 128 | 256 | 512 | 1024 | 1280 | 1500 | other | |||||
trL2_1 | 1 | Different destination MAC addresses | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
l2-switch |
![]() (483M) |
|
trL2_10 | 10 | Different destination MAC addresses | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|||
trL2_100 | 100 | Different destination MAC addresses | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|||
trL2_1000 | 1000 | Different destination MAC addresses | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|||
trL2_10000 | 10.000 | Different destination MAC addresses | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|||
trL2_100000 | 100.000 | Different destination MAC addresses | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|||
trL3_1 | 1 | Different destination IP addresses | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
l3-router |
![]() (484M) |
|
trL3_10 | 10 | Different destination IP addresses | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|||
trL3_100 | 100 | Different destination IP addresses | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|||
trL3_1000 | 1000 | Different destination IP addresses | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|||
trL3_10000 | 10.000 | Different destination IP addresses | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|||
trL3_100000 | 100.000 | Different destination IP addresses | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|||
trPR_12 | 12 | Different dst and src MAC addresses, different src and dst IP addresses, different src and dst port | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
l2-switch l3-router |
![]() (500M) |
|
trPR_24 | 24 | Different dst and src MAC addresses, different src and dst IP addresses, different src and dst port | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|||
trPR_36 | 36 | Different dst and src MAC addresses, different src and dst IP addresses, different src and dst port | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|||
trPR_48 | 48 | Different dst and src MAC addresses, different src and dst IP addresses, different src and dst port | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|||
trPR_100 | 100 | Different dst and src MAC addresses, different src and dst IP addresses, different src and dst port | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|||
trPR_1000 | 1000 | Different dst and src MAC addresses, different src and dst IP addresses, different src and dst port | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|||
trPR_10000 | 10.000 | Different dst and src MAC addresses, different src and dst IP addresses, different src and dst port | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|||
trPR_100000 | 100.000 | Different dst and src MAC addresses, different src and dst IP addresses, different src and dst port | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|||
trPR_500000 | 500.000 | Different dst and src MAC addresses, different src and dst IP addresses, different src and dst port | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
l2-switch l3-router |
![]() (2.3G) |
|
trPR_1000000 | 1.000.000 | Different dst and src MAC addresses, different src and dst IP addresses, different src and dst port | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
l2-switch l3-router |
![]() (4.5G) |
|
trPR_2000000 | 2.000.000 | Different dst and src MAC addresses, different src and dst IP addresses, different src and dst port | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
l2-switch l3-router |
![]() (8.9G) |
|
LB_ACL_1 | 1 | L2 headers are the same, random src IP, dst IP address=192.168.2.1, random src port and 80 dst port | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
load_balancer |
![]() (489M) |
|
LB_ACL_10 | 10 | L2 headers are the same, random src IP with random src port, 70% of the flows have random dst IP addresses are random from range 192.168.2.1 - .10 with dst port 80 | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|||
LB_ACL_100 | 100 | L2 headers are the same, random src IP with random src port, 70% of the flows have random dst IP addresses are random from range 192.168.2.1 - .100 with dst port 80 | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|||
LB_ACL_1000 | 1000 | L2 headers are the same, random src IP with random src port, 70% of the flows have random dst IP addresses are random from range 192.168.2.1 - .100 with dst port 80 | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|||
LB_ACL_10000 | 10.000 | L2 headers are the same, random src IP with random src port, 70% of the flows have random dst IP addresses are random from range 192.168.2.1 - .100 with dst port 80 | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|||
LB_ACL_100000 | 100.000 | L2 headers are the same, random src IP with random src port, 70% of the flows have random dst IP addresses are random from range 192.168.2.1 - .100 with dst port 80 | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|||
AGW_1flows | 1 | L2 headers are the same, random local src IP (10.x), random dst IP address, random src port and dst port | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
agw |
![]() (16M) |
|
AGW_10flows | 10 | L2 headers are the same, random local src IP (10.x), random dst IP address, random src port and dst port | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|||
AGW_100flows | 100 | L2 headers are the same, random local src IP (10.x), random dst IP address, random src port and dst port | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|||
AGW_1000flows | 1000 | L2 headers are the same, random local src IP (10.x), random dst IP address, random src port and dst port | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|||
AGW_10000flows | 10.000 | L2 headers are the same, random local src IP (10.x), random dst IP address, random src port and dst port | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|||
AGW_100000flows | 100.000 | L2 headers are the same, random local src IP (10.x), random dst IP address, random src port and dst port | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|||
trPR_v2_12 | 24 | Different src MAC addresses, same dst MAC address, different src and dst IP addresses (but exluding LAN, localhost, and Multicast addresses, different src and dst port | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
l3-router_v2 |
![]() (399M) |
|
trPR_v2_24 | 12 | Different src MAC addresses, same dst MAC address, different src and dst IP addresses (but exluding LAN, localhost, and Multicast addresses, different src and dst port | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|||
trPR_v2_36 | 36 | Different src MAC addresses, same dst MAC address, different src and dst IP addresses (but exluding LAN, localhost, and Multicast addresses, different src and dst port | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|||
trPR_v2_48 | 48 | Different src MAC addresses, same dst MAC address, different src and dst IP addresses (but exluding LAN, localhost, and Multicast addresses, different src and dst port | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|||
trPR_v2_100 | 100 | Different src MAC addresses, same dst MAC address, different src and dst IP addresses (but exluding LAN, localhost, and Multicast addresses, different src and dst port | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|||
trPR_v2_1000 | 1000 | Different src MAC addresses, same dst MAC address, different src and dst IP addresses (but exluding LAN, localhost, and Multicast addresses, different src and dst port | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|||
trPR_v2_10000 | 10.000 | Different src MAC addresses, same dst MAC address, different src and dst IP addresses (but exluding LAN, localhost, and Multicast addresses, different src and dst port | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|||
trPR_v2_100000 | 100.000 | Different src MAC addresses, same dst MAC address, different src and dst IP addresses (but exluding LAN, localhost, and Multicast addresses, different src and dst port | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
See our published Demo paper presented at IEEE NFV-SDN Conference held in San Francisco 18th-20th, November, 2015. [Bibtex]
@inproceedings{csikor2015nfvsdn,
title={{NFPA}: Network Function Performance Analyzer},
author={Csikor, Levente and Szalay, M\'ark and Sonkoly, Bal{\'a}zs and Toka, L\'aszl\'o},
booktitle={IEEE Conference on Network Function Virtualization and Software Defined Networks Demo Track (NFV-SDN)},
pages={17--19},
year={2015},
address = {San Francisco, CA, USA},
keywords = {Software defined networking},
note={Results are browsable at \url{http://nfpa.tmit.bme.hu}.}
}
Check our accompanying poster!
Citation:
Google scholar