When I posted my first benchmark results, I did not realize that the limit on /dev/poll’s file descriptors is a soft one. Using setrlimit(2), you can change the limit (in my case from about 250 to over 64,000). With that, I’ve run some new benchmarks. These are the same as before, but now I’m running them with /dev/poll as well.
The bottom line is that, as expected, it scales very well (similarly to event ports). Its requirement for the use of synchronization between multiple threads is a remaining problem.
Without further adieu, here are the updated results:
Thanks to Alan Bateman for pointing out that /dev/poll can, in fact, handle a larger number of file descriptors.