分布式性能测试平台的设计与实现
一、背景
性能测试在我们现在的测试中可以说是必不可少的一环,通常我们使用压测工具 Jmeter 或 Loadrunner 来进行压测工作,然后使用各种监控工具对被压服务、数据库、中间件等组件进行监控,然后根据监控结果对各个组件进行分析和调优,最终达到性能测试的目的。
随着互联网的发展,各类软件系统用户量越来越多,系统的架构越来越复杂。性能测试方面来说,单台机器作为负载机已经不能满足我们的要求了,虽然 Jmeter 和 Loadrunner都能够进行分布式部署进行压测,但是部署和调试相对比较麻烦,对压测工具的版本、数据文件的构造和存放目录都有硬性的要求,一场性能测试下来,大量时间花在环境方面,真正性能测试执行、分析和调优的时间就被压缩,这样就得不偿失。
在这样的情况下,越来越多的公司开始研发自己的性能测试平台,它能够加快性能测试的执行。同时,还具备自动构造数据、监控目标服务、保存测试结果等优点,为我们后面的分析和调优工作进行了极大的辅助。
二、架构
什么是分布式性能测试平台:其实和我们使用 Jmeter 或 Loadrunner 进行分布式压测总体上是一样的,就是有一台调度机负责给多个压力机分配压测任务,收集压测结果和监控结果,然后把所有结果存入对应的数据库,最后通过页面把这些结果展示出来。下面我们来看一下下面这个架构:
从上面这个图可以看出,有三个关键模块:broker、worker、monitor,他们分别负责的功能如下:
broker
- 收集所有压力机信息,包括:IP、CPU、内存、磁盘、网卡等信息;
- 开始/停止压测请求,请求参数包括:线程数、循环次数、被测试Java类(case)
- 接收到请求后,调用sendTask/stopTask方法将请求以消息的形式发往各个压力机;
- 接收压力机上报的压测结果信息并存入数据库,包括:batchId、start_time、end_time、response_time和isSuccess,并存入数据库;
worker
- 接收broker下发的定时任务,然后调用JMeterEngine进行执行;
- 获取执行时间、是否成功等信息后将结果传回给broker;
- 上传worker机器性能指标到broker;
- 接收broker下发的停止任务并停止测试;
monitor
- 使用工具类(jna、jna-platform、oshi:oshi-core)获取监控信息,包括:CPU、内存、磁盘、网络等信息;
- 部署在worker机和被测服务所在机器,采用定时任务的方式隔几秒上传机器信息;
除了以上三个核心的模块外,还有一个核心模块,就是我们的测试 case 模块
- 所有case继承自AbstractJavaSamplerClient类,重写runTest()方法;
- 所有case应该包括数据的构造、请求的发送、结果的接收、时间的统计以及case执行成功与否的判断;
- 如果有读取配置文件、生成数据等前置操作可放在setupTest()方法中;
三、代码实现
地址:https://github.com/luolei001/Performance-testing-platform