ES性能測試


測試背景
 
  因為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語句如下:
 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 }
View Code

 

分析過程
 
這個例子中,要實現需求的目標,有1點需要注意,即時間段和車牌需要實現隨機,以避免查詢緩存造成的影響。
車牌的隨機,實現的方法很簡單,實現的思路是從數據庫中查詢出過車數最多的top 10W個車牌,使用參數化方式實現。

而對於時間的隨機,因為對於loadrunner中的日期函數並不了解,所以在度娘中輸入“loadrunner 日期”進行查詢,幸運的是第一篇文章就出現了有價值的信息(http://www.cnblogs.com/qmfsun/p/4563703.html) ,這里面提到了一個函數lr_save_datetime。到這里還不確定該函數是否可用,因為從文章中看來它取的是一個特定的時間點,而非我想要的一個時間段。 為了得到更多的信息,我查了一下LR的幫助文檔,得到的信息如下:

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 減去一個隨機數字不就行了嘛,就這么簡單竟然讓我苦惱了半下午,深深的對自己無語。。。

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");
View Code

最終完整的腳本是:

 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 }
View Code
搞定,收工!
 
 
說在后面的話
  等有時間准備跟搞C的同事聊一聊,LR里面很多時候需要用到C的東西,看看就這個問題上是否還有更好的解決思路。另外,歡迎來賜教對於這個問題你的解決思路,~~
 
歡迎加我個人的微信公眾號來交流:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM