【问题标题】:poll vs. epoll insight [duplicate]民意调查与epoll洞察力[重复]
【发布时间】:2012-01-13 22:49:36
【问题描述】:

在低延迟环境中使用 pollepoll 时是否有一些简单的经验法则?如果只监视少数文件描述符,epoll 应该有更高的开销。请提供一些见解,将答案“自己检查”放在其他地方。

【问题讨论】:

  • 个人轶事:我在单个进程(无线程,无分叉)异步 http 服务器中测试 epoll 与 poll 的结果(即,短连接时间,

标签: c++ c linux gcc


【解决方案1】:

除非满足以下所有条件,否则请始终使用poll

  1. 您可以确保您使用的是具有 epoll 的 (Linux) 系统,或者您为不具有 epoll 的系统提供后备。
  2. 您有 大量 处于活动状态的文件描述符(至少 1000-10000)。
  3. 您正在使用的文件描述符集在很长一段时间内都是稳定的(从epoll 列表中添加/删除文件描述符与poll 操作一样昂贵,因为它需要进入/离开内核空间)。

【讨论】:

    【解决方案2】:

    首先,poll(2) 只是电平触发,但epoll(4) 既可以用作边缘触发接口,也可以用作电平触发接口。

    现在复杂度:poll 观察描述符 (fds) 数量的复杂度为 O(n),因为它每次发生“就绪”事件时都会扫描所有 fds,epoll 基本上是 O(1),因为它不会对所有被监视的描述符进行线性扫描。

    在可移植性方面——因为epoll 是特定于Linux 的,我建议查看libevlibevent 库。 另外,请查看 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),因为它不会对所有观察到的描述符进行线性扫描。。所以epollpoll() 扩展得更好
    • 根据我的测试,民意调查不是 O(N)。如果有任何描述符与事件匹配,它会立即返回。这是最坏的情况 O(N)。
    • 在使用 epoll 时,您可以设置等待的最大事件数,因此在最坏的情况下 m
    【解决方案3】:

    epoll(7) 简明扼要地总结了它:epoll“可以很好地扩展到大量监视的文件描述符。”但是,poll 是一个 POSIX 标准接口,所以在需要可移植性时使用它。

    【讨论】:

    • 是的,它可以扩展,但是如果 fds 的数量很少,poll 应该会更快。
    • @James:我真的很想看看这方面的一些基准。根据个人经验,我会说,如果您对事件做出反应,则没有太大区别。鉴于您必须自己维护 poll 向量,我什至猜想 epoll 更快。重要的区别在于,正如这个答案中所述,poll 是 POSIX 的,因此更便携。 epoll 还具有提供更多功能的优势。
    猜你喜欢
    • 2023-03-07
    • 2020-02-24
    • 1970-01-01
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多