我有一个应用程序,它定期创建新的 TCP 连接,发出请求,然后在关闭连接之前获得大约 300KB 的响应。假设我无法重新设计此工作负载,并且我这边和连接另一边之间的延迟约为 5ms,我该如何优化性能?
从数据包捕获中我可以看到:
- SYN-SYNACK-ACK 握手(约 15 毫秒)
- 我发送了一个小请求(<1KB),他们确认了它(~10ms)
- 他们开始发送 300KB 的响应
- 它们用约 30K 字节填充 TCP 窗口(第一个字节约 5 毫秒,但之后我仅用 0.05 毫秒便可获得全部 30K 字节)
- 它们在等待我的 ACK 到达时暂停,然后填充新窗口(现在约为 50K,因为我在 ACK 中做了广告)
- 它们填满了那个窗口并暂停......
- ...
因此,为了解决这种情况,我正在考虑net.ipv4.tcp_rmem
从默认值进行更新:
net.ipv4.tcp_rmem = 4096 87380 6291456
类似于:
net.ipv4.tcp_rmem = 307200 307200 6291456
但我真的不确定这会对系统产生什么影响。假设我有许多 GB 的 RAM 处于稳定状态。这样的改变有什么缺点?如果我了解 TCP 的内存使用情况,这将导致我在第一次确认时通告一个 300KB 的窗口,并且假设对方准备一次发送 300KB,他们就会这样做。
答案1
我认为 TCP 慢启动在启动时仍会限制您的接收窗口。
是否可以更改应用程序以重用 TCP 连接?那将是最好的解决方案。
或者,您可以尝试添加本地 HTTP 代理。这样本地延迟将为 0ms,然后可以重用与远程服务器的 TCP 连接。