標籤:trie ttl 中間 效能 檔案中 query lan order github
參考資料:
- YCSB github地址:https://github.com/brianfrankcooper/YCSB
- wiki: https://github.com/brianfrankcooper/YCSB/wiki
- 安裝參考:https://github.com/brianfrankcooper/YCSB/tree/master/mongodb
- 之前的一些測試經驗: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 accumulo drwxr-xr-x. 3 root root 46 Oct 10 18:20 aerospike drwxr-xr-x. 2 root root 17 Oct 13 05:03 bin drwxr-xr-x. 3 root root 56 Oct 10 18:20 binding-parent -rw-r--r--. 1 root root 877 Oct 10 18:20 BUILD drwxr-xr-x. 3 root root 30 Oct 10 18:20 cassandra -rw-r--r--. 1 root root 7216 Oct 10 18:20 checkstyle.xml drwxr-xr-x. 4 root root 60 Oct 13 03:18 core drwxr-xr-x. 3 root root 46 Oct 10 18:20 couchbase drwxr-xr-x. 3 root root 30 Oct 10 18:20 distribution drwxr-xr-x. 4 root root 4096 Oct 10 18:20 doc drwxr-xr-x. 4 root root 54 Oct 10 18:20 dynamodb drwxr-xr-x. 3 root root 46 Oct 10 18:20 elasticsearch drwxr-xr-x. 3 root root 30 Oct 10 18:20 gemfire drwxr-xr-x. 2 root root 36 Oct 10 18:20 hbase094 drwxr-xr-x. 3 root root 46 Oct 10 18:20 hbase098 drwxr-xr-x. 3 root root 46 Oct 10 18:20 hbase10 drwxr-xr-x. 3 root root 43 Oct 10 18:20 hypertable drwxr-xr-x. 3 root root 46 Oct 10 18:20 infinispan drwxr-xr-x. 3 root root 30 Oct 10 18:20 jdbc -rw-r--r--. 1 root root 8082 Oct 10 18:20 LICENSE.txt drwxr-xr-x. 3 root root 43 Oct 10 18:20 mapkeeper drwxr-xr-x. 4 root root 59 Oct 13 03:19 mongodb drwxr-xr-x. 3 root root 43 Oct 10 18:20 nosqldb -rw-r--r--. 1 root root 479 Oct 10 18:20 NOTICE.txt drwxr-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.md drwxr-xr-x. 3 root root 46 Oct 10 18:20 redis drwxr-xr-x. 3 root root 46 Oct 10 18:20 tarantool drwxr-xr-x. 3 root root 30 Oct 10 18:20 voldemort drwxr-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=0 insertproportion=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 # 對應的db mongodb.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, false , false , 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