`
100Continue
  • 浏览: 160084 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

TCP Delay引起的性能问题 —— tengine request no buffering性能测试回顾

阅读更多

项目开发缘由:

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方式进行数据传输。
if (clcf->tcp_nodelay && c->tcp_nodelay == NGX_TCP_NODELAY_UNSET) {
        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "upstream tcp_nodelay");

        tcp_nodelay = 1;

        if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY,
                           (const void *) &tcp_nodelay, sizeof(int)) == -1)
        {
            ngx_connection_error(c, ngx_socket_errno,
                                 "setsockopt(TCP_NODELAY) failed");
            ngx_http_upstream_finalize_request(r, u, 0);
            return;
        }

        c->tcp_nodelay = NGX_TCP_NODELAY_SET;
    }
 
2. 当tengine的前端与后端均有no delay时的性能问题:
问题描述:
上文讲过,Nagle算法的设计初衷是为了保证网络性能,当tcp nodelay开启后,Nagle算法的防护就失效,当请求文件大小稍大于no buffer size大小时(如请求文件大小为10K,no buffer size为8K)且访问压力大的情况下,tcp以大量小数据块的形式进行传输,导致网络利用率低,存在大量的小包传输。
解决方案:
应用方需要权衡线上上传数据的size范围,服务器硬件性能等指标,选择合理的buffer size配置,避免出现大量上传请求的数据size在buffer size范围左右。并启用监控策略,监控显示数据流量变化情况。
 
转发请备注转自:100continue.iteye.com。 
1
1
分享到:
评论

相关推荐

    淘宝Tengine 易运维的高性能Nginx服务器

    ### 淘宝Tengine:易运维的高性能Nginx服务器 #### Tengine的由来与背景 Tengine是阿里巴巴集团旗下的淘宝网针对Nginx的一些局限性进行改进后所开发的一款高性能Web服务器。Nginx自推出以来,以其出色的性能、较低...

    Tengine(tengine-2.3.3.tar.gz)

    8. **故障转移与备份**:Tengine支持主备模式,当主服务器出现问题时,可以自动切换到备用服务器,保证服务的连续性。 9. **安全性**:Tengine提供了多种安全特性,包括SSL/TLS加密、HTTP/2支持、防止跨站脚本攻击...

    tengine2.1.2

    Tengine是淘宝团队基于Nginx开发的一款高性能的Web服务器/反向代理服务器,它包含了Nginx的所有功能,并在性能、稳定性和功能扩展性上进行了优化。标题提到的"Tengine2.1.2"是该软件的一个特定版本,这个版本包含了...

    nginx-tengine-3.0.0

    Tengine的性能和稳定性已经在大型的网站如淘宝,天猫,优酷,全球速卖通,Lazada,阿里云等得到了很好的检验。Tengine将向通用API网关方向持续演进和发展,在HTTP应用流量入口网关的基础上,逐步支持4/7层TLS,TCP,...

    tengine淘宝Web服务器 v3.1.0.zip

    《Tengine淘宝Web服务器v3.1.0详解》 Tengine是由淘宝网发起的Web服务器项目,它基于Nginx并对其进行了一系列的定制和优化,以满足大规模网站的需求。Tengine在Nginx的基础上增加了许多特性,如动态模块加载、访问...

    tengine-2.2.0.tar.gz

    7. **更好的社区支持**:由于Tengine由淘宝公司开发并维护,因此在遇到问题时,用户可以获得来自阿里巴巴集团及社区的专业技术支持。 在解压后的“tengine-2.2.0”目录中,用户可以找到源代码、文档、示例配置等...

    cpp-Tengine一个精简高性能用于嵌入式设备的模块化推理引擎

    Tengine是一款专为嵌入式设备设计的轻量级、高性能的模块化推理引擎,它在C/C++语言基础上开发,适用于各种低功耗、资源有限的硬件平台。这款引擎的主要目标是提供高效的深度学习模型执行能力,为物联网(IoT)设备、...

    Tengine 用户使用手册丨OPEN AI LAB

    此外,Tengine还提供了常见AI应用算法,包括图像检测,人脸识别,语音识别等。Tengine同时还支持各类常见卷积神经网络,包括SqueezeNet,MobileNet,AlexNet,ResNet等,支持层融合、8位量化等优化策略,并且通过...

    tengine-2.3.2_win64.rar

    Tengine 是一个基于 Nginx 的高性能 Web 和反向代理服务器,由淘宝网开发并维护,它在 Nginx 的基础上增加了许多功能和优化,以更好地适应大规模网站的需求。 描述 "tengine-2.3.2 在Cygwin下编译, 花了不少的时间...

    tengine-2.1.0.tar.gz

    《深入解析Tengine 2.1.0:构建高性能Web服务器》 Tengine是由淘宝网发起的Web服务器项目,它是Nginx的分支,旨在打造一个高效、稳定、易用且具有广泛社区支持的Web服务器平台。Tengine在Nginx的基础上进行了许多...

    阿里Tengine网关最佳实践.pdf

    - 集群分流能力:Tengine网关可以将流量分配到不同的集群和节点上,这种分流能力可以帮助网站应对大规模的用户请求,提升网站的整体性能。 - 动态化特性:Tengine支持动态化配置,如动态后端列表、动态服务发现、...

    阿里七层流量入口Tengine硬件加速探索之路.zip

    为了应对这些挑战,阿里集团在Nginx基础上开发了一款定制化的Web服务器——Tengine,它在性能优化、稳定性增强、功能扩展等方面有着出色的表现。本文将深入探讨Tengine在阿里七层流量入口的应用,以及如何通过硬件...

    tengine-2.3.1.tar.gz

    6. **故障转移与恢复**:Tengine可能具备更强大的故障检测和恢复机制,确保服务的高可用性,即使在部分服务器出现问题时也能快速恢复正常。 7. **日志管理和监控**:Tengine可能会提供更灵活的日志格式和统计工具,...

    阿里七层流量入口Tengine硬件加速探索之路.pdf

    在当前的互联网环境下,流量入口的性能优化成为了保障网络服务体验的关键环节。阿里巴巴集团作为全球领先的电子商务平台,在处理巨大的用户访问量以及大促活动期间的流量高峰方面具有丰富的经验。Tengine作为阿里...

    tengine-2.0.1.tar.gz

    7. **故障恢复**:Tengine具备自动故障检测和恢复机制,当主服务器出现问题时,能快速切换到备份服务器,保证服务连续性。 8. **多进程/线程模型**:Tengine改进了进程和线程模型,以适应大规模并发环境,提高了...

    tengine-2.3.2 for windows full modules

    Tengine是一款基于Nginx的高性能Web服务器和反向代理服务器,由淘宝网发起并维护。这个名为“tengine-2.3.2 for windows full modules”的版本是专为Windows平台设计的,它包含了所有可用的模块,这使得它能够支持更...

    tengine-2.3.2.tar.gz

    Tengine是一款基于Nginx核心并由淘宝网开发和维护的高性能Web服务器和反向代理服务器,它在Nginx的基础上增加了许多功能特性,尤其在负载均衡、动态内容处理、日志管理和性能优化等方面有着显著的优势。Tengine-...

    tengine-2.2.2.tar.gz

    - **故障恢复**:Tengine具备更好的容错性和故障转移能力,能自动检测并处理服务器故障,减少服务中断的可能性。 - **日志管理和统计**:提供更高级的日志管理和分析功能,便于监控和优化服务器性能。 **2. 安装...

    tengine安装包和依赖包

    Tengine是一款基于Nginx开发的高性能Web服务器,由淘宝网发起并维护,它在Nginx的基础上增加了一些特性和优化,更适合大规模高并发的互联网应用。以下是对"Tengine安装包和依赖包"的详细解释: 一、Tengine概述: ...

Global site tag (gtag.js) - Google Analytics