NetSlices: Scalable Multi-core Packet Processing in User-space, Tudor Marian, Ki Suh Lee, and Hakim Weatherspoon. To appear in Proceedings of Symposium on Architectures for Networking and Communications Systems (ANCS), October 2012.
NetSlices: Scalable Multi-core Packet Processing in User-space, Tudor Marian, Ki Suh Lee, and Hakim Weatherspoon. Cornell University Technical Report http://ecommons.library.cornell.edu/handle/1813/29543, July 2012.
Operating Systems Abstractions for Software Packet Processing in Datacenters. Tudor Marian, PhD Dissertation, Cornell University, Department of Computer Science. August 24, 2010, Ithaca, NY.
Version 1.0: svn snapshot.
Version 1.1: svn snapshot (tested on kernel version 2.6.35).
Download and build the snapshot ('make'). Make sure you have the linux headers installed, e.g. in Ubuntu the package is called linux-headers-2.6.xx-xx where xx-xx should match your current kernel (type 'uname -r' to find it out). The kernel module was tested on kernel versions 2.6.20, 2.6.24, 2.6.27, and 2.6.28, found for example in stock Ubuntu 7.04, 8.04 and 8.10 respectively. The module was also ported to work on kernels versions up to 2.6.36, however it was not yet thoroughly tested in these configurations.
You will need at least one 10GbE NIC with multiqueue capabilities. NetSlice was tested with the Myricom Myri-10G (10G-PCIE-8B) and the Intel 82598EB 10-Gigabit AT NICs. NetSlice requires the NICs be loaded/configured with multiqueue support (e.g. the myri10ge driver is loaded with myri10ge_max_slices="${SLICES}", where "${SLICES}" is the number of NetSlice contexts---for a 16 core machine, "${SLICES}" defaults to 8).
The MSI-X interrupts from each NIC queue should be statically assigned exclusively to NetSlice contexts. You can simply use the set-irq-affinity.sh script that is distributed in the NetSlice bundle (e.g. assuming your box forwards packets between two interfaces named eth4 and eth5: 'for eth in eth4 eth5; do bash set-irq-affinity.sh "${eth}" 1 0; done').
Load the kernel module ('sudo insmod ./netslice_mod.ko').
Start netslice user-space app(s) (e.g. 'sudo ./netslice_test -v 128 /dev/netslice/node-0'). Typically you will have to start one user-space app for each NetSlice context, e.g.: let LAST_SLICE="${SLICES}-1"; pexec -c -r `seq -s " " 0 ${LAST_SLICE}` -e slice -o - -u - 'sudo ./netslice_test -v 128 "/dev/netslice/node-${slice}"'.