网络 – Twisted中select / poll与epoll反应堆的注意事项

我阅读和体验过的一切(基于龙卷风的应用程序)使我相信ePoll是Select和Poll基于网络的自然替代,特别是与Twisted。这使我偏执,它非常罕见的更好的技术或方法不带来价格。

阅读几十个epoll和替代品之间的比较表明,epoll显然是速度和可扩展性的冠军,特别是它以一种线性的方式,是梦幻般的。也就是说,处理器和内存利用率怎么样,epoll依然是冠军?

对于非常少的套接字(根据你的硬件,当然,但我们在谈论一些在10或更少的数量级),选择可以击败epoll内存使用和运行时速度。当然,对于这么少数量的套接字,两种机制都是如此之快,以至于在绝大多数情况下,你真的不关心这种差异。

一个澄清,虽然。选择和epoll都线性缩放。然而,一个很大的区别是,面向用户空间的API具有基于不同事物的复杂性。 select调用的成本大致与您传递的最大编号文件描述符的值相同。如果你在单个fd,100上选择,那么大约是在单个fd上选择的两倍,50。在最高之下添加更多的fds不是很自由,所以在实践中比这更复杂一点,但是这个是大多数实现的良好的第一近似。

epoll的成本更接近实际上有事件的文件描述符的数量。如果你监视200个文件描述符,但只有100个文件描述符有事件,那么你(非常粗略地)只支付那100个活动文件描述符。这就是epoll的主要优点之一。如果你有一千个客户端,大多是空闲,那么当你使用选择,你仍然支付了他们的一千。然而,使用epoll,它就像你只有几个 – 你只支付在任何给定时间活动的。

这意味着epoll将导致大多数工作负载的CPU使用率降低。至于内存使用情况,它有点折腾。 select可以以高度紧凑的方式(每个文件描述符一个位)管理表示所有必要的信息。对于可以与select一起使用的文件描述符数量,FD_SETSIZE(通常为1024)的限制意味着,对于select(读,写,异常)可以使用的三个fd集合中的每一个,你永远不会花费超过128个字节。与那些最大384字节相比,epoll是一种猪。每个文件描述符由多字节结构表示。然而,绝对地,它仍然不会使用很多内存。你可以表示大量的文件描述符在几十千字节(大约20k每1000文件描述符,我想)。你也可以抛出一个事实,你必须花费所有384字节与选择,如果你只想监视一个文件描述符,但其值恰好是1024,epher你只需要花费20个字节。但是,所有这些数字都很小,所以它没有什么区别。

还有epoll的其他好处,也许你已经知道,它不限于FD_SETSIZE文件描述符。您可以使用它来监视尽可能多的文件描述符,因为你有。如果你只有一个文件描述符,但它的值大于FD_SETSIZE,epoll工作,但是选择不。

随机,我最近发现epoll与select或poll相比有一个小的缺点。虽然这三个API都不支持正常文件(即,文件系统上的文件),但选择和轮询表明这种缺乏支持,因为报告这样的描述符总是可读和总是可写的。这使得它们不适用于任何有意义的非阻塞文件系统I / O,使用select或poll并恰好遇到来自文件系统的文件描述符的程序将至少继续操作(或者如果失败,它将不会是因为select或poll),虽然它可能没有最好的性能。

另一方面,当被要求监视这样的文件描述符时,epoll将快速失败并出现错误(显然是EPERM)。严格来说,这几乎不正确。它只是以一种明确的方式表示它缺乏支持。通常我会赞赏显式失败的情况,但这一个是没有文件的(据我所知),并导致一个完全崩溃的应用程序,而不是一个只操作与潜在的性能下降。

在实践中,我看到的唯一的地方是当与stdio进行交互时。用户可能将stdin或stdout从/重定向到正常文件。而以前stdin和stdout将是一个管道 – 由epoll支持只是罚款 – 然后成为一个正常的文件,epoll失败大声,打破应用程序。

http://stackoverflow.com/questions/2032598/caveats-of-select-poll-vs-epoll-reactors-in-twisted

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:网络 – Twisted中select / poll与epoll反应堆的注意事项