我正在考虑基于epoll
. 为了获得最佳性能,我也想实现多核支持。但是在我的研究过程中,出现了以下问题:epoll_wait()
从两个不同的线程调用两个调用是否更快,每个线程都在双核上观察自己的文件描述符?epoll_wait()
或者这是否与调用一个观察所有文件描述符的单个函数一样快?
由于内核观察文件描述符,我认为我在用户空间调用中使用多少线程并不重要epoll_wait()
?
我正在考虑基于epoll
. 为了获得最佳性能,我也想实现多核支持。但是在我的研究过程中,出现了以下问题:epoll_wait()
从两个不同的线程调用两个调用是否更快,每个线程都在双核上观察自己的文件描述符?epoll_wait()
或者这是否与调用一个观察所有文件描述符的单个函数一样快?
由于内核观察文件描述符,我认为我在用户空间调用中使用多少线程并不重要epoll_wait()
?
只要您使用边缘触发 (EPOLLET) 模式(并注意同步),您甚至可以在多个线程上同时调用 epoll_wait 以获得相同的 epoll_fd。与单线程 epoll 事件循环相比,使用这种方法可以在多核机器上获得真正的性能优势。
实际上,我前段时间已经进行了性能测量,请参阅我的博客文章了解结果:
我怀疑你是对的,epoll 本身的性能在你提到的两种情况下没有什么不同。OTOH,可能会有所不同的是,通过在每个线程中都有一个事件循环,您不需要上下文切换到单独的工作线程来处理连接。这就是 nginx 的工作原理,参见http://www.aosabook.org/en/nginx.html。