由于套接字缓冲区不足/溢出,大量数据包被修剪或崩溃

由于套接字缓冲区不足/溢出,大量数据包被修剪或崩溃

我已经设置了一台测试机器(linode 2048 机器上的 debian squeeze 2.6.32),它与一个返回大量 json 的 api 交互。它以每分钟 3000 次异步调用 API,api 返回的有效负载约为 450kb。机器上还有一个 http 服务器来显示调用结果。

执行 netstat -s 时(正常运行时间为 20 天):

 254329 packets pruned from receive queue because of socket buffer overrun
 50678438 packets collapsed in receive queue due to low socket buffer

这对我来说听起来不太好,因此我按照以下教程来调整 TCP 参数:

http://fasterdata.es.net/fasterdata/host-tuning/linux/test-measurement-host-tuning/

http://www.acc.umu.se/~maswan/linux-netperf.txt

但似乎没有帮助。

有关套接字缓冲区的任何建议/教程/解释可能有助于理解和解决问题?

谢谢

答案1

听起来您已经达到了 VPS 可以处理的最大网络流量。调整 TCP 参数并不是魔法 - 它可以有所帮助,但可能还不够。一些调整甚至可能通过在虚拟机中运行而被否定 - 流量仍然会通过虚拟机管理程序的实际网卡传递,并受到其设置的影响。

您说每个请求的传入有效负载为 450kb。这是千字节吗?或公斤字节? 大多数工具以字节为单位来测量大小,但我会同时进行两种计算。

假设以千比特为单位:

  • 3000 个请求/分钟 = 50 个请求/秒
  • 50*450kbit = 22,500kbit/s = 约 22Mbit/s

假设以千字节为单位,则约为176Mbit/s。

如果是千字节,那么在大多数 VPS 服务器上,您将无法始终如一地做到这一点。每台服务器上至少有 10-20 个 VPS。Linode 使用两个千兆位绑定连接连接每台服务器。这意味着您在满负荷服务器上的“公平份额”最多只有 100Mbit/s。

即使以千比特为单位, 22Mbit 对于大多数 VPS 来说也是一个相当不错的速度。

通过如此快速地发送如此多的请求,您可能相当于对自己的服务器实施了 DOS 攻击。检查实际传入的网络流量应该可以让您了解实际使用量。如果您需要真正的 100mbit 甚至千兆位速度,您可能需要查看专用服务器。否则,您需要减慢请求速度,直到速度减慢到服务器可以处理为止。

您还需要检查内存和 CPU 使用率。如果其中任何一个达到最大值,您的服务器将开始丢弃数据包,因为它根本没有资源来处理它们。首先查看 top 和 ntop 以观察一段时间的 CPU、内存和网络使用情况。

答案2

套接字缓冲区溢出意味着数据无法放入分配给每个连接的特殊内存缓冲区。来自网络接口的所有数据都放入这样的缓冲区,应用程序正在从中读取。一旦应用程序读取了数据 - 它将从此缓冲区中刷新。基本上,您应该期望应用程序在数据可用时立即读取数据,并且应用程序可以自由处理数据。但是,如果您的性能不够好 - 是 CPU 饱和还是应用程序锁定(这在 nodejs 中很常见) - 数据会不断涌来,但缓冲区大小不足以处理所有数据。

即使您拥有大量缓冲区 - 如果您的应用程序无法及时处理所有内容,它仍会被修剪并丢弃数据。所以我建议您首先调整应用程序性能。

相关内容