前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ES性能测试笔记

ES性能测试笔记

作者头像
张树臣
发布2018-05-15 15:30:35
1.6K0
发布2018-05-15 15:30:35
举报

测试背景

因为ES(ElasticSearch)前段时间查询效率有点慢,技术小组对索引做了一些改动,因此需要测试一下修改后的查询效率,跟之前的结果做一下对比,所以有了这次测试。

需求简述

本文主要是分享一下我做测试的一些过程和思考,这里的需求不理解不影响阅读下文。

  1. 只测试通过车辆查询的一种场景,不考虑二次识别。
  2. 测试基础数据为近一年的数据(76亿左右)。测试的时段选择(一周、半月、一月、三月、半年、一年及全部数据)
  3. 测试的卡口选择全部。
  4. 测试的号牌号码为此前根据过车数量获取的前100000条数据中随机抽取,另外,90%的查询为有号牌查询,10%的查询为无号牌查询。
  5. 未对车道和方向进行过滤。
  6. 测试时没有同时进行插入操作。

用表来描述就是:

准备工作

需要跟技术小组提供在ES中查询用到的jquery语句。

在ES中查询车牌鲁B8070K在2016-09-13T00:20:44.000Z", --2016-09-14T00:20:44.000Z"内的过车数据,使用的jquery语句如下:

代码语言:javascript
复制
 1 { 
 2   "query": { 
 3     "bool": { 
 4       "must": [ 
 5         { 
 6           "range": { 
 7             "t_pass_data.insertTime": { 
 8               "from": "2016-09-13T00:20:44.000Z", 
 9               "to": "2016-09-14T00:20:44.000Z"
10             }   
11           }       
12         }        
13       ],      
14       "must_not": [],
15       "should": []
16     }    
17   },  
18   "filter": {
19     "bool": {
20       "must": [
21         {        
22           "term": {
23             "t_pass_data.plateNumNond": "鲁B8070K"
24           }          
25         }        
26       ]      
27     }    
28   },  
29   "from": 0,
30   "size": 10,
31   "sort": [
32     {
33       "snapTime": {
34         "order": "desc"
35       }      
36     }    
37   ],  
38   "facets": {}
39 }

分析过程

这个例子中,要实现需求的目标,有1点需要注意,即时间段和车牌需要实现随机,以避免查询缓存造成的影响。

车牌的随机,实现的方法很简单,实现的思路是从数据库中查询出过车数最多的top 10W个车牌,使用参数化方式实现。

