为什么在tcpdumplogging了数据包之后丢包?

我们遇到一些奇怪的丢包,想知道这个的原因。

我们有一个图像服务器和一个服务器来强调图像服务器。 两者都位于同一个数据中心

首先我们运行一个像这样的负载testing(缩短了可读性的命令):

ab -n 50 -c 5 http://testserver/img/de.png 

该图像只有大约300字节。 结果是非常快速的回应:

 Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.1 0 0 Processing: 1 3 0.7 3 4 Waiting: 1 3 0.7 3 3 Total: 1 3 0.7 3 4 

当我们增加并发时,我们看到一些滞后(为了可读性缩短命令):

 sudo ab -n 500 -c 50 http://testserver/img/de.png 

结果与并发50:

 Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.2 0 1 Processing: 2 35 101.6 12 614 Waiting: 2 35 101.6 12 614 Total: 3 36 101.7 12 615 

所以我们看到大多数请求都很快,其中一些非常慢。

我们用tcpdump转储整个networkingstream量,并看到一些奇怪的重新传输。

替代文字http://vygen.de/screenshot1.png

这个转储是在图像服务器上拍摄的!

所以你可以看到包含GET请求的初始包(No. 306)到达了映像服务器,但是在tcpdumplogging之后,它看起来丢包了。 在我看来,这个软件包没有到达tomcat映像服务器。

重发是由请求服务器在200ms后触发的,并且之后一切正常。

你知不知道为什么一个包裹收到后会迷路?

我们的机器都是:

  • 英特尔(R)Core(TM)i7 CPU 920 @ 2.67GHz
  • 8 GB RAM
  • 以太网控制器:瑞昱半导体有限公司RTL8111 / 8168B PCI Express千兆以太网控制器(rev 02)
  • Debian版本5.0.5

所以我们没有任何关于内存或CPU负载的问题。

前一段时间,我们的networkingpipe理员遇到了一些问题。 我们通过使用不同的驱动程序处理它,我们现在使用r8168而不是r8169

但是,我们也遇到了同样的问题:英特尔网卡 – 以太网控制器:英特尔公司82541PI千兆以太网控制器(05版)

所以我们看到相同的机器,但不同的以太网卡的问题。

直到现在,我认为丢包只会发生在线路上的服务器之间,当数据包被损坏或类似的东西。

我们真的很想知道在tcpdumplogging完成后丢失数据包的原因是什么。

你的帮助非常感谢。

我们find了这个的根本原因。 我们在tomcat server.xml中有一个25的acceptCount。

acceptCountlogging如下:

acceptCount

所有可能的请求处理线程正在使用时传入连接请求的最大队列长度。 队列满时收到的任何请求将被拒绝。 默认值是100。

但这不是关于acceptCount的全部内容。 短:acceptCount是打开套接字时的backlog参数。 所以这个值对于监听积压很重要,即使不是所有线程都忙。 如果请求更快,那么tomcat可以接受并委托它们等待线程。 acceptCount的默认值为100.这对于处理请求中的突然高峰来说仍然是一个很小的值。

我们用apache和nginx检查了同样的东西,并且发现了同样奇怪的数据包丢失,但是具有更高的并发值。 apache中相应的值是ListenBacklog,默认为511。

但是,在Debian(和其他基于Linux的操作系统)中,backlog参数的默认最大值是128。

 $ sysctl -a | grep somaxc net.core.somaxconn = 128 

所以无论你在acceptCount或ListenBacklog中input什么内容,都不会超过128,直到你改变了net.core.somaxconn

对于一个非常繁忙的networking服务器128是不够的。 你应该改变它像500,1000或3000,取决于你的需要。

将acceptCount设置为1000并将net.core.somaxconn设置为1000后,我们不再有那些丢弃的数据包。 (现在我们在其他地方有一个瓶颈,但这是另一回事..)

200ms是默认的TCP重新传输超时(RTO;在RFC2988中描述,尽pipe没有定义最小值)。

所以…有些东西正在被拖延或丢失,以至于RTO正在被击中。 也许这个数据包被延迟了,RTO就被触发了,但是在数据包parsing/渲染过程中,wireshark会对这个数据包进行平滑处理? 你应该更详细地调查跟踪。

你能提供一个更大的数据包捕获图像吗?