在Linux中跟踪“连接重置”错误

我正在使用Java处理大量的并发下载(每个服务器大约500个)。

所有文件都从Amazon S3下载,下载服务器是EC2 m1.large实例。

有时,2个或更多的stream将同时被打破,导致java.net.SocketException。 偶尔可能有多达10个stream被破坏。

我正在从Amazon S3和Akamai服务器下载相同的结果。 只有当负载开始相当高(200或更多的并发下载)时才会发生。

我在正常的CPU,networking负载和内存范围内。

我强烈怀疑问题出在我的服务器上,而不是S3和Akamai的。 我怎么能debugging这个跟踪原因?

您可以使用tcpdump捕获stream量,并在连接中断后查看。 Wireshark例如有一个选项“遵循TCPstream”,一旦find最后一个数据包,您就可以轻松地find一个被破坏的数据包。

可能还有相当多的数据要通过,但是正如你所说的,只有当负载很高时才会发生,我不认为有这个方法。

首先,您可以查看networking接口(通过ifconfig )报告的错误,并查看连接断开时该数字是否显着增加。

你和S3之间的path上是否有防火墙/ NAT?

你可以在服务器和防火墙之间,防火墙和S3之间同时捕获( tcpdump -w file -s 0 )2点的stream量,然后比较转储? 在启动tcpdump之前,请确保在捕获主机上使用NTP精确同步时钟。

然后比较两个networking捕获在连接被删除的时间点。

我有一个类似的难以捉摸的问题,通过比较networkingstream量转储,我发现这是由于我的Linux服务器上的SACK处于活动状态,但由处理来自Internet的stream量的Cisco ASA防火墙进行错误解释。

必须使用sysctl( net.ipv4.tcp_sack )禁用SACK。