epoll表现

Val*_*tin 9 linux epoll

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

  1. 使用许多线程在相同的fds集上调用epoll_wait以服务于大约100K活动套接字是否过度?或者仅仅创建一个线程来执行epoll_wait就足够了?

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

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

在此先感谢,Valentin

And*_*oss 9

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

  2. 它取决于epoll文件描述符的模式.事件可以是"边缘触发",意味着它们只是原子地发生一次,或者"水平触发"意味着如果缓冲区中有空间,任何调用者都会获得事件.

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

  • 实际上,我会等待所有线程中的所有描述符。除非您知道可以通过在特定 CPU 上隔离相关工作来赢得缓存效果,否则进行这种分区通常是一种损失。您最终会耗尽一个 CPU,而另一个 CPU 仍有可以完成的工作。是的:epoll 操作是原子的(尽管显然您需要自己锁定任何自己的簿记)。 (2认同)
  • @Valentin 如果您想保证每个文件描述符只唤醒一次,请使用 EPOLLONESHOT。EPOLLET 有点实现了同样的事情,但没有那么强大的保证。[这](https://raw.github.com/dankamongmen/libtorque/master/doc/mteventqueues) 更详细地解释。 (2认同)

小智 5

我推荐你阅读 2006 年的这篇文章:http : //www.kegel.com/c10k.html