10

谁能帮我回答有关 epoll_wait 的问题。

  1. 在同一个 fds 集上使用许多调用 epoll_wait 的线程来为大约 100K 活动套接字提供服务是不是有点矫枉过正?还是只创建1个线程来执行epoll_wait就足够了?

  2. 例如,当只有一个套接字准备好读取数据时,有多少线程将从 epoll_wait 中唤醒?我的意思是,是否存在 2 个或更多线程将从 epoll_wait 唤醒但在结果事件中具有相同 fds 的情况?

  3. 在与许多活动客户端(例如 50K+)一起工作的服务器中组织线程的最佳方式是什么?我认为最好的方法是:1 个 I/O 工作线程,它执行 epoll_wait 和 i/o 操作。+许多数据处理线程将处理从 I/O 工作线程接收到的数据(可能需要很长时间,例如任何游戏逻辑),并为 I/O 工作线程组合新数据发送到客户端。我采用这种方法是否正确,或者任何人都可以帮助我找出组织这种方法的最佳方法?

提前致谢, 瓦伦丁

4

3 回答 3

12
  1. 使用 epoll 时,您希望将线程总数调整为要用于处理的物理 CPU 内核(或超线程调度单元)的数量。仅使用一个线程进行工作意味着一次最多有一个内核处于活动状态。

  2. 这取决于 epoll 文件描述符的模式。事件可以是“边缘触发”,即它们仅以原子方式发生一次,或“级别触发”,即如果缓冲区中有空间,任何调用者都会收到事件。

  3. 没有足够的信息可以说。为简单起见,我建议根本没有特殊用途的线程,而只需在接收事件的线程中处理每个事件的“命令”。但显然这取决于您的应用程序的性质。

于 2010-01-18T18:10:03.617 回答
5

我推荐你从 2006 年开始阅读:http: //www.kegel.com/c10k.html

于 2010-01-18T17:14:40.337 回答
-3

实际上这是一个错误的 epoll 用例。

You must absolutely not share the epoll fd between threads. Otherwise you have the possibility that one thread read part of incoming data on one fd and another thread too on the same fd without any way to know which part of the data was before the other.

Just call epoll_create in each and every thread that calls epoll_wait. Otherwise the I/O is broken.

于 2017-06-21T14:54:59.037 回答