Multithreading epoll_等待多个线程的速度更快?

Multithreading epoll_等待多个线程的速度更快?,multithreading,epoll,Multithreading,Epoll,我正在考虑基于epoll编写一个tcp服务器。 为了获得最佳性能,我也想实现多核支持。但在我的研究中,出现了以下问题: 调用来自两个不同线程的两个epoll\u wait()-调用是否更快,每个线程在双核上观察自己的文件描述符?或者这和只调用一个观察所有文件描述符的epoll\u wait()一样快 由于内核观察文件描述符,我认为调用epoll\u wait()?在用户空间上使用多少线程无关紧要,我怀疑您是正确的,在您提到的两种情况下,epoll本身的性能没有什么不同。OTOH,区别在于,通过在

我正在考虑基于
epoll
编写一个tcp服务器。 为了获得最佳性能,我也想实现多核支持。但在我的研究中,出现了以下问题: 调用来自两个不同线程的两个
epoll\u wait()
-调用是否更快,每个线程在双核上观察自己的文件描述符?或者这和只调用一个观察所有文件描述符的
epoll\u wait()
一样快


由于内核观察文件描述符,我认为调用
epoll\u wait()

在用户空间上使用多少线程无关紧要,我怀疑您是正确的,在您提到的两种情况下,epoll本身的性能没有什么不同。OTOH,区别在于,通过在每个线程中都有一个事件循环,您不需要将上下文切换到单独的工作线程来处理连接。例如,这就是nginx的工作方式,请参见,例如,您甚至可以在多个线程上为同一个epoll\u fd同时调用epoll\u wait,只要您使用边缘触发(EPOLLET)模式(并注意同步)。使用这种方法,与单线程epoll事件循环相比,您可以在多核机器上获得真正的性能优势

事实上,我不久前已经进行了性能测量,请参阅我的博客帖子了解结果:


您希望更改多久发生一次?为什么只使用ePallet模式?因为如果您在任何其他模式下工作,ePall将向多个线程报告相同的文件描述符,从而导致虚假唤醒。此链接()有助于理解链接所指的“虚假唤醒”。