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

hel*_*inz 9 netstat tcp

我已经设置了一台测试机器(在 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

但它似乎没有帮助。

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

谢谢

Gra*_*ant 10

听起来您已达到 VPS 可以处理的最大网络流量。调整 TCP 参数并不神奇 - 它可以帮助一点,但可能还不够。在虚拟机中运行甚至可能会取消某些调整 - 流量仍然通过虚拟机管理程序的真实网卡传递并受其设置的影响。

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

假设千位:

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

假设千字节,它大约是 176Mbit/s。

如果是千字节,您将无法在大多数 VPS 服务器上始终如一地执行此操作。每台服务器上至少有 10-20 个 VPS。Linode 使用两个千兆绑定连接到每个服务器。这意味着您在完整服务器上的“公平份额”最多约为 100Mbit/s。

即使是千比特,对于大多数 VPS 来说,22Mbit 也是一个公平的比特。

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

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