.NET Socket服务器的最大并发连接数和backlog的最大值

3
我目前正在开发一个.NET C#套接字服务器,应该能够扩展到100K并发连接。 我正在使用socketasynceventargs类和此处提到的模式。请纠正我,如果我错了,我理解维护100K并发连接与100K客户端同时命中套接字服务器是不同的。我的问题是我可以同时建立多少个连接?这是否取决于套接字后备变量?如果是这样,最大后备值是多少?感谢您的帮助。

100K个连接在同一台机器上?以哪种吞吐量进行? - vtortola
是的,我想要检查一下单个服务器在我们开始扩展之前能够处理多少负载。我的场景是有100K个客户端连接并发送大约200-300字节大小的消息。服务器响应并发送确认消息,然后客户端再发送另一条消息(这个循环重复10次)。 - rakesh
10倍只是一个测试场景,在实际情况下可能是1或50等。 - rakesh
每秒1或50个,对吧? - vtortola
客户端应该在收到服务器的确认后,依次发送所有消息,每发送一条消息就等待服务器的确认后再发送下一条消息,并在所有消息发送完毕后关闭连接。 - rakesh
1个回答

3
我目前正在开发一个能够扩展到100K并发连接的.NET c# socket服务器。上次在Win7上测试,这是一个容易实现的目标。连接数量似乎受内存使用限制。
我正在使用SocketAsyncEventArgs类和此处提到的模式。此模式用于拥有非常高频率的调用。保持大量连接并不实用,因为它比简单的outstanding BeginRead调用使用更多的内存。始终要问“为什么”,而不只是复制示例代码。即使在MSDN上,大部分关于sockets的示例代码都是错误的。
每个socket保持一个单独的BeginRead调用outstanding。直到读取调用完成,给定的内存缓冲区将被固定。这会导致GC问题。可以使用一个预先分配的大缓冲区(大约64MB)或者一开始只读取一个字节。当该读取完成后,再使用一个更大的缓冲区读取其余内容。
请纠正我,如果我理解成维护100K并发连接与同时有100K客户端命中socket服务器是不同的。
我不确定我理解了。在同一毫秒内进入的100k个客户端处理起来很困难,而在数秒钟内建立的100k个连接则容易得多。
我的问题是我可以同时建立多少连接?
进行测试并期望找到一个高数字。观察你的RAM使用率。
这是否取决于socket backlog变量?
这是未被交给应用程序的outstanding连接。在实践中,它大多数时候是没有意义的,因为一个应用程序应该有一个快速的接受循环立即接受任何东西。
如果是这样,我可以设置最大的backlog值是多少?
设置默认值即可。

1
感谢您详细的回复。 - rakesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接