There has been much work done on the C10K and C10M problems for TCP applications. In contrast, UDP based applications are a neglected part of the networking infrastructure. Creating a UDP application which scales can be much more difficult than for an equivalent TCP application. The connectionless nature of UDP means that there is much more of a single point of failure (or performance limitation) than for TCP.
This talk covers a UDP application implementing a high performance RADIUS server, which came out of the FreeRADIUS project. The application is implemented using three methods. The first method is recvmsg() and sendmsg(), which are limited to one packet per sys call. The second method is recvmmsg() and sendmmsg(), which can operate on multiple packets per sys call. The final method is PF_RING.
The performance and implementation complexity of each method is described, and the methods are compared. We close with suggestions as to how UDP applications and the kernel could perhaps be improved.