我有一台Tomee 1.5.1
机器正在运行AWS m1.medium
实例Windows Server 2008
。
我在服务器上放置了一个静态.jpg
文件2.5 MB
,然后我花了一些时间25 seconds
用 Chrome 将它下载到我的机器上。
当观察 Wireshark 中的流量时,我发现当接收器窗口为 256 且缩放因子为 256(左移 8)时,接收器Window Size
恒定为。64 KBbytes
典型的交流是:
消除的因素:
服务器超载了——但事实并非如此。
服务器带宽较低 - 至少在从服务器初始化连接时带宽较低。在服务器机器上运行 ookla speedtest 到我所在位置附近的一些基准提供商时,显示上行/下行链路约为 60 Mbps。
3.接收器速度慢/配置错误 - 事实并非如此 - 同一个文件在 2 秒内从某个文件共享服务器下载。窗口大小会随着流量/拥塞的增加而增加,并且会变得更大。
编辑1
在客户端禁用启发式方法没有帮助
编辑2
另一个问题是,为什么发送方似乎发送了一系列 1460*6+240=9000 字节的数据,并且没有超过一个“未完成”的系列,这意味着他在收到前一个系列的确认后就发送了新的系列
编辑3:
事实证明,http 连接器有一个设置socketBuffer
- “为套接字输出缓冲提供的缓冲区的大小(以字节为单位)。可以指定 -1 来禁用缓冲区的使用。默认情况下,将使用 9000 字节的缓冲区。” - 这些正是我们看到的传出批次的 9000 字节。
类似地,tcp 驱动程序将传出的数据包存储在缓冲区中,以便在需要时重新传输它们,直到它获得确认,并且由于某种原因,客户端确认会分批返回,因此传出的流量会被分批处理。
如果我们将其更改为 4MB,则批处理将增加到 64KB......
如果流量未经过 SSL 加密。如果启用了 SSL,则批处理为 16kb。
需要检查以下内容:
- 对于低 ping 的连接,最佳输出缓冲区大小是多少?我认为 64k 左右就可以了。
- SSL输出缓冲区如何配置
- 尝试更新版本的 tomee - http 连接器有更新
- 查看 NIO 连接器
- 为什么 ACK 是分批到达的?
编辑4:
64k 的缓冲区大小有点不同。为了安全起见,我选择了 128k。
如果我们在 Windows Server 2016 上使用 Tomee 7,SSL 的工作速度与常规 http 流量一样快。目前我不知道 tomcat5-win2008 和 tomcat7-win2016 之间的变化何时发生。
答案1
对于 Windows 来说似乎有两件事要讨论,首先检查您当前的配置:
netsh int tcp show global
通常建议关闭自动调整,但这也会关闭缩放。因此使用restricted
似乎实际上更有利于缩放。关闭自动调整也会禁用缩放,所以不要这样做。
还有一些人报告说,在客户端上禁用窗口缩放启发式方法会使该功能被更一致地请求。当 Windows 低估链接质量时,256*255 似乎是一个典型的组合。
另请查看这篇关于客户端和服务器端 PSH 优化的文章(尤其是针对 Windows)。从您的序列图中,我确实发现客户端等待确认数据包的时间太长(等待来自服务器的 PSH)。http://smallvoid.com/article/winnt-tcp-push-flag.html