【问题标题】:Does epoll have exponential backoff?epoll 有指数退避吗?
【发布时间】:2013-05-02 00:04:47
【问题描述】:

我有一个应用程序,当它有数据要传输时,它使用 epoll 来了解是否可以写入给定的 TCP 套接字。

我观察到的是,随着 TCP 连接的远端落后,并且 TCP 套接字的发送缓冲区开始填满,epoll 返回 EPOLLOUT 事件的频率似乎经历了指数退避。此行为发生在从套接字写入接收 EAGAIN 之前。

应用程序正在使用 EPOLLONESHOT,并在每次发生后进行 EPOLL_CTL_MOD 调用以重新启动 EPOLLOUT 事件。但正如我上面提到的,随后的每一次发生都呈指数级增长(我有 40 毫秒、80 毫秒、160 毫秒、320 毫秒、640 毫秒、1280 毫秒等的进展),直到 EAGAIN 最终发生。

这是 epoll 的一个未记录的特性吗?可以禁用吗?这是一个问题,因为数据变得陈旧,我宁愿丢弃它也不愿延迟发送。

提前致谢。

【问题讨论】:

  • 如果担心过时数据,请使用 UDP 而不是 TCP;这就是发明这两种协议的原因。

标签: tcp epoll


【解决方案1】:

不,但 TCP 可以。 epoll() 最多会阻塞您指定的超时时间,而不是更长的时间。

【讨论】:

  • 是的,超时工作正常。问题是 EPOLLOUT 事件在某种程度上受到 TCP 退避的影响。请记住,我的应用程序尚未从写入中获得 EAGAIN 结果,因此没有拥塞迹象,但下一次写入的 EPOLLOUT 事件正呈指数级延迟。
  • 当发送缓冲区未满时,我完全不明白您为什么要使用epoll()。就写吧。你应该只去epoll()epoll()之后你得到EAGAIN,当它停止发生时停止使用它。
  • 是的,我已经考虑过这个变化。虽然这不是微不足道的。我真的很想了解为什么首先会发生这种行为,而不是替代实现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-09
  • 2015-09-23
  • 1970-01-01
  • 2015-04-28
  • 1970-01-01
  • 2019-03-17
  • 1970-01-01
相关资源
最近更新 更多