`
iamlotus
  • 浏览: 106618 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

一次压力测试的故事

阅读更多

最近作了个系统,面向普通网民,设计的吞吐率是单机>1万/s,可水平扩展。我之前作的系统多是面向商业用户,很少有这么高的吞吐率要求,所以这次设计过程中对并发,资源竞争啥的也格外注意,这些暂且不表。等到开发完成,开始压力测试的时候,遇到了些故事,颇花了一些时间,此过程中也学到了不少知识。

 

系统开发完成时,运行在jetty上。当时QA作了一次压测,用5台肉鸡压一个server,得出结论是达到要求,当时我也觉得这就OK了。由于jetty用的是NIO,按照网上的说法,对大量短连接的应用,tomcat的BIO可能更适合,所以我想试试两者的差异。因为QA暂时没有时间配合,我只能自己开始鼓捣,而这一鼓捣就开始有故事了。

 

QA用jmeter作压力测试,我没用过jmeter又懒得从头学,就自己写了个肉鸡客户端,多线程以socket方式向服务器发请求,考虑到客户端本身不是重点,肉鸡就用socket直接写了:每个线程反复执行建立socket->发送->接收->关闭的过程,跑一段时间后统计下成功和各种异常的数目。

第一阶段测试的重点是BIO和NIO的差异,而不是HTTP栈的解析效率,所以直接码了个简单的多线程Socket服务器,ServerSocket.accept()一个Socket传给线程池,线程里的线程对这个socket跑接收->发送->关闭的过程。 SocketServer写好后用两个肉鸡就压上了,然后问题就来了。

肉鸡开始很快,但是一段时间后就几乎hang在那里不动,开始出现异常,包括 connection reset by peer或者connection timeout,过一会儿后吞吐量能上去一点,但很快又落下来,如此反复。这时用jvisualvm看Server,基本就没loading,那是为啥呢?

第一个反应是我的SocketServer写的有问题,于是用NIO手写了个逻辑相同的NioServer,但问题依旧,用mina框架写了个MinaServer再测也还是一样。于是觉得问题不是出现在Server的写法上,而是其它地方。在网上搜了半天,试了不少方法后,觉得可能是http://performtest163.blog.163.com/blog/static/14007696420115295119462 说的问题,看了看跑server的机器

/proc/sys/net/ipv4/tcp_tw_reuse 

/proc/sys/net/ipv4/tcp_tw_recycle 

这两个值确实都没开启,因为测试机不好随便重启,换了个机器找OP要到权限后将这两个值设为1并重启机器后,吞吐量一下子上去了,但客户端还是出现了大量的连接异常,而且这个简单的SocketServer单肉鸡的吞吐率居然比QA测的实际运行在jetty 上的Server低一半还多,这就让人很难理解了。

还是怀疑Server写法的不同。详细分析了代码后,问题应该出现在这里:

重温下以上配套的SocketServer和SocketClient逻辑

Client: 建立socket->发送->接收->关闭

Server: accept socket->接收->发送->关闭

两边都会close socket,那么到底是那边的关闭起作用了?对于这组逻辑,理论上说发送方(Server)应该先到达关闭,但由于tcp是全双工的,发送方也需要等待接收方的SYNC,所以无法确定。不过按照链接中的说法,tcp_tw_reuse 针对的是Server端主动关闭造成的TIME_WAIT,既然打开tcp_tw_reuse起了作用,所以推测这组逻辑中应该是Server端的关闭起了作用。 

另外我又去查了一下,通常HTTP SERVER除非超时,不会主动关闭socket。所以这里的差异可能是由关闭方不同造成的,顺着这个思路,我又用apache HttpClient写了个JettyClient肉鸡去压实际的jetty系统。

这个JettyClient中肉鸡中每个线程的逻辑为反复跑

new HttpClient()->用new 出来的HttpClient发一条Get->接收HttpResponse->关闭HttpClient

结果一会儿工夫肉鸡又Hang住了。由于有了前面的经验,很快发现是由于主动关闭连接,造成肉鸡的Socket耗尽的原因。但问题又来了

1) 肉鸡上确实没有打开tcp_tw_reuse ,肉鸡也不能随便打开这个选项并重启

2) 更关键的是,为什么QA的压力测试用例没有爆出这个问题呢?

 

目前为止,被测系统是同一个,区别只能在QA的测试用例和我的JettyClient中找了。看了QA的测试用例后,我得出的结论是,QA的测试用例写错了。

QA的测试用例中虽然有多线程,但并没有反复的创建和关闭HttpClient,而是在一个线程中初始化时创建了一个HttpClient并反复的通过这个HttpClient去发送Get Request并接受响应。这与线上的实际场景并不一致:线上的100W个请求,可能是100W个浏览器建立了100W个socket各进行一次http通讯,而QA测试的场景是 50个浏览器建立了50个socket,并在每个socket上进行了2W次http通讯。在此过程中,绝大多数socket的建立过程被舍弃了,这就说明了为什么QA的测试用例没有遇到socket耗尽的问题,也说明了为什么我写的简单的SocketServer吞吐量还不如QA给出的指标(这种应用下建立socket的开销可能比逻辑本身开销还要大)。

 

总结一下目前为止的结论:

1) 对于压力很大的Server,最好是打开tcp_tw_reuse,以免Server主动关闭的连接不能及时重用

2) 若要真正模拟线上的情景,还是应该用多台机器,每次都新建并关闭连接。尤其是对于这种逻辑简单的http应用,少量肉鸡大量线程客户端不关闭连接的测试方式远不如大量肉鸡少量客户端连接关闭的方式结果准确

 

<!--EndFragment-->
5
2
分享到:
评论
4 楼 Shen.Yiyang 2014-05-09  
iamlotus 写道
Shen.Yiyang 写道
大量测试机器,每台机器少量短连接,确实更符合实际的HTTP客户端场景。但是对测试服务端的吞吐能力来说,区别不大。吞吐主要有两个方面,针对大量连接的IO,针对大量请求引发的业务处理。对前者,可以加大测试机中的长连接数量,对后者,可以加快测试机中的请求频率。 一定要用短连接做测试的话,本身的操作性是挺差的。
实际上这个系统既有长连接也有短连接。对于长短连接需要不同的测试场景,而对于短连接来说,在后端逻辑非常简单的情况下,单纯通过“加快测试机中的请求频率”得到的吞吐量意义不大啊。

我已经说了,吞吐还包括大量连接情况下的IO。短连接影响的是连接数量,其他方面对服务器的压力没太大差异。
3 楼 iamlotus 2014-05-09  
Shen.Yiyang 写道
大量测试机器,每台机器少量短连接,确实更符合实际的HTTP客户端场景。但是对测试服务端的吞吐能力来说,区别不大。吞吐主要有两个方面,针对大量连接的IO,针对大量请求引发的业务处理。对前者,可以加大测试机中的长连接数量,对后者,可以加快测试机中的请求频率。 一定要用短连接做测试的话,本身的操作性是挺差的。
实际上这个系统既有长连接也有短连接。对于长短连接需要不同的测试场景,而对于短连接来说,在后端逻辑非常简单的情况下,单纯通过“加快测试机中的请求频率”得到的吞吐量意义不大啊。
2 楼 iOracleSun 2014-05-08  
TPS和并发连接数不是同一个概念,从你们的需求来看,QA并没有错,只是将并发连接数设置为50而已。
1 楼 Shen.Yiyang 2014-05-08  
大量测试机器,每台机器少量短连接,确实更符合实际的HTTP客户端场景。但是对测试服务端的吞吐能力来说,区别不大。吞吐主要有两个方面,针对大量连接的IO,针对大量请求引发的业务处理。对前者,可以加大测试机中的长连接数量,对后者,可以加快测试机中的请求频率。 一定要用短连接做测试的话,本身的操作性是挺差的。

相关推荐

    StressMark压力测试软件

    StressMark测试软件是一个使用Visual C++编写的,开放源代码的测试工具,可以完成服务程序及重要算法的功能和性能测试,其最主要的功能是模拟多线程或多客户端的自动化压力测试。 我们可以利用StressMark软件完成的...

    几个linux服务器性能测试工具,服务器压力测试

    而且dstat支持即时刷新, 譬如输入dstat 3, 即每三秒收集一次, 但最新的数据都会每秒刷新显示. 和sysstat相同的是, dstat也可以收集指定的性能资源, 譬如 dstat -c 即显示CPU的使用情况. 下载安装文件dstat-0.6.7-1....

    VC WinSocket2完成端口+压力测试

    1、SocketTest为用完成断开+重叠IO技术实现的服务端,创建一个线程统一处理多个客户端连线,可以显示客户端IP地址和端口号,客户端正常断线能检测到,在开发及其上,8代I3+16G内存+WIN10的系统,开一个线程一次连线...

    jmeter压力测试

    Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域。 它可以用于测试静态和动态资源,例如静态文件、Java 小服务程序、CGI ...

    DNS压力测试工具安装使用.docx

    在bind中,有一款自带的压力测试软件,queryperf。使用这款软件可以对DNS服务器作请求测试,并且使用方法简单,我们可以使用queryperf测试多次,取一个平均值,这样就算结果不准确,也不会和实际情况相差太大。

    2、网站压力测试报告.doc

    负载场景测试:用户并发达到50人,每天的下单量超过6万次,本次测试的模块中,没有出现错误,但是在详情查看功能中,由于要加载网络资源,导致页面响应时间超过10s,需要开发人员进行优化,其他性能指标正常;...

    TestMem5内存条超频压力测试配置文件汇总anta777

    TestMem5内存压力测试软件及配置文件 (best configs)包含各类测试cfg extreme777低中高 ollie等一应俱全用管理员模式跑,如果看到日志框中出现文字:Customize: Extreme1 @anta777则加载成功配置文件过测难度(32G):...

    StressMark压力测试程序

    StressMark测试软件是一个使用Visual C++编写的,开放源代码的测试工具,可以完成服务程序及重要算法的功能和性能测试,其最主要的功能是模拟多线程或多客户端的自动化压力测试。 我们可以利用StressMark软件完成的...

    一个完整的压力测试脚本

    知识领域:使用Jmeter脚本,编写线程组、仅一次控制器(登录)、http请求、查看结果树、查看响应时间等组件,组成一个完整的压力测试脚本。 技术关键词:Jmeter、Java、JSON

    TCPSocket与Websocket互通压力测试工具

    如果架设ws服务器,设置方法总结(阿里云服务器举例,作为服务器...测试多次) 3、外部客户端必须连接服务端的公网地址。 4、注意修改,一处不对整个通道无法正常通讯!!!测试多少次才总结出来的!!!!!分享!!!

    Monkey做app压力测试常用的命令

    Monkey是Android SDK提供的一个命令行工具,可以简单方便的发送伪随机的用户事件流,对Android APP做压力(稳定性)测试。主要是为了测试app是否存在无响应和崩溃的情况。

    使用MicrosoftWebApplicationStressTool对web进行压力测试

    北京火龙果软件工程技术中心Web压力测试是目前比较流行的话题,利用Web压力测试可以有效地测试一些Web服务器的运行状态和响应时间等等,对于Web服务器的...下面我就带大家利用微软的WebApplicationStress进行一次Web

    j2ee性能调优之最小化资源压力测试法则

    摘要:我提倡使用最小化资源的方式做一次压力测试,排除大部分浅显的应用问题。最小资源的意思,即在pc环境,使用应用可以运行的最小资源状态下,进行压力测试和性能问题侦测的工作。

    如何做云端压力测试和业务容量的测试与规划

    云智慧有个做旅游和摄影服务平台的客户要举办一次活动,为本次活动制作了专门的活动页面,在活动页面用户可以报名。那么在短时间内系统到底能撑得住多大的用户并发?这是活动运营和技术部门必须提前考虑的问题,

    tcp 交易压力测试程序 守护进程

    本程序是由于但是开发需要...所发送数据buf的大小,如果直接一次调用send来发送数据而没有实现通过setsockopt 设置发送缓冲区大小,可能跨平台对方无法收到你的全部数据。 还有就是注意aix,HP linux下面头文件的区别哦

    服务器下载并发数测试(并发下载文件)

    该程序是为自己项目写的一个测试性能的小程序。 主要通过对服务器下载文件的并发响应进行统计。 使用多线程对服务器提供的链接地址下载文件, 能统计出并发情况下的下载速度,请不要开辟开多线程,以免导致服务器受...

    loadrunner压力测试APP

    本文从原理与细节上详细介绍一下loadrunner录制APP脚本,在这...我将我的服务器tomcat与loadrunner12都是放在一台本地PC机上,因为仅是脚本录制,所以无所谓,等真正压力测试的时候只需要修改一下服务器端与IP即可。

    软件测试经典题目汇总4

    或一次性向服务器发送特别大的数据等。看看服务器保持正常运行所能达到的最 大状态。人们通常使用测试工具来完成压力测试,如模拟上万个用户从终端同时登录,这是 压力测试中常常使用的方法。 负载测试(Volume ...

    如何编写单元测试用例(白盒测试)

    火龙果软件工程技术中心 前段时间公司进行有关测试的培训,集成测试,性能测试,压力测试说了很多。由于本人还处于Coder阶段,只是对单元测试有了些了解。写下来怕以后自己忘记了。都是些自己的看法,不一定准确,...

    AndroidApp压力测试方法(Monkey)

    3.3MonkeyScript测试命令集合介绍3.4异常测试结果分析4.1一次AndroidApp的压测实践需要准备的环境:1.AndroidSDK环境;2.python环境压测过程:Step1.Step2.Step3.Step4.Step5.Step6.4.2Monkey高级参数——throttle...

Global site tag (gtag.js) - Google Analytics