Introduction
Packet I/O Engine is a high-performance device driver for Intel 82598/82599-based network interface cards. This program is based on Intel IXGBE driver (version 2.0.38.2), but heavily modified for throughput-oriented user-level applications. The modifications include batch processing, huge packet buffer, aggressive software prefetch, etc. See details here.
Is this for me? or not?
Are you not sure if this source code is for you? Check below.
- If you are neither a software developer nor a researcher, probably this is not for you.
- This driver only works with Intel 10 Gigabit Ethernet Controller (82598EB, 82599EB/ES).
- Runs on a Linux operating system (tested with kernel 2.6.28 and above).
- This driver should not be used to replace the Intel IXGBE driver. All received packets are directly passed to user-level applications, not to Linux TCP/IP kernel. Any existing network applications will not work with this driver.
- If you are tired of the low performance of libpcap or libipq, you certainly want to try this.
Performance
Packet I/O is able to handle multi-10G traffic even with very small packets. It allows user-level applications to have enough computation power under high load. We present some micro-benchmark results here.
- Low-end desktop configuration: Core i3 540 (two cores), X520-DA2 (two 10GbE ports)
- (planning to conduct experiments on various systems)
Usage
This driver is implemented as a Linux kernel module (you may need some packages to build a kernel module). The installation steps are as easy as:
$ sudo ./install.py 0 0 (yes, you need Python)
Examples
The release includes three example codes to help your understanding:
- list_devices: This simple example shows the list of activated 10GbE interfaces.
- rx_dump: A tiny version of tcpdump (but only receive-side packets will be shown). It simply dumps received packets through specified interfaces. Since it tosses packets to the kernel, you can use normal network applications as usual while it's running on.
- echo: This program demonstrates how to do basic I/O with this driver. It transmits all received packets back to the same interface the packets came in (without any modification on the packets). It also gives a basic idea about how to utilize multi-core CPUs to align with Receive-Side Scaling (RSS).
- packet_generator: generates IPv4 or IPv6 UDP packets at its maximum speed. You can use this program to test the performance of your application. It is capable of having a specified number of flows (5-tuple combination).
Documentation
See the Github wiki pages.
Releases
- io_engine-0.2.tar.gz - Sep 22, 2011
- Intel X520-T2 (RJ45 copper port) support
- packet_generator has been added as a new sample program
- Supports up to Linux kernel 2.6.38
- IP MTU size bigger than 1500B is now explicitly prohibited
- echo with a new option '-s' just disposes all received packets
- Bug fixed: now SMP affinity is correctly set when the number of cores is equal to or greater than 10
- Bug fixed: now echo does batch processing correctly
- Bug fixed: some packets were truncated when mixed sizes of packets are transmitted
- io_engine-0.1.tar.gz - Mar 14, 2011
Source Code Repository
The development version is at Github. You may fork and send us pull requests.
License
This source code is distributed under GNU General Public License v2.