高手们开发程序,不仅是功能的实现,也是性能的保证。
性能保证最简单的方法,就是通过压力测试进行验证。
下面给大家介绍两款压力测试利器,只要花点时间,就能很快掌握上手,这两款工具分别是Apache的Ab和jMeter。
进行压力测试时所使用的机器最好能接近生产环境中机器的配置,一般单个主机CPU有4核左右,内存8G左右可以达到测试的要求,而其它互相通讯的主机、数据库服务等,都必须在同一个局域网内,这样能减少一些不必要的性能损耗。这样,一般测试TPS能达到4000左右或以上的就可以算通过了。
1.Ab测试
Ab是Apache应用服务器工具集中的一个专门用来进行Web应用测试的工具,在Linux系统中如果未安装Ab,可以使用如下方法进行安装:
yum -y install httpd-tools
使用Ab进行测试的几个常用参数:
-n 在一个测试中所执行的请求个数。
-c 每一次发送请求的个数,即并发数。
-t 测试时间,单位为秒。
-p 发送POST请求时设定数据文件的路径。
-T 发送请求可以设定Content-type等头部信息。
对于一般的Get请求,可以使用如下简单的方式进行,例如:
ab -t 60 -c 512 http://10.0.2.33:48001/stock/test
即在60秒中,以512个并发数,对http://10.0.2.33:48001/stock/test实施压力测试。
或者使用如下方式,跟上面效果差不多:
ab –n 50000 –c 512 http://10.0.2.33:48001/stock/test
即将上面的时间使用请求数来替代。
在测试过程中,可以查看被测试的主机的CPU和内存的变化,做为结果评估的参考。下列所示是上面测试方法中一次测试结果的主要部分:
Server Hostname: 10.0.2.33
Server Port: 48001
Document Path: /stock/test
Document Length: 595 bytes
Concurrency Level: 512
Time taken for tests: 12.963 seconds
Complete requests: 50000
Failed requests: 0
Write errors: 0
Requests per second: 3857.01 [#/sec] (mean)
Time per request: 132.745 [ms] (mean)
Time per request: 0.259 [ms] (mean, across all concurrent requests)
Transfer rate: 2689.36 [Kbytes/sec] received
其中,Failed requests为0,说明所有请求都是有效的,这样下面的结果才具有真实价值,否则可以通过调整并发数继续进行测试,直至不会出现错误为止。这些结果中比较有价值的是下面几个参数:
其中,Transfer rate为吞吐率,Requests per second为每秒完成的请求数,等同于QPS或TPS,这是一个最主要的性能指标。上面是程序中调用数据库进行查询访问的测试,TPS达到3857.01,即接近4000左右,说明处理性能还是可以的。
使用上面的测试方法,针对一个请求,可以多进行几遍,以取得一个平均结果。
Ab除了可以使用Get方法进行测试,同时也可以对Post请求方法进行测试,如下所示:
ab –t 60 -c 512-p post-data.txt -T 'application/json' http://localhost
其中,“post-data.txt”为一个Json结构的数据,必须存放在一个文件中让ab进行调用。下面是一个Json数据的例子:
{"key":"abcd","queryType":1,"sortType":1}
2.jMeter测试
jMeter是使用Java开发的,所以需要有JVM的支持,一般安装有JDK1.8或以上的版本就可以了。下载jMeter安装包,解压后即可使用。jMeter是一个专业的测试工具,对于上面Ab的测试,我们同样也可以使用jMeter进行测试,对于一个专业的测试工具来说,它可以提供功能更多的配置和更加精准的测试报告。
使用jMeter,首先必须创建一个测试计划,然后在测试计划中进行配置。现在我们参照上面Ab的测试实例,来配置一个具有同等程度的测试,然后对两种工具的测试结果进行比较。
首先运行jMeter来创建一个测试计划DemoTest Plan,然后,在测试计划之下创建一个线程组,如下图所示:
在这个线程组中,我们设置了如下各个参数:
线程数,即并发数设置为512,并在1秒内执行,循环次数设置为永远,表示无限次执行。然后在调度配置中,将持续时间设置为60秒。
接下来,在线程组中添加一个HTTP请求,如下图所示:
这里,我们使用了一个HTTP Request,默认使用HTTP协议,设定了测试目标IP为10.0.2.33,端口设置为48001,请求方法选择GET,在路径中输入/stock/test。
为了判断请求的成功与否,我们在这个请求中还可以添加一个报告断言,如下图所示:
因为访问这个请求成功时,将会返回如下所示的结果:
{"code":0,"msg":"成功","data":…}
所以我们将Response Assertion指定为"code":0。
完成上面配置后,将文件保存为:demo.jmx
这是一个XML文件,可以用浏览器或文本工具打开,或者直接使用vi进行编辑。
如下图所示,是上面一些配置参数保存后的结果:
使用这个文件,我们就可以使用如下所示的jMeter指令进行测试:
./bin/jmeter -n -t demo.jmx-l log.jtl
下图是上面测试指令执行之后的测试结果:
从测试报告中可以看出,所有请求没有出现错误,全部通过了。TPS也是在4000以上,比Ab测试的略高一点点,基本上是差不多的。
上面只是两种测试工具的简单使用方法,可以通过压力测试来快速验证程序的性能和稳定性。
领取专属 10元无门槛券
私享最新 技术干货