而对于时间的随机,因为对于loadrunner中的日期函数并不了解,所以在度娘中输入“loadrunner 日期”进行查询,幸运的是第一篇文章就出现了有价值的信息(http://www.cnblogs.com/qmfsun/p/4563703.html) ,这里面提到了一个函数lr_save_datetime。到这里还不确定该函数是否可用,因为从文章中看来它取的是一个特定的时间点,而非我想要的一个时间段。 为了得到更多的信息,我查了一下LR的帮助文档,得到的信息如下:

代码语言:javascript
复制
In the following example, lr_save_datetime retrieves tomorrow's date.
lr_save_datetime("Tomorrow is %B %d %Y", DATE_NOW + ONE_DAY, "next");
lr_output_message(lr_eval_string("{next}"));
If today is January 7th, 1999, these lines will return the message: Tomorrow is January 08 1999.

信息还是不够, 又找度娘问了一下这个函数的用法,找到了这一篇:http://www.cnblogs.com/qmfsun/p/4561705.html

这文章里有这样一句话: lr_save_datetime将当前日期和时间,或具有指定偏移的日期和时间保存在参数中。看到这里,我明白问题已经解决了一半了,即如果定义了一个“开始时间”,可以使用这个函数偏移量的设置方法得到一个结束时间。那么怎么得到开始时间呢?并且让它是在一年内随机的一个时间点?

刚开始我想的是两条路:第一条是定义几个随机数字,然后组合成日期时间的格式,这种方法后来因为没找到怎么组合而放弃; 第二条路是利用 lr_save_datetime(const char *format, int offset, const char *name) 这个函数,只是把里面的offset 用一个随机的日期来替换(上面的两个链接中,这个offset用的都是DATE_NOW),后来也因为没找到替换的对象而失败。。。这个问题纠结了一下午,后来在吃饭的时候忽然灵光一闪想到了解决方法, 同时也对自己半下午的努力苦笑连连——只要在这个函数中,用DATE_NOW 减去一个随机数字不就行了嘛,就这么简单竟然让我苦恼了半下午,深深的对自己无语。。。

代码语言:javascript
复制
1 int mon,day,hour; //定义时间变量
2 mon=atoi( lr_eval_string("<mon>"));//0-6
3 day=atoi( lr_eval_string("<day>"));//1-30
4 hour=atoi( lr_eval_string("<hour>"));//1-24
5 //随机取半年内的一个时间作为结束时间
6 lr_save_datetime("随机结束时间: %Y-%m-%dT%H:%M:%S", DATE_NOW-mon*day*hour*(ONE_HOUR), "endDate");
7 //计算出一周前时间作为开始时间
8 lr_save_datetime("随机开始时间: %Y-%m-%dT%H:%M:%S", DATE_NOW-mon*day*hour*(ONE_HOUR)-15*ONE_DAY, "beginDate");

最终完整的脚本是:

代码语言:javascript
复制
 1 Action() 
 2 { 
 3     //随机半个月 的过车数据查询,无车牌 ,全部卡口,不考虑车道、方向 
 4     int  mon,day,hour; //定义时间变量 
 5     mon=atoi( lr_eval_string("<mon>"));//0-6 
 6     day=atoi( lr_eval_string("<day>"));//1-30 
 7     hour=atoi( lr_eval_string("<hour>"));//1-24 
 8     //随机取半年内的一个时间作为结束时间 
 9     lr_save_datetime("随机结束时间: %Y-%m-%dT%H:%M:%S", DATE_NOW-mon*day*hour*(ONE_HOUR), "endDate"); 
10     //计算出一周前时间作为开始时间
11     lr_save_datetime("随机开始时间: %Y-%m-%dT%H:%M:%S", DATE_NOW-mon*day*hour*(ONE_HOUR)-15*ONE_DAY, "beginDate");
12
13     //lr_output_message("%s",lr_eval_string("<beginDate>")); //打印开始时间
14     //lr_output_message("%s",lr_eval_string("<endDate>")); //打印结束时间
15 
16 
17     lr_rendezvous("rendezvous");//插入集合点
18 
19     lr_start_transaction("无车牌查询");    //插入事务 
20 
21 
22     web_reg_find("Text=dataSource",     //插入检查点
23         "Search=Body",
24         LAST );
25 
26     web_url("www.abc.com", //主节点为7和9, 数据节点27
27             
28     
29         "URL=http://IP:PORT/_search?{%22query%22:{%22bool%22:{%22must%22:[{%22range%22:{%22t_pass_data.insertTime%22:{%22from%22:%22<beginDate>.000Z%22,%22to%22:%22<endDate>.000Z%22}}}],%22must_not%22:[],%22should%22:[]}},%22filter%22:{%22bool%22:{%22must%22:[]}},%22from%22:0,%22size%22:10,%22sort%22:[{%22snapTime%22:{%22order%22:%22desc%22}}],%22facets%22:{}}", 
30     
31         "TargetFrame=", 
32     
33         //"TargetBrowser=Mercury Technologies", 
34     
35         "Resource=0", 
36     
37         "RecContentType=application/json; charset=UTF-8", 
38     
39         "Snapshot=t1.inf", 
40     
41         "Mode=HTML", 
42     
43         LAST ); 
44 
45 
46 
47     lr_end_transaction("无车牌查询", LR_AUTO);
48 
49 
50 //打印出使用的车牌号码
51 //lr_output_message( "using CAR #%s",lr_eval_string( "<CarNumber>" )); 
52     return 0;
53 }

搞定,收工!

说在后面的话

等有时间准备跟搞C的同事聊一聊,LR里面很多时候需要用到C的东西,看看就这个问题上是否还有更好的解决思路。另外,欢迎来赐教对于这个问题你的解决思路,~~

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-12-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 软件测试经验与教训 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档