【问题标题】:How to efficiently listening(binding) to thousands of ports on Linux?如何有效地监听(绑定)Linux 上的数千个端口?
【发布时间】:2020-08-29 06:42:45
【问题描述】:

我们正在设计一个 TCP 服务器来侦听/绑定到 Linux 中的数千个端口。

通过每个端口的每秒流量将非常少,因此我们专注于有效地从套接字中进行选择。

只需绑定到这些端口并在每个套接字上使用 poll 或 epoll 就可以了。但是,我们正在追求更加资源效率的设计,例如,精心设计一个可以处理数万个套接字的 IO 线程模型,同时又不消耗过多的 CPU。

欢迎提出任何建议!

PS:

  1. 我们正在使用 Java,而在这种情况下,Netty 似乎有点矫枉过正。有没有更适合的轻量级网络框架?
  2. iptables 不在桌面上,我们根本无法使用它。

【问题讨论】:

  • 为什么要监听数千个端口?您是否真的在实施数千种不同的网络协议(HTTP、FTP、SMTP、SSH...)?
  • 您需要首先查看可用的系统调用,例如 tomtzook 对 select 的建议,以了解最适合您需求的钩子。 然后您可以找出通过 Java 与这些系统调用交互的正确方法(如果您需要的东西不可用,则可能自己使用 JNI 实现一些东西)。
  • 整个想法是错误的:由于有这么多永久打开的套接字,系统将永久过载。每个投标将持有一个 inode,类似于打开的文件,每个操作系统都有限制和有限数量的同时打开的文件 (inode) medium.com/@muhammadtriwibowo/…

标签: java linux tcp network-programming


【解决方案1】:

当使用大量端口时,真正节省资源的解决方案是selectselect 函数是一个系统调用,它允许处理多个输入源,并且只处理那些接收到数据的源。它是通过 java.nio 包 (JDK 7) 添加到 Java 中的。

您可以将它与ExecutorService 结合使用,以仅处理所需的通道,同时保留线程。

进一步阅读:

【讨论】:

    猜你喜欢
    • 2011-11-06
    • 2013-03-29
    • 2021-07-15
    • 2015-04-28
    • 1970-01-01
    • 2014-05-13
    • 1970-01-01
    • 2019-01-01
    • 2011-06-28
    相关资源
    最近更新 更多