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

我已经build立了一个testing机器(debian在linode 2048机器上挤压2.6.32),与一个返回大块json的api交互。 它asynchronous调用API 3000 /分钟,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

但似乎没有帮助。

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

谢谢

这听起来像你正在达到你的VPS可以处理的最大networkingstream量。 调整TCP参数并不神奇 – 它可以帮助一点,但可能还不够。 一些调整甚至可以通过在虚拟机中运行来抵消 – stream量仍然通过虚拟机pipe理程序的真实网卡,并受其设置的影响。

你说每个请求传入的有效载荷是450kb。 那是千比特还是千字节 ? 大多数工具以字节为单位来衡量大小,但是我会做两个计算。

假设kilobits:

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

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

如果是千字节,那么在大多数VPS服务器上都不能一致地做到这一点。 每台服务器将至less有10-20 VPS。 Linode使用两个千兆位绑定连接到每个服务器。 这意味着在一个完整的服务器上你的“公平份额”最好是在100Mbit / s左右。

即使是千位,对于大多数VPS来说,22Mbit是相当可观的。

通过这么快的请求,你可能做了相当于DOS自己的服务器。 检查您的实际传入networkingstream量应该让您知道您实际使用了多less。 如果您需要真正的100mbit甚至千兆速度,您可能需要查看专用服务器。 否则,您需要减慢请求的速度,直到服务器减慢到足以让服务器处理它为止。

您还需要检查您的内存和CPU使用情况。 如果其中任何一个都被刷新,你的服务器将开始丢弃数据包,因为它根本没有资源来处理它们。 先看看top和ntop,看看你的CPU,内存和networking使用情况。

套接字缓冲区溢出意味着数据不适合分配给每个连接的特殊内存缓冲区。 所有来自networking接口的数据都被放入这样一个缓冲区,你的应用程序正在读取它。 一旦应用程序读取了数据,就从这个缓冲区中刷新了。 基本上你应该期望应用程序在数据可用时立即读取数据,应用程序可以自由处理数据。 但是,如果性能不够 – 是CPU饱和还是应用程序locking(这通常是nodejs) – 数据将会持续到来,但是缓冲区大小不足以处理这一切。

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