一、现象

  在一次访问请求nginx中,通常只需要几毫秒的RT,但当请求数据达到某一个数值时,rt明显提高,甚至超过了300毫秒。 

二、问题的原因

  大家都知道,TCP为了提高带宽利用率和吞吐量,做了各种优化。比如delay ack和Nagle算法。就是这样的一些优化使用不慎,导致陷入性能问题。接下来就先分别说说delay ack和Nagle算法。

  • 什么是delay ack

  就以我们的Nginx为例吧。nginx收到请求后,立即返回一个ack收到确认包。这个包没有只有消息头没有任何数据内容。这就导致一个明显的问题:带宽利用率比较低效。那有没有办法可以优化呢?有,就是delay ack。怎么做呢?就是Nginx收到数据不要着急发送ack包,而是等一段时间比如40毫秒,如果这40毫秒内有数据要发送给client。那么这个ack就可以打这趟顺风车了,从而节省资源。如果40毫秒内没数据发送给client呢,没办法,到了40毫秒也必须发送ack包。因为client以为丢包重传的代价更大。

  还有一种情况就是,nginx收到数据在延缓等待发送ack包时,又收到client的一个数据包。这时nginx会把两个ack包合并为一个ack包回复给client。

  • 什么是Nagle算法

  在发送数据包时,如果数据包小于MSS(最大分段大小),则会去判断是否有已发出去的包还没有ack,如果有则不着急发送,等等前面的包收到回复再发送。

  • 性能问题关键点,client端启动Nagle,server端启动delay ack

  假如client发送一个http请求个server。这个请求时1600byte,MSS是1460byte。那么就会分成两个tcp包,第一个1460byte,剩下的140byte放在第二个包。第一个包发送到server时,由于server开启了delay ack,所以没有立即ack,又因为server没有收到完整的http请求包,所以也没有立即进行http response,这就导致ack会一直等到40毫秒的delay时间。其实如果client立即发送第二个包,server收到后立即做出http response也不会有问题。问题时client启动了Nagle算法,第一个包没有收到ack,第二个包就不会立即发送出去。两边相互等。这就是性能问题的核心原因。

一不小心,陷入TCP的性能问题的更多相关文章

  1. 【T07】不要低估tcp的性能

    1.tcp在ip的基础上增加了校验和.可靠性和流量控制的功能,而udp只增加了校验和的功能,看起来udp应该会比tcp快很多, 但事实不是这样,有时候tcp比udp的性能还要好. 2.思考,在什么情况 ...

  2. Mono 3.2.3 TCP吞吐性能测试报告

    在前几天简单地测试了一下Mono 3.2.3 TCP处理的稳定性,有同学问Mono 3.2.3的TCP处理性有怎样,以下是针对Mono 3.2.3TCP在吞吐方面的性能测试.主要测试分两种场分别是连接 ...

  3. tcp/ip 性能优化问题的思考学习

    首先要看TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层.  其中以太网(Ethernet)的数据帧在链路层 IP包在网络层 TCP或UDP包在传输层 TCP或UDP中的数据(Data)在 ...

  4. TCP协议的性能评测工具 — Tcpdive开源啦

    Github地址:https://github.com/fastos/tcpdive 为什么要开发Tcpdive 在过去的几年里,随着移动互联网的飞速发展,整个基础网络已经发生了翻天覆地的变化. 用户 ...

  5. 【TCP/IP详解 卷一:协议】第二十四章 TCP的未来与性能

    来到了TCP的最后一个章节,未来与性能.在当时(1991年)的未来,如今已经部分变为现实,部分就只是历史中的实验. 主要内容: 路径MTU的发现与TCP的结合. 长肥管道 和 高速千兆比网络. 窗口扩 ...

  6. 《HTTP权威指南》之HTTP连接管理及对TCP性能的考虑

    在上一篇博客中(<HTTP权威指南>之HTTP相关概念详解)我们简单对HTTP相关的基本概念做了一些简单的了解,但未对HTTP连接管理的内容做一些详细的介绍.本篇博客我们就一起来看一下HT ...

  7. TCP拥塞控制算法之NewReno和SACK

    TCP拥塞控制算法之NewReno和SACK 2018年05月23日 19:10:03 吃吃爱学习 阅读数:1446    版权声明:程序媛吃吃的博客 https://blog.csdn.net/m0 ...

  8. tcp协议头窗口,滑动窗口,流控制,拥塞控制关系

    参考文章 TCP 的那些事儿(下) http://coolshell.cn/articles/11609.html tcp/ip详解--拥塞控制 & 慢启动 快恢复 拥塞避免 http://b ...

  9. [转]提高 Linux 上 socket 性能,加速网络应用程序的 4 种方法

    原文链接:http://www.ibm.com/developerworks/cn/linux/l-hisock.html 使用 Sockets API,我们可以开发客户机和服务器应用程序,它们可以在 ...

随机推荐

  1. Apache URL重写规则

    1.简介 Apached的重写功能,即是mod_rewrite模块功能,它是apache的一个模块.它的功能非常强大,可以操作URL中的所有部分. 因此我们就可以改写url,给用户提供一个简介大方的u ...

  2. vue获取dom元素内容

    通过ref来获取dom元素 在vue官网上对ref的解释 ref 被用来给元素或子组件注册引用信息.引用信息将会注册在父组件的 $refs 对象上.如果在普通的 DOM 元素上使用,引用指向的就是 D ...

  3. struts2 之 struts2数据处理

    开门见山,struts2的数据处理总结: 1. 在servlet中,如果要获取页面提交的数据要使用requerst.getParameter方法来获取,并且每次需要进行相关的类型转换工作,数据的获取及 ...

  4. Java 原始数据类型的计算:运算符重载(Operator Overload)和类型转换(Type Conversion)

    原文阅读:<算法(第四版)>第一章 第一节:基础编程模型 有没有在面试的时候被问到:下面这几行代码的执行结果是什么?依据是什么? System.out.println (5/3); Sys ...

  5. cookie和session的区别异同

    1.用于保存页面信息:如自动登录,记住用户名 2.对于同一个网站只有一套cookie,它是以域名为单位的,一个域名就是一套,数量大小有限4k-10k,同时会具有过期时间 3.JS中通过document ...

  6. FreeBSD上构架Nginx服务器

    这篇文章主要记录作者如何在FreeBSD上构架Nginx服务器.作者采用下载该程序的一个源代码包手动编译的方法,而不是使用包管理工具.这样做有两个原因:首先包质量不能保证,或无效或版本旧:其次需要在编 ...

  7. Unity C#集合

    集合分为两种:非泛型集合,泛型集合. 非泛型集合需要引入:System.Collections命名空间,其命名空间下的类有: ArrayList表示大小根据需要动态增加的对象数组. Hashtable ...

  8. node-ejs-mongodb结合的项目案例-----引用mongoose和未引用mongoose模块

    本项目个人尝试了2种方法,一个是直接用mongod,一个是引用mongod里的mongoose. nodejs-ejs-mogondb- nodej+ejs模板,通过mogondb数据查询数据实现简单 ...

  9. 【WPF】学习笔记(一)——做一个简单的电子签名板

    参加实习(WPF)已经有两个多周的时间了,踩了一些坑,也算积累了一些小东西,准备慢慢拿出来分享一下.(●'◡'●) 这次呢就讲讲一个简单的电子签名板的实现. 先上张图(PS:字写得比较丑,不要太在意哈 ...

  10. js图片轮播

    html部分 <a href="" id="pta"><div id="picture" class="pt&q ...