searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

nginx性能优化之tcp调优

2024-07-15 09:44:43
60
0

  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 send
  if the window size >= MSS and available data is >= MSS
    send complete MSS segment now
  else
    if there is unconfirmed data still in the pipe
      enqueue data in the buffer until an acknowledge is received
    else
      send data immediately
    end if
  end if
end if
 
 
    TCP_CORK选项: 与TCP_NODELAY相关,该选项可以认为是nagle算法的进一步增强,阻塞数据包的发送,直接手动取消TCP_CORK选项或者报文达到MSS,TCP才会将报文发送出去。即使在收到ACK的情况下,如果发送的数据不足一个MSS,则依然不会发送该报文。该选项适用于大量数据的通信性能。因为sendfile打开时,http头部和body肯定可以一起发送。  
 
 
0条评论
0 / 1000
郑****颖
4文章数
0粉丝数
郑****颖
4 文章 | 0 粉丝
郑****颖
4文章数
0粉丝数
郑****颖
4 文章 | 0 粉丝
原创

nginx性能优化之tcp调优

2024-07-15 09:44:43
60
0

  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 send
  if the window size >= MSS and available data is >= MSS
    send complete MSS segment now
  else
    if there is unconfirmed data still in the pipe
      enqueue data in the buffer until an acknowledge is received
    else
      send data immediately
    end if
  end if
end if
 
 
    TCP_CORK选项: 与TCP_NODELAY相关,该选项可以认为是nagle算法的进一步增强,阻塞数据包的发送,直接手动取消TCP_CORK选项或者报文达到MSS,TCP才会将报文发送出去。即使在收到ACK的情况下,如果发送的数据不足一个MSS,则依然不会发送该报文。该选项适用于大量数据的通信性能。因为sendfile打开时,http头部和body肯定可以一起发送。  
 
 
文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
0
0