在Windows 2008上运行的服务器上每次accept()调用的内存消耗
我在Windows 2008上编写了一个简单的小型服务器应用程序,它只接受连接,不做其他任何事情。我正在对套接字调用进行内存占用评估,我发现每个连接(在accept()之后)至少消耗2.5 KB的内存。有趣的是,内存不是被调用了accept()的进程占用的,而是被操作系统进程占用的。我相信这可能是因为操作系统内部为每个连接创建了数据结构 现在,我有两个关键问题: 是否可以通过任何方式(通过更改任何参数、配置等)减少内存占用?如果是,怎么做?(因为如果我们计划服务器接受数百万个连接,那么每个连接的2K就太多了) 如果我的服务器打算接受一百万个连接,那么使用Windows 2008是个好主意吗?或者我应该切换到其他操作系统吗 请告诉我在Windows 2008上运行的服务器上每次accept()调用的内存消耗,windows,memory,sockets,Windows,Memory,Sockets,我在Windows 2008上编写了一个简单的小型服务器应用程序,它只接受连接,不做其他任何事情。我正在对套接字调用进行内存占用评估,我发现每个连接(在accept()之后)至少消耗2.5 KB的内存。有趣的是,内存不是被调用了accept()的进程占用的,而是被操作系统进程占用的。我相信这可能是因为操作系统内部为每个连接创建了数据结构 现在,我有两个关键问题: 是否可以通过任何方式(通过更改任何参数、配置等)减少内存占用?如果是,怎么做?(因为如果我们计划服务器接受数百万个连接,那么每个连接的
最有可能的是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允许您这样做。)