对于处理大量套接字连接的程序(例如 Web 服务、p2p 系统等),似乎有几个选项可用。
- 生成一个单独的线程来处理每个套接字的 I/O。
- 使用select系统调用将 I/O 多路复用到单个线程中。
- 使用poll系统调用来多路复用 I/O(替换 select)。
- 使用epoll系统调用来避免必须通过用户/系统边界重复发送套接字 fd。
- 使用 poll API 生成多个 I/O 线程,每个线程多路复用一组相对较小的连接总数。
- 除了使用 epoll API 为每个独立的 I/O 线程创建单独的 epoll 对象之外,按照 #5。
在多核 CPU 上,我希望 #5 或 #6 具有最佳性能,但我没有任何硬数据支持这一点。搜索网络出现了这个页面,描述了作者在上面测试方法#2、#3 和#4 的经验。不幸的是,这个网页似乎有 7 年的历史,没有发现明显的最近更新。
所以我的问题是人们发现这些方法中的哪一种最有效和/或是否有另一种方法比上面列出的任何一种方法更好?对现实生活中的图表、白皮书和/或网络可用文章的引用将不胜感激。