tcp_nodelay(1)

发布时间:2021-11-30 06:06:23

转发请备注转自:100continue.iteye.com


项目开发缘由:



tengine在接收client端post数据并转发给后端application server进行处理的时候,默认启用buffer模式,也就意味着,当client发送的数据较小时,tengine会将所有post数据保存在内存中之后再转发后端application server,而当client发送的数据较大时(根据配置中所设置的buffer大小来区分数据是否保存到文件),tengine会将post数据保存成临时文件写入磁盘,只有在全部接收完post数据后,才会将临时文件读取回内存并转发后端application server。因此,当访问压力较大且post数据超过buffer大小,那么tengine将会有大量的io操作,从而存在性能风险。

request no buffering的开发就是为了解决该性能问题,其设计思路是,通过
client_body_postpone_sending
配置项设置存储post数据的内存buffer大小,然后通过proxy_request_buffering 和 fastcgi_request_buffering开关来决定是否开启request no buffering功能。当request no buffering开启后,当tengine接收到的post数据大于所设置的buffer大小之后,马上向后端application server转发。这样就规避了之前提到的大量的io操作所带来的性能风险。



?


性能测试问题:


1. tcp delay所带来的性能瓶颈:


问题描述:


在性能测试的过程中发现,与传统的buffer模式相比,当请求文件大小稍大于no buffer size大小时(如请求文件大小为10K,no buffer size为8K),性能表现非常差,用户*均等待时间达到60ms左右,QPS下降100倍。


究其原因:


是因为tcp delay的问题。tcp delay准确的说是Nagle算法,其设计的初衷是为了保证网络性能,因为应用程序可以通过它将任意尺寸的数据放入TCP栈中??即使一次只放一个字节!但是,每个TCP段中都至少装载了40个字节的标记和首部,所以如果TCP发送大量包含少量数据的分组,网络的性能就会严重下降。而Nagle算法试图在发送一个分组之前,将大量TCP数据绑定在一起,鼓励发送全尺寸(LAN上最大尺寸的分组约为1500字节,Internet上是几百字节)的段。这将导致几种HTTP性能问题。首先,小的HTTP报文可能无法填满一个分组,可能会因为等待那些永远不会带来的额外数据而产生时延。其次,Nagle算法与延迟确认之间的交互存在问题??Nagle算法会阻止数据的发送,知道有确认分组抵达为止,但确认分组自身会被延迟确认算法延迟100~200毫秒。


最初方案:


在配置文件中加入
tcp_nodelay?on配置项,验证证明无效。原因是该配置项只对tengine的前端生效,不对后端生效。


真正的解决方案:


在代码中加入:


?


当配置文件中tcp_nodelay为on时,对后端也采用tcp_nodelay方式进行数据传输。





C代码??



  1. if?(clcf->tcp_nodelay?&&?c->tcp_nodelay?==?NGX_TCP_NODELAY_UNSET)?{??
  2. ????????ngx_log_debug0(NGX_LOG_DEBUG_HTTP,?c->log,?0,?"upstream?tcp_nodelay");??
  3. ??
  4. ????????tcp_nodelay?=?1;??
  5. ??
  6. ????????if?(setsockopt(c->fd,?IPPROTO_TCP,?TCP_NODELAY,??
  7. ???????????????????????????(const?void?*)?&tcp_nodelay,?sizeof(int))?==?-1)??
  8. ????????{??
  9. ????????????ngx_connection_error(c,?ngx_socket_errno,??
  10. ?????????????????????????????????"setsockopt(TCP_NODELAY)?failed");??
  11. ????????????ngx_http_upstream_finalize_request(r,?u,?0);??
  12. ????????????return;??
  13. ????????}??
  14. ??
  15. ????????c->tcp_nodelay?=?NGX_TCP_NODELAY_SET;??
  16. ????}??


?



2. 当tengine的前端与后端均有no delay时的性能问题:


问题描述:


