写点什么

nginx 性能优化之 tcp 调优

  • 2025-11-21
    北京
  • 本文字数:1021 字

    阅读完需:约 3 分钟

本文分享自天翼云开发者社区《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 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 ifend if
复制代码

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

用户头像

还未添加个人签名 2022-02-22 加入

天翼云是中国电信倾力打造的云服务品牌,致力于成为领先的云计算服务提供商。提供云主机、CDN、云电脑、大数据及AI等全线产品和场景化解决方案。

评论

发布
暂无评论
nginx性能优化之tcp调优_CDN_天翼云开发者社区_InfoQ写作社区