TCP重新传输延迟 – 失去了确认

也许有人可以帮我解决这个问题。 我试图找出是否有任何可以优化的服务器端,以减less数据包丢失的延迟

环境:Windows 2012客户端,CentOS 6.x服务器[Couchbase],同一个数据中心,具有防火墙穿越的繁忙局域网。 两者都是大容量的物理服务器。

问题:从客户的angular度来看,响应时间在〜1ms左右是很好的分布,但是我们看到200ms的峰值。

networking跟踪显示:

  1. 客户端 – >发送请求
  2. 服务器 – >用{应用程序响应+ TCP ack请求数据包}回复(1 ms)(本例中为78字节)
  3. 数据包不被客户端接收
  4. 约30 ms后,客户端TCP堆栈重新发送原始请求
  5. 服务器立即回复DUP ACK(66字节,不包含应用程序响应)
  6. 从初始请求到〜200 ms后,服务器重新发送原始响应(78字节的数据包)。

任何想法这200毫秒的延迟来自哪里,以及如何减less它? 我猜想一些tcp延迟的ack,nagle和拥塞/ RTOalgorithm的组合,但是linux内核调整对我而言有点神秘。

任何build议?

是的,wireshark双方,tcpdump,在交换机级别(相当高端的Arista 10G交换机)采取的networking跟踪,在防火墙(Fortinet)上采取的踪迹等等。

问题不在于客户没有收到回复。 这是一个繁忙的networkingstream量突然,所以失去一万个数据包并不意外。 但是即使丢失数据包,我也需要提供一个SLA,这个200毫秒的延迟将会把它丢掉。

我的意思是,在DEV上进行试验,我可以通过路由命令[server-side]将客户端子网的TCP RTO设置为5ms来“解决”这个问题。 有了这个,99.999%的请求在10毫秒内得到了答复,我会见到我的SLA。 好,但是在生产中这样做的缺点是什么? RTO是真正的问题,还是我偶然修复? 这是这个问题的最佳解决scheme,还是有一些更聪明/更好(调整configuration文件?sysctl参数?向迷你神祈祷?)?

RI-感谢