nginx 性能优化之 tcp 调优
本文分享自天翼云开发者社区《nginx性能优化之tcp调优》.作者:江****禄
nginx 在 tcp 连接上有 2 个如下配置:tcp_nodelay on , tcp_nopush off。这两个配置在 tcp 连接中的具体原理如何呢?
在网络拥塞控制领域,我们知道有一个非常有名的算法叫做 Nagle 算法(Nagle algorithm),这是使用它的发明人 John Nagle 的名字来命名的,John Nagle 在 1984 年首次用这个算法来尝试解决福特汽车公司的网络拥塞问题(RFC 896),该问题的具体描述是:如果我们的应用程序一次产生 1 个字节的数据,而这个 1 个字节数据又以网络数据包的形式发送到远端服务器,那么就很容易导致网络由于太多的数据包而过载。比如,当用户使用 Telnet 连接到远程服务器时,每一次击键操作就会产生 1 个字节数据,进而发送出去一个数据包,所以,在典型情况下,传送一个只拥有 1 个字节有效数据的数据包,却要发费 40 个字节长包头(即 ip 头 20 字节+tcp 头 20 字节)的额外开销,这种有效载荷(payload)利用率极其低下的情况被统称之为愚蠢窗口症候群(Silly Window Syndrome)。可以看到,这种情况对于轻负载的网络来说,可能还可以接受,但是对于重负载的网络而言,就极有可能承载不了而轻易的发生拥塞瘫痪。
TCP_NODELAY 选项:禁用 nagle 算法,发送端满足两个条件马上发送:1. 报文累计到 MSS 或者 2.收到上一个报文的 ACK。 接收端的 TCP delayed acknoledgement 算法同样的方式起作用延迟 ACK 的发送,使得协议栈尽可能的合并多个 ACK。默认的时间为 40ms;nginx 上这个选项开启之后则禁用了发送端的 Nagle 算法。 tcp 中 nagle 算法是默认开启的, 但是在网络应用中,并非使用所有的使用场景,nginx 可以在需要的情况下,通过该配置关闭该行为。
nagle 算法的伪代码如下:
TCP_CORK 选项: 与 TCP_NODELAY 相关,该选项可以认为是 nagle 算法的进一步增强,阻塞数据包的发送,直接手动取消 TCP_CORK 选项或者报文达到 MSS,TCP 才会将报文发送出去。即使在收到 ACK 的情况下,如果发送的数据不足一个 MSS,则依然不会发送该报文。该选项适用于大量数据的通信性能。因为 sendfile 打开时,http 头部和 body 肯定可以一起发送。







评论