【问题标题】:.NET Socketserver max concurrent connections and max value for backlog.NET Socketserver 最大并发连接数和积压的最大值
【发布时间】:2014-08-31 15:47:49
【问题描述】:

我目前正在开发一个 .NET c# 套接字服务器,它应该能够扩展到 100K 并发连接。我正在使用 socketasynceventargs 类和提到的模式 here 。如果我错了,请纠正我,但我知道维护 100K 并发连接与 100K 客户端同时访问套接字服务器是不同的。我的问题是我可以同时建立多少个连接?这取决于套接字积压变量吗?如果是这样,我可以设置的最大积压值是多少?

提前致谢

【问题讨论】:

  • 同一台机器上的 10 万个连接?吞吐量是多少?
  • 是的,我想在开始扩展之前检查单个服务器可以处理多少。我的情景是 100K 客户端将连接并发送大约 200-300 字节大小的消息。服务器响应并发送一个ack消息,客户端发送另一个消息(此循环重复10次)
  • 10 次只是一个测试场景。实时可能只有 1 或 50 个等
  • 每秒 1 或 50 个,对吧?
  • 这个想法是客户端应该一个接一个地发送所有消息,因为它在每条消息发送下一条消息后从服务器获得确认,并在发送所有消息后关闭连接。跨度>

标签: c# multithreading sockets scalability


【解决方案1】:

我目前正在开发一个 .NET c# 套接字服务器,它应该能够扩展到 100K 并发连接。

上次我在 Win7 上测试这个是很容易达到的目标。连接数似乎受到内存使用的限制。

我正在使用 socketasynceventargs 类和这里提到的模式。

这种模式用于有非常高的调用频率。保持大量连接没有用,因为它比简单的未完成的BeginRead 调用使用更多的内存。总是问为什么,不要只是复制示例代码。大多数关于套接字的示例代码都非常错误,即使在 MSDN 上也是如此。

每个套接字有一个未完成的 BeginRead 调用。在读取调用完成之前,分配给它的内存缓冲区是固定的。这会导致 GC 问题。要么使用一个大的预分配缓冲区(64MB 左右),要么一开始只读取一个字节。只有当一个字节读取完成时,您才能使用更大的缓冲区读取其余字节。

如果我错了,请纠正我,但我明白保持 100K 并发连接与 100K 客户端同时访问套接字服务器是不同的。

不确定我是否理解。 10 万个客户端在同一毫秒内进入将很难处理,而维持在几秒钟内建立的 10 万个连接要容易得多。

我的问题是我可以同时建立多少个连接?

测试并期望找到一个高数字。观察您的 RAM 使用情况。

这取决于套接字积压变量吗?

这是针对尚未交给应用程序的未完成连接。这在实践中几乎没有意义,因为应用程序应该有一个快速的接受循环,可以立即接受任何东西。

如果是这样,我可以设置的最大积压值是多少?

设置默认值。

【讨论】:

  • 感谢您的详细回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-30
  • 2013-09-29
  • 2013-01-31
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多