上文讲过,Nagle算法的设计初衷是为了保证网络性能,当tcp nodelay开启后,Nagle算法的防护就失效,当请求文件大小稍大于no buffer size大小时(如请求文件大小为10K,no buffer size为8K)且访问压力大的情况下,tcp以大量小数据块的形式进行传输,导致网络利用率低,存在大量的小包传输。


解决方案:


应用方需要权衡线上上传数据的size范围,服务器硬件性能等指标,选择合理的buffer size配置,避免出现大量上传请求的数据size在buffer size范围左右。并启用监控策略,监控显示数据流量变化情况。









(2)

今天在用nginx作web缓存的时候,发现在http里加入这样个参数,能有效的提高数据的实时响应性,那就是tcp_nodelay.下面我们来说说tcp_nodelay的原理:


?????? TCP_NODELAY和TCP_CORK基本上控制了包的“Nagle化”,这里我们主要讲TCP_NODELAY.Nagle化在这里的含义是采用Nagle算法把较小的包组装为更大的帧。JohnNagle是Nagle算法的发明人,后者就是用他的名字来命名的,他在1984年首次用这种方法来尝试解决福*倒镜耐缬等侍猓ㄓ私庀昵榍氩慰碔ETF RFC 896)。他解决的问题就是所谓的silly window syndrome,中文称“愚蠢窗口症候群”,具体含义是,因为普遍终端应用程序每产生一次击键操作就会发送一个包,而典型情况下一个包会拥有一个字节的数据载荷以及40个字节长的包头,于是产生4000%的过载,很轻易地就能令网络发生拥塞,。Nagle化后来成了一种标准并且立即在因特网上得以实现。它现在已经成为缺省配置了,但在我们看来,有些场合下把这一选项关掉也是合乎需要的。?
??????现在让我们假设某个应用程序发出了一个请求,希望发送小块数据,比如sns游戏中的点击确定按钮。我们可以选择立即发送数据或者等待产生更多的数据然后再一次发送两种策略。如果我们马上发送数据,那么交互性的以及客户/服务器型的应用程序将极大地受益。例如,当我们正在发送一个较短的请求并且等候较大的响应时,相关过载与传输的数据总量相比就会比较低,而且,如果请求立即发出那么响应时间也会快一些。以上操作可以通过设置套接字的TCP_NODELAY选项来完成,这样就禁用了Nagle算法,在nginx中设置tcp_nodelay on,注意放在http标签里。
??????另外一种情况则需要我们等到数据量达到最大时才通过网络一次发送全部数据,这种数据传输方式有益于大量数据的通信性能,典型的应用就是文件服务器。应用Nagle算法在这种情况下就会产生问题。但是,如果你正在发送大量数据,你可以设置TCP_CORK选项禁用Nagle化,其方式正好同TCP_NODELAY相反(TCP_CORK 和 TCP_NODELAY 是互相排斥的)。下面就让我们仔细分析下其工作原理。?
???????假设应用程序使用sendfile()函数来转移大量数据(nginx里可以设置sendfile on)。应用协议通常要求发送某些信息来预先解释数据,这些信息其实就是报头内容。典型情况下报头很小,而且套接字上设置了TCP_NODELAY。有报头的包将被立即传输,在某些情况下(取决于内部的包计数器),因为这个包成功地被对方收到后需要请求对方确认。这样,大量数据的传输就会被推迟而且产生了不必要的网络流量交换。?
但是,如果我们在套接字上设置了TCP_CORK(可以比喻为在管道上插入“塞子”)选项,具有报头的包就会填补大量的数据,所有的数据都根据大小自动地通过包传输出去。当数据传输完成时,最好取消TCP_CORK选项设置给连接“拔去塞子”以便任一部分的帧都能发送出去。这同“塞住”网络连接同等重要。?
总而言之,如果你肯定能一起发送多个数据集合(例如HTTP响应的头和正文),那么我们建议你设置TCP_CORK选项,这样在这些数据之间不存在延迟。能极大地有益于WWW、FTP以及文件服务器的性能,同时也简化了你的工作.



