使用Ngrinder一段时间,发现ngrinder在分发文件的时候很慢,特别是当依赖包多的时候,亲测80多M(150个jar)的jar包分发到一台agent花了15分钟。
考虑怎么提高文件的分发速度提升下效率。
1. maven项目和普通的groovy项目一样,ngrinder会自动获取依赖包后分发到各个agent上,用原生java -jar方式运行程序。考虑用maven的command插件,修改ngrinder的命令行方式,然后在agent上部署maven local repository,最后distributefile的时候不发送依赖包这种方式。 改动量较大,还有个问题就是agent要deploy maven,麻烦。
2. ngrinder分发文件慢的主要原因是它分发的方式,特别是文件大小超过threshold的时候,使用safe distribute方式,该方式要求每次发一个文件到所有agent,等所有agent都接收到文件后再发第二个,中间还有些文件检查的耗时。考虑把分发文件压缩后再分发,分发到agent后解压在运行。后来使用这种方式比较方便。
具体实现:
singleConsole = startConsole(perfTest);
ScriptHandler prepareDistribution = perfTestService.prepareDistribution(perfTest);
GrinderProperties grinderProperties = perfTestService.getGrinderProperties(perfTest, prepareDistribution);
startAgentsOn(perfTest, grinderProperties, checkCancellation(singleConsole));
distributeFileOn(perfTest, checkCancellation(singleConsole));
singleConsole.setReportPath(perfTestService.getReportFileDirectory(perfTest));
runTestOn(perfTest, grinderProperties, checkCancellation(singleConsole));
从上面可以看出ngrinder运行的主要流程: 准备文件->准备properties文件->启动agent->分发文件->设置report路径->启动测试。
按压缩方案实现如下:
准备文件阶段,ngrinder把当前路径下的/lib jar包或者maven项目下 pom文件指定的依赖包拷贝到perftest目录下,我们在ngrinder准备好这些文件后压缩再把原来的文件删掉。