民意调查与epoll洞察力[重复]
Posted
技术标签:
【中文标题】民意调查与epoll洞察力[重复]【英文标题】:poll vs. epoll insight [duplicate] 【发布时间】:2012-01-13 22:49:36 【问题描述】:在低延迟环境中使用 poll
与 epoll
时是否有一些简单的经验法则?如果只监视少数文件描述符,epoll
应该有更高的开销。请提供一些见解,将答案“自己检查”放在其他地方。
【问题讨论】:
个人轶事:我在单个进程(无线程,无分叉)异步 http 服务器中测试 epoll 与 poll 的结果(即,短连接时间, 【参考方案1】:除非满足以下所有条件,否则请始终使用poll
:
-
您可以确保您使用的是具有
epoll
的 (Linux) 系统,或者您为不具有 epoll
的系统提供后备。
您有 大量 处于活动状态的文件描述符(至少 1000-10000)。
您正在使用的文件描述符集在很长一段时间内都是稳定的(从epoll
列表中添加/删除文件描述符与poll
操作一样昂贵,因为它需要进入/离开内核空间)。
【讨论】:
【参考方案2】:首先,poll(2)
只是电平触发,但epoll(4)
既可以用作边缘触发接口,也可以用作电平触发接口。
现在复杂度:poll
观察描述符 (fds) 数量的复杂度为 O(n),因为它每次发生“就绪”事件时都会扫描所有 fds,epoll
基本上是 O(1),因为它不会对所有被监视的描述符进行线性扫描。
在可移植性方面——因为epoll
是特定于Linux 的,我建议查看libev 和libevent 库。
另外,请查看 Dan Kegel 的精彩文章:“The C10K problem”。
【讨论】:
我相信关于 epoll 和大 O 表示法的重点不是关于任何一个函数的内部,所以说“poll 扫描所有描述符而 epoll 扫描”是不正确的不是”。 它们都可能在单个事件上触发。但是,使用 poll 时,用户别无选择,只能遍历提交的整个列表以查找事件,而使用 epoll,您会得到一个仅包含实际事件的返回列表。这意味着如果服务器非常繁忙,epoll 没有任何优势。但是,如果您要长时间维护大量描述符... ...而且它们大部分时间都是空闲的,如果您有非常快速的事件,只涉及几个连接,epoll 将具有优势。即,O(whatever) 是关于用户实现的可能,而不是 poll/epoll 的实际行为。 最重要的一点:关于观察描述符(fds)数量的轮询复杂度是O(n),因为它每次发生'ready'事件时都会扫描所有fds,epoll基本上是O(1),因为它不会对所有观察到的描述符进行线性扫描。。所以epoll
比poll()
扩展得更好
根据我的测试,民意调查不是 O(N)。如果有任何描述符与事件匹配,它会立即返回。这是最坏的情况 O(N)。
在使用 epoll 时,您可以设置等待的最大事件数,因此在最坏的情况下 m
【参考方案3】:
epoll(7)
简明扼要地总结了它:epoll
“可以很好地扩展到大量监视的文件描述符。”但是,poll
是一个 POSIX 标准接口,所以在需要可移植性时使用它。
【讨论】:
是的,它可以扩展,但是如果 fds 的数量很少,poll
应该会更快。
@James:我真的很想看看这方面的一些基准。根据个人经验,我会说,如果您对事件做出反应,则没有太大区别。鉴于您必须自己维护 poll 向量,我什至猜想 epoll 更快。重要的区别在于,正如这个答案中所述,poll 是 POSIX 的,因此更便携。 epoll 还具有提供更多功能的优势。以上是关于民意调查与epoll洞察力[重复]的主要内容,如果未能解决你的问题,请参考以下文章
Ivanti 洞察职场新趋势:71% 的员工宁愿放弃升职也要选择随处工作