TCP 服务器内存管理:#连接与#请求

TCP 服务器内存管理:#连接与#请求

鉴于此,Windows 2008 服务器可以处理的并发 TCP 连接数在理论上没有限制。唯一会发生的情况是,每个连接都会消耗服务器的内存。不幸的是,内存不是无限的(我只想利用物理内存)。

例如,假设我们有 2GB 服务器内存。现在有两种极端情况:

  • 情况1: 如果我们为每个连接分配了 64KB 的缓冲区(仅用于接收传入请求),那么 32768 个连接就会消耗掉全部 2GB 的内存。这不会留下任何内存来排队/处理来自这些连接的传入请求。

  • 案例 2: 另一方面,假设一个(或很少)连接不断发送请求缓冲区(例如,从一个连接到另一个的视频流),并且服务器无法及时处理它们,这些缓冲区将堆积在服务器中,最终将占用大部分服务器内存。并且此后它不会为新的连接留下任何记忆。

这是服务器设计中真正的难题,困扰了我很多天。

如果我可以决定每个连接的最大请求缓冲区大小每个连接允许队列中的最大请求数。然后,根据可用的服务器内存,它将自动设置限制最大并发连接数

如何确定这些限制以实现最佳性能和吞吐量?我只是在寻找服务器资源的完美利用。

是否有人可以提供任何标准指南或经验数据给我,谢谢。

答案1

服务器可以实现的并发 TCP 连接数是有限制的,但它们太大了,所以实际上并不算数。服务器资源总是会首先受到限制。

您的问题在于,它在很大程度上取决于您的应用程序、硬件、操作系统配置和用例。了解您的设置能够做什么的唯一真正方法是提出一组代表性负载测试,并在开发服务时运行它们。正如您在案例 2 中指出的那样,有许多变量可能会使您的案例 1 计算失败。TCP 接收缓冲区只是连接的一个组件。操作系统将维护每个连接的其他数据和状态,并且您的应用程序将对每个连接或正在运行的请求有其他要求。Jeff Darcy 有一篇关于高性能服务器设计的好文章从软件角度来看。

我的答案是:负载测试负载测试负载测试, 然后负载测试多一点。

即便如此,现实世界也往往会出现您从未想过的事情,您可以将其添加到您的负载配置文件中并再次开始测试周期。

相关内容