【问题标题】:Memory consumption of each accept() call on server running on Windows 2008在 Windows 2008 上运行的服务器上每个 accept() 调用的内存消耗
【发布时间】:2012-12-18 11:23:30
【问题描述】:

我在 Windows 2008 上编写了一个简单的小型服务器应用程序,它只接受连接,不做任何其他事情。我正在对套接字调用进行内存占用评估,我发现每个连接(在接受()之后)至少消耗 2.5 KB 的内存。有趣的是,内存不是由调用 accept() 的进程消耗的,而是由操作系统进程消耗的。我相信这可能是因为在操作系统内部为每个连接创建了数据结构。

现在,我有两个关键问题:

是否可以通过任何方式减少这种内存占用(通过更改任何参数、配置等)?如果是怎么办? (因为如果我们计划服务器接受数百万个连接,每个连接的 2K 就太多了)

如果我的服务器打算接受数百万个连接,那么使用 Windows 2008 是个好主意吗?还是我应该切换到其他操作系统?

请给我建议。

【问题讨论】:

  • 你不应该在Stack Overflow上问吗?
  • @Atul 请不要交叉发布。在最合适的网站上提问并等待答案。谢谢。
  • 数以百万计的 TCP 连接?同时在一个盒子上?如果你做到了,请发表你的发现。微软、亚马逊、Facebook 和谷歌的一些人很想知道你是如何在一个盒子上同时获得 100 万个连接的。说真的,如果你的服务这么大,你会不会计划每台机器有 10-100K 的适度连接,并在多个服务器上使用负载平衡器?

标签: windows memory sockets


【解决方案1】:

2.5K 很可能在套接字缓冲区中。您可以使用 setsockopt SO_RECVBUF 和 SO_SNDBUF 调用来减小大小。将使用其他内存,但设置这些应该会减少内存占用。

这就是 http 服务器等可以一次扩展到数千个并发连接的方式。否则,内存可能会很快耗尽。

查看此链接了解更多信息: How to retain one million simultaneous TCP connections?

我应该指出,您的问题确实应该在 stackoverflow.com 上

【讨论】:

  • 这行不通。实现必须锁定内存中的发送和接收缓冲区,并且不能锁定少于一页的数量。这样做的唯一方法是完全在您自己的应用程序中管理缓冲区,将内核缓冲区大小设置为零。 (要做到这一点很棘手,但 Windows 可以让您做到这一点。)
【解决方案2】:
  1. 没有。连接结构必须由内核创建和跟踪,以便正确处理接收到的数据包。需要存储窗口大小、路径 MTU 和各种其他内容。您最终将需要接收缓冲区等。

  2. 如果不了解您的特定应用程序的更多信息(所有这些连接实际上在做什么),很难说。但是进行 200,000 个当前连接非常困难,并且需要非常熟悉该特定问题领域的人。

【讨论】:

  • 嗨,大卫,非常感谢您的快速回复。 1. 如果我打算发送/接收非常短的字符串(比如 16 个字节),我不能在某处指定它以减少内存占用吗? 2. 我问这个问题是因为我大多听说过在 Unix/Linux 等上运行的商业服务器应用程序,而不是在 Windows 上运行。但是,我读到 Windows 2008 在这方面是很有前途的平台。但不确定是否有人尝试过数百万个连接。
  • 1) 可以,但前提是您将内核缓冲区设置为零并自己管理所有缓冲区。然后,您可以使发送/接收缓冲区占用尽可能少的页面。 2) 使用 24GB 的 RAM,应该是可能的。但我不知道有谁真正做到过。
猜你喜欢
  • 2014-07-15
  • 1970-01-01
  • 2010-10-09
  • 1970-01-01
  • 1970-01-01
  • 2013-07-30
  • 2023-04-08
  • 2012-04-09
  • 1970-01-01
相关资源
最近更新 更多