【发布时间】:2012-01-13 22:49:36
【问题描述】:
在低延迟环境中使用 poll 与 epoll 时是否有一些简单的经验法则?如果只监视少数文件描述符,epoll 应该有更高的开销。请提供一些见解,将答案“自己检查”放在其他地方。
【问题讨论】:
-
个人轶事:我在单个进程(无线程,无分叉)异步 http 服务器中测试 epoll 与 poll 的结果(即,短连接时间,
在低延迟环境中使用 poll 与 epoll 时是否有一些简单的经验法则?如果只监视少数文件描述符,epoll 应该有更高的开销。请提供一些见解,将答案“自己检查”放在其他地方。
【问题讨论】:
除非满足以下所有条件,否则请始终使用poll:
epoll 的 (Linux) 系统,或者您为不具有 epoll 的系统提供后备。epoll 列表中添加/删除文件描述符与poll 操作一样昂贵,因为它需要进入/离开内核空间)。【讨论】:
首先,poll(2) 只是电平触发,但epoll(4) 既可以用作边缘触发接口,也可以用作电平触发接口。
现在复杂度:poll 观察描述符 (fds) 数量的复杂度为 O(n),因为它每次发生“就绪”事件时都会扫描所有 fds,epoll 基本上是 O(1),因为它不会对所有被监视的描述符进行线性扫描。
在可移植性方面——因为epoll 是特定于Linux 的,我建议查看libev 和libevent 库。
另外,请查看 Dan Kegel 的精彩文章:“The C10K problem”。
【讨论】:
epoll 比poll() 扩展得更好
epoll(7) 简明扼要地总结了它:epoll“可以很好地扩展到大量监视的文件描述符。”但是,poll 是一个 POSIX 标准接口,所以在需要可移植性时使用它。
【讨论】:
poll 应该会更快。