项目开发缘由:
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。
相关推荐
淘宝Tengine 易运维的高性能Nginx服务器
Tengine一个精简,高性能,用于嵌入式设备的模块化推理引擎
此外,Tengine还提供了常见AI应用算法,包括图像检测,人脸识别,语音识别等。Tengine同时还支持各类常见卷积神经网络,包括SqueezeNet,MobileNet,AlexNet,ResNet等,支持层融合、8位量化等优化策略,并且通过...
tengine2.1.2所需的全部依赖,以及对应的tengine2.12包本身,包括zlib-1.2.8,pcre-8.38,openssl-1.0.2g,jemalloc-3.6.0
tengine 2.3.2 cygwin 编译,包含所有模块, 修正源码中很多在windows上编译报错的问题
Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台。 从2011年12月开始,Tengine成为一个开源项目,Tengine团队在积极地开发...
Tengine(tengine-2.3.3.tar.gz)
Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台。从2011年12月开始,Tengine成为一个开源项目,Tengine团队在积极地开发和...
阿里tengine-韩述
tengine-2.3.2 在Cygwin下编译, 花了不少的时间才搞定的问题,--------------亲测可用。
淘宝基于Nginx高效稳定针对大访问请求的Tengine服务器快速搭建方法。 LTMP是用Linux Shell编写的可以为CentOS/RadHat、Debian/Ubuntu VPS(VDS)或独立主机安装LTMP(Nginx、Tengine、MySQL、PHP、phpMyAdmin)生产环境...
包括tengine部署文档和相关的软件包 tengine-2.2.1.tar.gz pcre2-10.21.tar.gz openssl-1.0.2n.tar.gz jemalloc-5.0.1.tar.bz2 zlib-1.2.11.tar.gz
淘宝开源项目tengine介绍 一个基于nginx二次开发的项目。
nginx(tengine)启动文件,tengine编译安装后,需要做etc/init.d下加入系统服务,下载后,可能因为编码问题需要手动建立nginx文件,然后通过vi或者vim复制过去,然后修改里边nginx的安装路径
WEB服务器淘宝的Tengine介绍.zip Tengine与Nginx的对比 OpenResty是nginx的变种 LNMH(Nginx+HHVM) 服务器用的是淘宝的Tengine
在安装tengine过程中,预编译完成后所需要的建立的nginx文档,可直接复制到linux中,修改路径后可直接使用。
使用tengine进行视频人脸检测的代码,tengine再cpu推理优化比较好,速度比较快
linux环境下tengine整合lua和gm。实现自动图片裁剪,的安装包。可实现将图片剪切为指定的比例,加快前端的加载速度,对应使用博客https://blog.csdn.net/qq_36911145/article/details/82898096
Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量...Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台。
tengine安装包和依赖包,方便安装。