This paper uses a high-performance, event-driven, HTTP server (the userver) to compare the performance of the select, poll, and epoll event mechanisms. We subject the userver to a variety of workloads that allow us to expose the relative strengths and weaknesses of each event mechanism.
Interestingly, initial results show that the select and poll event mechanisms perform comparably to the epoll event mechanism in the absence of idle connections. Profiling data shows a significant amount of time spent in executing a large number of
epoll_ctl system calls. As a result, we examine a variety of techniques for reducing
epoll_ctl overhead including edge-triggered notification, and introducing a new system call (
epoll_ctlv) that aggregates several
epoll_ctl calls into a single call. Our experiments indicate that although these techniques are successful at reducing
epoll_ctl overhead, they only improve performance slightly.