【问题标题】:How do you minimize the number of threads used in a tcp server application?如何最小化 tcp 服务器应用程序中使用的线程数?
【发布时间】:2010-09-07 03:03:38
【问题描述】:

我正在寻找人们在实现为客户端 TCP(或 UDP)请求提供服务的服务器应用程序时使用的任何策略:设计模式、实现技术、最佳实践等。

为了这个问题,我们假设请求的生命周期相对较长(几分钟),并且流量对时间很敏感,因此响应消息时不能接受任何延迟。此外,我们既为来自客户端的请求提供服务,也为其他服务器建立自己的连接。

我的平台是 .NET,但由于无论平台如何,底层技术都是相同的,因此我有兴趣查看任何语言的答案。

【问题讨论】:

    标签: multithreading sockets tcp udp


    【解决方案1】:

    现代方法是利用操作系统为您多路复用许多网络套接字,让您的应用程序只处理具有流量的活动连接。

    每当您打开一个套接字时,它都会与一个选择器相关联。您使用单个线程来轮询该选择器。每当数据到达时,选择器将指示处于活动状态的套接字,您将该操作交给子线程并继续轮询。

    这样你只需要一个线程来处理每个并发操作。打开但空闲的套接字不会占用线程。

    【讨论】:

      【解决方案2】:

      如果您直接使用 C++ 和 Win32,那么我建议您阅读有关重叠 I/O 和 I/O 完成端口的信息。我有一个免费的 C++、IOCP、客户端/服务器框架和完整的源代码,更多细节请参见here

      由于您使用的是 .Net,因此您应该考虑使用异步套接字方法,这样您就不需要为每个连接都有一个线程;我的这篇博文中有几个链接可能是有用的起点:http://www.lenholgate.com/blog/2005/07/disappointing-net-sockets-article-in-msdn-magazine-this-month.html(一些最佳链接位于原始帖子的 cmets 中!)

      【讨论】:

        【解决方案3】:

        更复杂的方法是使用 IO 完成端口。 (视窗) 使用 IO Completion 端口,您可以让操作系统管理轮询,这使得它可以使用非常高级别的优化以及 NIC 驱动程序支持。 基本上,您有一个由操作系统管理的网络操作队列,并提供一个在操作完成时调用的回调函数。有点像(硬盘)DMA,但用于网络。

        Len Holgate 几年前在 Codeproject 上写了一篇关于 IO 完成端口的优秀系列文章: http://www.codeproject.com/KB/IP/jbsocketserver2.aspx

        并且 我找到了一篇关于 .net 的 IO 完成端口的文章(虽然还没有读过) http://www.codeproject.com/KB/cs/managediocp.aspx

        我还要说,与尝试编写可扩展的替代方案相比,使用完成端口更容易。问题是它们仅适用于 NT(2000、XP、Vista)

        【讨论】:

          【解决方案4】:

          生日,

          我将首先查看您要用于线程框架的隐喻。

          可能是“leader follower”,其中一个线程正在侦听传入的请求,当有新请求进来时,它会开始工作,并且池中的下一个线程开始侦听传入的请求。

          或者线程池,其中同一个线程始终监听传入请求,然后将请求传递给线程池中的下一个可用线程。

          您可能想访问 Ace 组件的 Reactor 部分以获得一些想法。

          HTH。

          干杯, 抢

          【讨论】:

            猜你喜欢
            • 2011-10-10
            • 2013-02-06
            • 1970-01-01
            • 1970-01-01
            • 2016-10-02
            • 1970-01-01
            • 2020-09-06
            • 1970-01-01
            • 2015-10-06
            相关资源
            最近更新 更多