如何最有效地处理大量文件描述符?

Kev*_* S. 7 sockets linux optimization performance

似乎有几个选项可用于处理大量套接字连接的程序(例如Web服务,p2p系统等).

  1. 产生一个单独的线程来处理每个套接字的I/O.
  2. 使用select系统调用将I/O多路复用到一个线程中.
  3. 使用轮询系统调用来多路复用I/O(替换选择).
  4. 使用epoll系统调用以避免必须通过用户/系统边界重复发送套接字fd.
  5. 产生许多I/O线程,每个线程使用poll API复用一组相对较小的连接总数.
  6. 按照#5,除了使用epoll API为每个独立的I/O线程创建一个单独的epoll对象.

在多核CPU上,我希望#5或#6具有最佳性能,但我没有任何硬数据支持这一点.搜索网页出现了这个页面,描述了上面作者测试方法#2,#3和#4的经验.不幸的是,这个网页似乎是7岁左右,没有明显的最新更新.

所以我的问题是,哪些方法让人们发现效率最高和/或是否有另一种方法比上面列出的方法更好?将赞赏对现实生活图,白皮书和/或网络可用书面的参考.

Mar*_*hio 0

我广泛使用 epoll(),并且它表现良好。我通常有数千个活动套接字,并使用多达 131,072 个套接字进行测试。而 epoll() 总是可以处理它。

我使用多个线程,每个线程轮询套接字的子集。这使代码变得复杂,但充分利用了多核 CPU。