相关文档

  • 真正的美国男人、大文豪杰克伦敦
  • 林木承包合同书范本通用版
  • 宾至如归的故事
  • 17年校园讲文明演讲稿
  • 可以用于switch语句的判断的数据类型总结
  • 优秀员工自我评价300字通用5篇
  • 企业父母新年慰问信范文精选
  • 文潭楼在中南财经政法大学哪个校区
  • 小学简单的读书手抄报内容:端午节手抄报内容简单
  • 保安转正申请书推荐6篇
  • 美到惊艳的文艺句子推荐
  • jvm学习第一天
  • 我心中的那道阳光作文600字
  • vue、spring boot开发小而完整的Web前后端分离项目实战
  • 建筑施工合同范文
  • 高一地理必修二第六章知识点总结
  • 和双鱼座男生最配的星座女生是哪个
  • 食物语礼物攻略食物语送礼攻略
  • 同济大学浙江学院学费
  • 中秋节送恋人的思念祝福语
  • 品茗-悟理
  • 水泥建材购销通用版合同
  • 最新!2020中国高校毕业生薪资排行出炉!好过双一流的高校原来这么多
  • 高二年级下册化学知识点
  • 高效的沟通技巧
  • 不要想歪的脑筋急转弯大全及答案
  • 读了陶罐和铁罐,我懂得了
  • 邓伦十大电视剧排行榜 香蜜收视口碑双丰收,因为遇见你上榜
  • 素质教育下如何做好小学班主任工作
  • 编程题:用二维字符串数组实现。从键盘输入三个学生姓名,并输出。
  • 猜你喜欢

  • 手机qq微视怎么删除
  • 广东出台高校毕业生就业新政策
  • 1-业务组合战略方法论 共17页
  • 管理学原理 12章 控制.
  • 2009年9月英语高级口译真题答案
  • 基于混沌遗传算法的舰船电力系统故障恢复
  • 行政部前台试用期工作总结范文
  • JavaMailSender 无法加载
  • 最新文献综述_商业银行信用风险管理
  • 描写四季的成语76872
  • 【中职教师教学工作计划】教师教学详细工作计划
  • 玉田县五洲同辉商贸有限公司企业信用报告-天眼查
  • 商务英语应用写作样章CHAPTER5BUSINESS
  • 柏丽慕达时装学院服装设计专业
  • 春节过年穿什么衣服最好看
  • “3+2”分段培养模式下的《单片机应用技术》课程教学改革研究
  • 苏教版2019-2020学年四年级数学上册期中测试题
  • 配套K12山东省曲阜夫子学校2019届高三化学上学期10月第二次检测试题
  • 文明只差一步看图作文700字600字
  • 梅州市人民政府关于表彰2010年度“三品”认证企业的决定
  • 上海嘉定某社区736例消化性溃疡的特点分析
  • 关于商务咨询服务合同样式
  • 城乡一体化视角下农村公共产品供给问题研究
  • 通信业对我国区域经济发展影响差异的实证研究——基于东、中、西部地区面板数据的协整模型分析
  • 大学四六级考试写作提高:模板大全(48)
  • 整合RF前沿技术,Qorvo重新起航抢占市场
  • 初一议论文作文:金钱、事业和诚信_750字
  • 电气维修计划表
  • 杭二中白马湖实验学校招生报名
  • 2019年初中优秀作文范文附点评-拥抱阳光
  • java做集群_最近在做集群的问题,所以找了一下
  • TS16949基础知识培训教材
  • 精选-广告艺术设计专业个人英文简历范文-word范文
  • java中final的使用方法
  • 高原地区老年消化性溃疡225例临床分析
  • 高速公路隧道施工技术探讨
  • 国际环境法.ppt
  • MySQL学习笔记
  • 长春版四年级语文上册 25.望庐山瀑布(教案)【新版】
  • 【期末专题复*】人教版九年级数学上册_第22章_二次函数_单元检测试卷(有答案)
  • 2018年精选临床医生个人年终工作总结范文word版本 (2页)
  • 2016年瑟肽晁拇ㄊ〉绾腹こ跫堆沽?艿篮附涌际允蕴
  • 电脑版