针对TCP的优化建议

TCP是一个自适应的、对所有网络节点一视同仁的、最大限制利用底层网络的协议。因此,优化TCP的最佳途径就是调整它感知当前网络状况的方式,根据它之上或之下的抽象层的类型和需求来改变它的行为。无线网络可能需要不同的拥塞算法,而某些应用程序可能需要自定义服务品质(QoS,Quality of Service)的含义,从而交付最佳的体验。

不同应用程序需求间的复杂关系,以及每个TCP算法中的大量因素,使得TCP调优成为学术和商业研究的一个“无底洞”。本章只蜻蜓点水般地介绍了影响TCP性能的几个典型因素,而没有探讨的选择性应答(SACK)、延迟应答、快速转发等,随便一个都能让你领略到TCP的复杂性(或者乐趣),感受到理解、分析和调优之难。

尽管如此,而且每个算法和反馈机制的具体细节可能会继续发展,但核心原理以及它们的影响是不变的:

  • TCP三次握手增加了整整一次往返时间;
  • TCP慢启动将被应用到每个新连接;
  • TCP流量及拥塞控制会影响所有连接的吞吐量;
  • TCP的吞吐量由当前拥塞窗口大小控制。

结果,现代高速网络中TCP连接的数据传输速度,往往会受到接收端和发送端之间往返时间的限制。另外,尽管带宽不断增长,但延迟依旧受限于光速,而且已经限定在了其最大值的一个很小的常数因子之内。大多数情况下,TCP的瓶颈都是延迟,而非带宽。

1. 服务器配置调优

在着手调整TCP的缓冲区、超时等数十个变量之前,最好先把主机操作系统升级到最新版本。TCP的最佳实践以及影响其性能的底层算法一直在与时俱进,而且大多数变化都只在最新内核中才有实现。一句话,让你的服务器跟上时代是优化发送端和接收端TCP栈的首要措施。

表面看来,升级服务器内核到最新版本好像是件易如反掌的事儿。但在实践中,升级经常会遭遇阻力。很多现有服务器已经针对特定的内核版本进行了调优,而系统管理员并不情愿升级。
实事求是地讲,每一次升级都有相应的风险。但为了获得最大的TCP性能,升级恐怕也是唯一最佳的选择。

有了最新的内核,我们推荐你遵循如下最佳实践来配置自己的服务器。

  • 增大TCP的初始拥塞窗口
    加大起始拥塞窗口可以让TCP在第一次往返就传输较多数据,而随后的速度提升也会很明显。对于突发性的短暂连接,这也是特别关键的一个优化。
  • 慢启动重启
    在连接空闲时禁用慢启动可以改善瞬时发送数据的长TCP连接的性能。
  • 窗口缩放(RFC 1323)
    启用窗口缩放可以增大最大接收窗口大小,可以让高延迟的连接达到更好吞吐量。
  • TCP快速打开
    在某些条件下,允许在第一个SYN分组中发送应用程序数据。TFO(TCP Fast Open,TCP快速打开)是一种新的优化选项,需要客户端和服务器共同支持。为此,首先要搞清楚你的应用程序是否可以利用这个特性。

以上几个设置再加上最新的内核,可以确保最佳性能:每个TCP连接都会具有较低的延迟和较高的吞吐量。

视应用程序的类型,可能还有必要调整服务器上的其他TCP设置,以便优化高速连接的速度、内存占用,或者其他类似的关键选项。不过,这些系统配置与平台、应用程序、硬件有关,超出了本书讨论范围;必要时,可以参考平台文档。但更重要的是要分清轻重缓急,着力解决真正的瓶颈,而不是眉毛胡子一把抓。

Linux用户可以使用ss来查看当前打开的套接字的各种统计信息。在命令行里运行ss --options --extended --memory --processes --info,可以看到当前通信节点以及它们相应的连接设置。

2. 应用程序行为调优

调优TCP性能可以让服务器和客户端之间达到最大吞吐量和最小延迟。而应用程序如何使用新的或已经建立的TCP连接同样也有很大的关系。

  • 再快也快不过什么也不用发送,能少发就少发。
  • 我们不能让数据传输得更快,但可以让它们传输的距离更短。
  • 重用TCP连接是提升性能的关键。

当然,消除不必要的数据传输本身就是很大的优化。比如,减少下载不必要的资源,或者通过压缩算法把要发送的比特数降到最低。然后,通过在不同的地区部署服务器(比如,使用CDN),把数据放到接近客户端的地方,可以减少网络往返的延迟,从而显著提升TCP性能。最后,尽可能重用已经建立的TCP连接,把慢启动和其他拥塞控制机制的影响降到最低。

3. 性能检查清单

优化TCP性能的回报是丰厚的,无论什么应用,性能提升可以在与服务器的每个连接中体现出来。下面几条请大家务必记在自己的日程表里:

  • 把服务器内核升级到最新版本(Linux:3.2+);
  • 确保cwnd大小为10;
  • 禁用空闲后的慢启动;
  • 确保启动窗口缩放;
  • 减少传输冗余数据;
  • 压缩要传输的数据;
  • 把服务器放到离用户近的地方以减少往返时间;
  • 尽最大可能重用已经建立的TCP连接。

Web性能权威指南
2.5 针对TCP的优化建议

猜你喜欢

转载自blog.csdn.net/weixin_34082695/article/details/90784954