基于http请求的web接口性能测试总结
压测的目的:对于Web接口压测的目的最终是要在对数据库造成压力的情况下观察压测服务器的cpu是否达到预警值、memory是否发生激变甚至泄露、响应结果的error率以及数据库服务器读写方面的情况是否正常等等情况。
测试环境的准备
我们要准备压测服务器和压力机,并建立二者之间的联系。
压测服务器
用来提供服务的,也就是我们的测试服务器,上面发布的是压测分支,我们首先要基于压测基准分支拉一个压测分支并push到远端,然后把开发的代码合到压测分支上再push到远端,发布到压测服务器。一般来说,我们的压测服务器是单节点的tomcat,而线上环境往往是多台服务器组成的负载均衡集群。
压力机
压力机是用来提供压力的,我们通过jmeter来做并发。实际测试中,压力机可以选择本机,也可以选择压测服务器。
不同点是:本机有jmeter界面,测试结果很直观,而压测服务器上是没有ui的;
优缺点是:选择本机的优点就是压测结果展示方便,Windows图形化压测结果展示,但是缺点是本机到压测服务器之间的网络情况会影响压测结果的准确性。而在压测服务器上进行就不存在这个问题。
建立联系
在压力机上把hosts切换到压测环境上,这样就可以对压测环境进行加压。
测试数据的准备
对于数据库方面施加压力,我们是通过分析http请求,找出能够对数据库产生压力的参数(这个参数往往会被用于与数据库进行交互,比如进行增删改查),然后对参数进行mock,做出足够数据量和满足复杂度的参数,通过并发http请求的方式来间接对数据库施加压力。这是针对与参数来做数据,以便模拟足够多样的http请求。再就是我们会在数据库表中插入一定量的数据,以满足数据库方面的数据量要求,模拟现实情况下数据库表中的数据量。前者是针对用户行为做数据,后者是针对数据库现状进行模拟,二者共同为压测提供模拟数据支持。
压测脚本的准备
我们通过jmeter来制定压测计划,在jmeter中创建压测计划,添加线程组,然后在线程组中添加http请求、聚合报告、查看结果树、图形结果等。调试没问题,脚本可以跑通了,就可以对线程组设置线程属性(设置并发量),在调度器配置中设置好持续并发时间进行压力测试了。我们可以把本机做压力机,在本机切换hosts到压测环境进行压测。也可以把配置好的jmeter脚本连通jmeter文件夹一起打包zip文件发到压测linux服务器上,然后在自己的目录下“unzip jmeter.zip”,“cd”到解压后的目录下,“chmod 777 jmeter.sh”添加执行权限,然后“./jmeter.sh -n -t 你的压测.jmx -l result.jtl”来执行压测,压测结果会保存到result.jtl文件中,在当前目录下。我们可以在服务器执行压测过程中观察测试结果,也可以在测试结束后在linux服务器上查看与分析result.jtl文件(也可以通过“sz result.jtl”命令将文件下载到本机,具体的下载存放路径在SecureCRT的Options->Session Options->X/Y/Zmodem中设置)。实际的压测过程中,我们会不断修改线程数,更改并发量。随着并发线程数的增加,当平均响应时间开始显著增加而每秒的吞吐量近乎不变的时候,这个并发量所对应的每秒吞吐量就是瓶颈点所在。
压测过程中会遇到的问题
在压测过程中,可能会遇到“NoHttpResponseException (the target server failed to respond)”。这是由于jmeter自身设置的问题导致的,修改jmeter.properties中的httpclient4.retrycount和httpclient4.idletimeout值就可以了,然后修改jmeter中设置http请求继承自HttpClient4。
在压测过程中,可能会遇到“java.net.URISyntaxException: Illegal character in query at index xxx”,这可能是由于你对于http请求参数没有勾选编码造成的,解决办法如下: