在Windows 2008上运行的服务器上每次accept()调用的内存消耗

在Windows 2008上运行的服务器上每次accept()调用的内存消耗,windows,memory,sockets,Windows,Memory,Sockets,我在Windows 2008上编写了一个简单的小型服务器应用程序,它只接受连接,不做其他任何事情。我正在对套接字调用进行内存占用评估,我发现每个连接(在accept()之后)至少消耗2.5 KB的内存。有趣的是,内存不是被调用了accept()的进程占用的,而是被操作系统进程占用的。我相信这可能是因为操作系统内部为每个连接创建了数据结构 现在,我有两个关键问题: 是否可以通过任何方式(通过更改任何参数、配置等)减少内存占用?如果是,怎么做?(因为如果我们计划服务器接受数百万个连接,那么每个连接的

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

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

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

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

请告诉我

  • 不可以。内核必须创建并跟踪连接结构,以便正确处理接收到的数据包。需要存储窗口大小、路径MTU以及各种其他内容。您最终将需要接收缓冲区等

  • 如果不了解更多关于特定应用程序的信息(所有这些连接实际上在做什么),很难说。但是做200000个当前连接是非常困难的,需要非常熟悉特定问题领域的人


  • 最有可能的是2.5K在套接字缓冲区中。您可以通过setsockopt SO_RECVBUF和SO_SNDBUF调用来减小大小。将使用其他内存,但设置这些将减少内存占用

    这就是http服务器等如何一次扩展到数千个并发连接。如果没有这些,内存可能会很快用完

    有关更多信息,请查看此链接:


    我应该指出,你的问题应该放在stackoverflow.com上

    你不应该问吗?@Atul请不要交叉发帖。在最合适的网站上提问,等待回答。谢谢,数百万TCP连接?同时在一个盒子上?如果你做到了,请公布你的发现。微软、亚马逊、Facebook和谷歌的一些人都很想知道你是如何在一个盒子上同时获得100万个连接的。说真的,如果你的服务这么大,你会不会计划每台机器有10-100K个连接,并在多台服务器上使用负载平衡器?嗨,David,非常感谢你的快速回复。1.如果我计划发送/接收非常短的字符串(比如16字节),我是否可以指定它以减少内存占用?2.我问这个问题是因为我听说大多数商业服务器应用程序运行在Unix/Linux等平台上,而不是在Windows上。然而,我看到Windows 2008在这方面是一个很有前途的平台。但不确定是否有人尝试过数百万次连接。1)是的,但前提是您将内核缓冲区设置为零并自己管理所有缓冲区。然后,您可以使发送/接收缓冲区占用尽可能少的页面。2) 有了24GB的RAM,这应该是可能的。但我不知道有谁真的这么做过,这行不通。实现必须锁定内存中的发送和接收缓冲区,并且不能锁定少于一页的数量。唯一的方法是完全在您自己的应用程序中管理缓冲区,将内核缓冲区大小设置为零。(这是一个棘手的问题,但Windows允许您这样做。)