nginx性能优化之tcp调优

27 阅读2分钟

本文分享自天翼云开发者社区《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算法的伪代码如下:

if there is new data to sendif the window size >= MSS and available data is >= MSSsend complete MSS segment nowelseif there is unconfirmed data still in the pipeenqueue data in the buffer until an acknowledge is receivedelsesend data immediatelyend ifend ifend if

    TCP_CORK选项: 与TCP_NODELAY相关,该选项可以认为是nagle算法的进一步增强,阻塞数据包的发送,直接手动取消TCP_CORK选项或者报文达到MSS,TCP才会将报文发送出去。即使在收到ACK的情况下,如果发送的数据不足一个MSS,则依然不会发送该报文。该选项适用于大量数据的通信性能。因为sendfile打开时,http头部和body肯定可以一起发送。