有没有人可以帮我回答关于epoll_wait的问题。
1.在同一个fds上使用多个调用epoll_wait的线程来服务大约100 K个活动套接字,这样做是不是太过分了?还是只创建一个线程来执行epoll_wait就足够了?
1.例如,当只有一个套接字准备好读取数据时,将有多少线程从epoll_wait中唤醒?我是说,会不会有两个或更多线程从epoll_wait中醒来,但在结果事件中具有相同fds的情况?
1.在服务器中组织线程的最佳方式是什么?服务器与许多活动客户端(例如50 K+)。我认为最好的方法是:1个I/O工作线程,执行epoll_wait和i/o操作。+许多数据处理线程,这些线程将处理从I/O工作线程接收到的数据(可能需要很长时间,例如任何游戏逻辑),并为I/O工作线程编写新数据以发送到客户端。我的方法正确吗?或者有人能帮我找出最好的组织方法吗?
先谢谢你了,瓦伦丁
3条答案
按热度按时间webghufk1#
1.使用epoll时,您希望将线程总数调整为要用于处理的物理CPU核心(或超线程分派单元)的数量。仅使用一个线程进行工作意味着一次最多有一个核心处于活动状态。
1.它取决于epoll文件描述符的模式。事件可以是“边缘触发的”,这意味着它们只发生一次原子,或“级别触发的”,这意味着如果缓冲区中有空间,则任何调用者都会获得事件。
1.没有足够的信息可以说。为了简单起见,我建议根本不要有特殊用途的线程,而只是在接收事件的线程中处理每个事件的“命令”。但显然这取决于您的应用程序的性质。
wswtfjt72#
我推荐你阅读2006年的这篇文章:http://www.kegel.com/c10k.html
esyap4oy3#
实际上,这是epoll的一个错误用例。
绝对不能在线程之间共享epoll fd。否则,你可能会有这样的情况:一个线程读取一个fd上的部分传入数据,而另一个线程也读取同一个fd上的部分传入数据,而没有任何方法知道哪部分数据在另一个之前。
只需在每个调用epoll_wait的线程中调用epoll_create。否则,I/O会损坏。