【轉】使用YCSB測試mongodb

來源:互聯網
上載者:User

標籤:trie   ttl   中間   效能   檔案中   query   lan   order   github   

參考資料:

  1. YCSB github地址:https://github.com/brianfrankcooper/YCSB 
  2. wiki: https://github.com/brianfrankcooper/YCSB/wiki 
  3. 安裝參考:https://github.com/brianfrankcooper/YCSB/tree/master/mongodb 
  4. 之前的一些測試經驗:http://www.sdpnosql.net/index.php/archives/3/    http://www.sdpnosql.net/index.php/archives/13/
1 安裝

基於參考文檔(https://github.com/brianfrankcooper/YCSB/tree/master/mongodb )安裝java,mvn,ycsb 
基本上安裝了python(2.7.5版本以上),java(需要是jdk,而不是jre),mvn和ycsb之後就可以了

1.1 YCSB目錄結構

安裝好YCSB之後,查看YCSB目錄如下:

1234567891011121314151617181920212223242526272829303132 drwxr-xr-x. 3 root root   30 Oct 10 18:20 accumulodrwxr-xr-x. 3 root root   46 Oct 10 18:20 aerospikedrwxr-xr-x. 2 root root   17 Oct 13 05:03 bindrwxr-xr-x. 3 root root   56 Oct 10 18:20 binding-parent-rw-r--r--. 1 root root  877 Oct 10 18:20 BUILDdrwxr-xr-x. 3 root root   30 Oct 10 18:20 cassandra-rw-r--r--. 1 root root 7216 Oct 10 18:20 checkstyle.xmldrwxr-xr-x. 4 root root   60 Oct 13 03:18 coredrwxr-xr-x. 3 root root   46 Oct 10 18:20 couchbasedrwxr-xr-x. 3 root root   30 Oct 10 18:20 distributiondrwxr-xr-x. 4 root root 4096 Oct 10 18:20 docdrwxr-xr-x. 4 root root   54 Oct 10 18:20 dynamodbdrwxr-xr-x. 3 root root   46 Oct 10 18:20 elasticsearchdrwxr-xr-x. 3 root root   30 Oct 10 18:20 gemfiredrwxr-xr-x. 2 root root   36 Oct 10 18:20 hbase094drwxr-xr-x. 3 root root   46 Oct 10 18:20 hbase098drwxr-xr-x. 3 root root   46 Oct 10 18:20 hbase10drwxr-xr-x. 3 root root   43 Oct 10 18:20 hypertabledrwxr-xr-x. 3 root root   46 Oct 10 18:20 infinispandrwxr-xr-x. 3 root root   30 Oct 10 18:20 jdbc-rw-r--r--. 1 root root 8082 Oct 10 18:20 LICENSE.txtdrwxr-xr-x. 3 root root   43 Oct 10 18:20 mapkeeperdrwxr-xr-x. 4 root root   59 Oct 13 03:19 mongodbdrwxr-xr-x. 3 root root   43 Oct 10 18:20 nosqldb-rw-r--r--. 1 root root  479 Oct 10 18:20 NOTICE.txtdrwxr-xr-x. 3 root root   46 Oct 10 18:20 orientdb-rw-r--r--. 1 root root 5263 Oct 10 18:20 pom.xml-rw-r--r--. 1 root root 2033 Oct 10 18:20 README.mddrwxr-xr-x. 3 root root   46 Oct 10 18:20 redisdrwxr-xr-x. 3 root root   46 Oct 10 18:20 tarantooldrwxr-xr-x. 3 root root   30 Oct 10 18:20 voldemortdrwxr-xr-x. 2 root root 4096 Oct 13 01:09 workloads

這裡面有幾個目錄需要注意下:

bin:    - 目錄下有個可執行檔ycsb檔案,是個python指令碼,是使用者操作的命令列介面。ycsb主邏輯是:解析命令列、設定java環境,載入java-libs,封裝成可以執行的java命令,並執行workloads:    - 目錄下有各種workload的模板,可以基於workload模板進行個人化修改core:    - 包含ycsb裡各種核心實現,比如DB的虛擬類DB.java,各個db子類都要繼承該類;還有比如workload抽象類別,如果我們要自訂workload實現也需要繼承該類各種DB的目錄:    - 比如mongo,redis等,裡麵包含了對應測試的源碼等。    - 當ycsb mvn編譯後,會在對應的目錄下產生target檔案,ycsb會載入對應target檔案中的class類
2 使用

ycsb在執行的時候,分為兩階段:load階段 和 transaction階段

2.1 load階段

該階段主要用於構造測試資料,ycsb會基於參數設定,往db裡面構造測試需要的資料,如:

1 ./bin/ycsb load mongodb-async -s -P workloads/workloada > outputLoad.txt
mongodb-async

在ycsb中,對於不同的db都有一些選項,比如mongo就有mongodb 和 mongodb-async。 
預設的mongodb表示同步,即load和run使用同步的方式,ycsb會調用mongodb/src底下對應的MongodbClient實現對應的insert/update等操作。如果設定了mongodb-async,ycsb會調用mongodb/src底下對應的AsyncMongoDbClient.java實現

參數設定:

12345678 Options:    -P file        Specify workload file // workload檔案    -cp path       Additional Java classpath entries    -jvm-args args Additional arguments to the JVM    -p key=value   Override workload property // 一些設定    -s             Print status to stderr // 把狀態達到stderr中    -target n      Target ops/sec (default: unthrottled) // 每秒總共操作的次數    -threads n     Number of client threads (default: 1) // 用戶端線程數

參數解讀:

-P workload檔案

在ycsb的目錄下有多種workload,參考:https://github.com/brianfrankcooper/YCSB/wiki/Core-Workloads,我們以workloada舉例子 
基礎配置:

123456789101112 recordcount=1000     # 總共的操作條數operationcount=1000  # 總共操作的次數workload=com.yahoo.ycsb.workloads.CoreWorkload= readallfields=true  # 在讀取的時候,是否需要讀取所有欄位 readproportion=0.5  # 讀取比例updateproportion=0.5 # update比例scanproportion=0insertproportion=0 requestdistribution=zipfian

workloada的負載比較中,read和update類比例為1:1,裡面一些設定參數如上,如果我們再設定mongo的時候,還需要再workload中增加對應的mongo配置,如下:

123 mongodb.url=mongodb://192.168.137.10:34001/ycsb?  # mongodb對應的uri等mongodb.database=ycsb # 對應的dbmongodb.writeConcern=normal # 寫層級
-p選項

-p用於設定一些對應的參數,如果workload中的參數,也可以以-p的方式放在命令列中設定

-s

-s是表示,在運行中,把一些狀態列印到stderr中,一般status資訊,用於表示在運行中的一些中間狀態(比如當前處理了多少請求,還有多少請求等)

-target n

表示1s中總共的操作次數(各個線程加起來的),如果效能不滿足,比如最高效能只有100,你設定了1000,那麼ycsb會盡量往這個數目去靠近。預設是不做限制

-thread 線程數

設定ycsb client的並發測試線程數,預設是1,單線程,所以再測試的時候,一定要設定這個選項

2.2 transcation階段

在2.1load資料結束之後,ycsb就可以進行測試了,也就是transaction階段。在transaction階段,會基於workload中的比例設定,和線程參數設定進行db的壓測。具體參數如上

3 一些自訂動作

由於這次在使用ycsb測試mongodb中主要是為了測試mongodb3.0的效能,同時需要和2.6.9進行對比。而3.0效能寫效能大幅度提升是因為鎖力度從db鎖定擴大到collection鎖。而預設的insert、update操作都是對於同一個collection操作(usertable),沒法體現這個優勢。 
因此我們需要修改對應的insert、update和read介面實現一次性寫多個db。修改如下:

修改mongodb底下的MongoDbClient和AsyncMongoDbClient中關於insert、update、read函數實現如下:原來的實現:
12345678910111213141516171819 public final int update(final String table, final String key,  final HashMap<String, ByteIterator> values) {    try {      final MongoCollection collection = database.getCollection(table);      final DocumentBuilder query = BuilderFactory.start().add("_id", key);      final DocumentBuilder update = BuilderFactory.start();      final DocumentBuilder fieldsToSet = update.push("$set");       for (final Map.Entry<String, ByteIterator> entry : values.entrySet()) {        fieldsToSet.add(entry.getKey(), entry.getValue().toArray());      }      final long res =          collection.update(query, update, falsefalse, writeConcern);      return res == 1 ? 0 : 1;    } catch (final Exception e) {      System.err.println(e.toString());      return 1;    }}
修改後:
1 public final int update(final String table, final String key, final HashMap<String, ByteIterator> values) {<br>    // 對原來的update函數做修改,在每次update時都多做幾次操作<br>    int ret = updateOneTable(table, key, values);<br>    if (ret != 0) {<br>        return ret;<br>    }<br>    <br>    for (int i = 0; i < TABLE_NUM; ++i) {<br>        String tableName = table + String.valueOf(i);<br>        ret = updateOneTable(tableName, key, values);<br>        if (ret != 0) {<br>            return ret;<br>        }<br>    } <br>    <br>    return 0; <br>} <br><br>public final int updateOneTable(final String table, final String key, final HashMap<String, ByteIterator> values) {<br>    try { <br>        final MongoCollection collection = database.getCollection(table);<br>        final DocumentBuilder query = BuilderFactory.start().add("_id", key);<br>        final DocumentBuilder update = BuilderFactory.start();<br>        final DocumentBuilder fieldsToSet = update.push("$set");<br>        <br>        for (final Map.Entry<String, ByteIterator> entry : values.entrySet()) { <br>            fieldsToSet.add(entry.getKey(), entry.getValue().toArray()); <br>        }<br> <br>        final long res = collection.update(query, update, false, false, writeConcern);<br>        return res == 1 ? 0 : 1; <br>    } catch (final Exception e) {<br>        System.err.println(e.toString()); return 1; <br>    } <br>}

其中TABLE_NUM可以根據實際需求進行設定(實際中,我們設定了該值為4,表示一次寫5個table)

 

 

 

 

[OVERALL], RunTime(ms), 704740.0 #執行時間
[OVERALL], Throughput(ops/sec), 1418.9630218236514#每秒運算元,輸送量
[CLEANUP], Operations, 100.0
[CLEANUP], AverageLatency(us), 279.56
[CLEANUP], MinLatency(us), 0.0
[CLEANUP], MaxLatency(us), 27823.0
[CLEANUP], 95thPercentileLatency(us), 2.0
[CLEANUP], 99thPercentileLatency(us), 18.0
[INSERT], Operations, 50147.0#insert運算元
[INSERT], AverageLatency(us), 69745.87736055996#insert平均操作時間
[INSERT], MinLatency(us), 461.0#insert 最小操作時間
[INSERT], MaxLatency(us), 3080191.0#insert 最大操作時間 
[INSERT], 95thPercentileLatency(us), 138623.0#insert 95%操作時間
[INSERT], 99thPercentileLatency(us), 150911.0#insert 99%操作時間
[INSERT], Return=OK, 50147#insert 操作成功數
[READ], Operations, 949853.0
[READ], AverageLatency(us), 70395.02938033569
[READ], MinLatency(us), 262.0
[READ], MaxLatency(us), 3135487.0
[READ], 95thPercentileLatency(us), 138751.0
[READ], 99thPercentileLatency(us), 151039.0
[READ], Return=OK, 675134
[READ], Return=NOT_FOUND, 274719

【轉】使用YCSB測試mongodb

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.