【问题标题】:select vs poll vs epoll [closed]select vs poll vs epoll [关闭]
【发布时间】:2011-05-01 16:32:31
【问题描述】:

我正在设计一个需要支持数千个 UDP 连接(大约 100,000 个会话)的新服务器。对使用哪一个有任何意见或建议?

【问题讨论】:

  • 你在哪个操作系统上?不同的操作系统有不同的具体。
  • Linux Redhat 企业版 5
  • @ravi:您还应该检查基于事件(异步)的框架,例如 Twisted,您可以在其中编写服务器并使用各种轮询方法对其进行测试:TwistedMatrix.com : Choosing a Reactor
  • Zed Shaw 对 epoll 与 poll 进行了出色的分析:sheddingbikes.com/posts/1280829388.html tl;dr:如果您的活动 fd 比例很大,则 Poll 很好。如果您有大量不活动的 fd,epoll 会更好。非活动 fd 的一个很好的例子是 WebSockets 和 Cometd 之类的东西,客户端将打开一个连接并等待很长时间,然后才能以任何一种方式传输任何内容。
  • 我找到了一个很好的网页来表明它们之间的区别:ulduzsoft.com/2014/01/…希望可以帮助

标签: linux sockets epoll posix-select


【解决方案1】:

如果您使用的是 Linux,答案是 epoll,如果您使用的是 FreeBSD 或 Mac OS X,答案是 kqueue,如果您使用的是 Windows,答案是 i/o 完成端口。

您(几乎可以肯定)想要研究的其他一些事情是:

  • 负载平衡技术
  • 多线程网络
  • 数据库架构
  • 完美的哈希表

此外,重要要注意 UDP 与 TCP 相比没有“连接”。由于调试基于网络的解决方案可能具有挑战性,因此从小处着手并扩大规模也符合您的最大利益。

【讨论】:

  • 感谢您的回复。我知道没有所谓的 UDP 连接,因为它是面向无连接的通信。我想到的应用程序是基于会话的,所以我没有提到会话,而是将其称为连接。我的错。此外,我还尝试了超过 200,000 个基于 select 和多线程应用程序的会话。只是想优化。对于构建可扩展的架构解决方案,我也不陌生。负载平衡可能不适合我正在查看的那种服务器。这绝对是一个多线程网络。很可能会使用某种生产者/消费者模式。
【解决方案2】:

CURL 的作者在 poll vs select vs event libraries 上写了一篇精彩的文章。

【讨论】:

  • 该指南根本没有帮助。它基本上假设每个人都知道这三者之间的主要区别。
  • 请至少提供一个摘要,而不仅仅是一个简单的链接
  • @enigmaticPhysicist - 我同意你的看法。我发现这篇文章更详细,希望对您有所帮助:ulduzsoft.com/2014/01/…
【解决方案3】:

Linux:epoll FreeBSD:kqueue 窗户:??

有一些包装库,比如 libevent 和 libev,可以为你抽象出来。

【讨论】:

  • Windows:IO 完成端口
  • 顺便说一句。 IOCP:Windows NT 3.5,1994;队列:BSD 4.1、2000; epoll: linux 内核 2.5.44, 2002.
  • libev 在 IMO 中写得不好,当我停止活动事件后释放内存时它会崩溃!设计不好。此外,它都在一个包含大部分代码的(3000 行).c 文件中。
  • @unixman83 一个 3000 行的 .c 文件听起来很棒!
猜你喜欢
  • 2011-09-12
  • 2010-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 2011-07-08
  • 2017-06-20
相关资源
最近更新 更多