转:https://testerhome.com/topics/4225
0.背景
组内需要一款轻量级的性能测试工具,之前考虑过LR(太笨重,单实例,当然它的地位是不容置疑的),阿里云的PTS(, 仅支持阿里云内网和公网机器),Gatling()没有TPS数据等等,不太适合我们。
nGrinderr是NAVER(韩国最大互联网公司NHN旗下搜索引擎网站)开源的性能测试工具,直接部署成web服务,支持多用户使用,可扩展性好,可自定义plugin(),wiki文档较丰富(),数据及图形化展示满足需求;但是展示的统计数据较简单,二次开发整合数据:TPS标准差,TPS波动率,最小/大RT,RT 25/50/75/80/85/90/95/99百分位数字段,并将这些数据展示在详细测试报告页中。
1.项目剖析
1-1. nGrinder架构
nGrinder是一款在一系列机器上执行Groovy或JPython测试脚本的应用,内部引擎是基于Grinder。
架构图:
层级图:
默认的NGRINDER_HOME为/root/.ngrinder, 大多是配置文件和数据文件。
目录/root/.ngrinder/perftest/0_999下,以每个test_id为名的文件夹对应的存储了执行性能测试时的采样数据:
*.data文件就是执行性能测试时对应的各种性能采样数据,性能测试详细报告页就是根据这些data文件,进行图形化展示(ajax)。
nGrinder包含2大组件:
1)Controller为性能测试提供web interface协同测试进程收集和显示测试数据新建和修改脚本2)Agent
agent mode: 运行进程和线程,压测目标服务monitor mode: 监控目标系统性能(cpu/memory), 可以自定义收集的数据(比如 jvm数据)1-2. 技术栈
1)Controller 层
FreeMarker: 基于Java的模板引擎Spring SecuritySpring Mvc:Spring MVC provides rich functionality for building robust web applications.GSonSVNKit Dav2)Service 层
GrinderSpringEhCache: Ehcache has excellent Spring integration.3)Data层
Spring DataHibernate:Hibernate is a powerful technology for persisting data,and it is Spring Data back-end within nGrinder. H2: (nGrinder默认使用该DB)Cubrid:(nGrinder同一家公司的DB)Liquidase: Liquibase is an open source that automates database schema updates. SVNKit2.源码实现
需求:在详细测试报告页中展示TPS标准差,TPS波动率,最小/大RT,RT 25/50/75/80/85/90/95/99百分位数这些数据。
修改Controller层,增加数据处理业务逻辑(计算TPS标准差,TPS波动率,最小/大RT,RT 25/50/75/80/85/90/95/99百分位数)
在获取采样数据
ngrinder-core/src/main/java/net/grinder/SingleConsole.java中新增处理业务逻辑,核心修改代码片段:// tps list Listtps = new CopyOnWriteArrayList (); // rt list List meanTestTime = new CopyOnWriteArrayList (); /** * * 每次请求调用一次 Build up statistics for current sampling. * * @param accumulatedStatistics * intervalStatistics * @param intervalStatistics * accumulatedStatistics */ protected void updateStatistics(StatisticsSet intervalStatistics, StatisticsSet accumulatedStatistics) { Map result = newHashMap(); result.put("testTime", getCurrentRunningTime() / 1000); List