程序开发中的性能测试利器

高手们开发程序,不仅是功能的实现,也是性能的保证。

性能保证最简单的方法,就是通过压力测试进行验证。

下面给大家介绍两款压力测试利器,只要花点时间,就能很快掌握上手,这两款工具分别是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测试的略高一点点,基本上是差不多的。

上面只是两种测试工具的简单使用方法,可以通过压力测试来快速验证程序的性能和稳定性。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181019G178WR00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券