我有一个稍微不寻常的情况,我需要维护客户端tcp连接到另一台服务器上的数千移动用户在我的服务器上(基本上移动设备连接到我的中间层服务器,当他们能够,这保持了一个更稳定的连接到移动设备的第三方服务器)。
无论如何,我已经开发了我的服务器应用程序使用asynchronous套接字(包装在SslStream中),并有1000个客户端会话现在全时运行。 我对结果非常满意,因为我看到单个核心处理器的平均CPU利用率为0-10%,随着时间的推移,大约有60mb的ram被使用。
我的问题是,如何扩展这个范围,以便我的服务器上可以运行100,000或20万个或更多的客户端会话? 再一次,这是有点不传统的,因为我的服务器不是真的像服务器,因为我担心传出连接,而不是传入。
我知道有一个registry设置MaxUserPort需要改变,以超越默认值,似乎是5000.但是,似乎有另一个65535的硬性限制,我不太清楚该限制所在的位置。 这是每个networking接口的限制吗? 这是全球Windows的限制吗? 这是每个进程的限制吗?
如果是每个networking接口的限制,我可以添加多个networking接口并将客户端会话套接字绑定到每个接口(例如:接口1上的65k,接口2上的65k等)?
我也不太确定,如果有套接字选项或属性,我应该设置帮助的东西了。 现在我没有使用任何套接字选项。
我真的很感激这个问题的任何想法,因为在这个问题上很难得到明确的build议。 谢谢!
Windows机器可以轻松扩展到大量的打开连接。 64k临时端口限制是每个IP地址,而不是每台机器。 如果您需要更多的临时端口,请按照@SuperTux的建议增加限制,但也可以为机器分配更多的IP。 为了充分利用,你必须在你的客户端套接字上手动调用Bind(),并且使用空闲端口从你的池中传递一个源IP(这也意味着你将负责跟踪每个地址可用的临时端口数)。 很多高端设备类型的设备都是这样做的(例如,负载平衡器上的SNAT池),以支持数十万个并发连接。
簿记是一个麻烦,但比每个64K客户端连接投掷利用不足的硬件更好。
65355是IP协议的限制,更重要的是大多数操作系统的TCP / IP协议栈的限制。
要增加Windows上的临时端口的最大数量,请按照下列步骤操作:
在编辑菜单上,单击新建,然后添加以下注册表项:
数值名称: MaxUserPort
值类型: DWORD
价值数据: 65534
有效范围: 5000-65534(十进制)
默认值: 0x1388(十进制5000)
说明:该参数控制程序从系统请求任何可用用户端口时使用的最大端口号。 通常,短暂(短暂的)端口被分配在1024和5000之间(包括端点值)。
通常要扩展到超过65K端口,您可以使用群集中的多个服务器。