使用YCSB測試mongodb

来源:http://www.cnblogs.com/SailorXiao/archive/2016/08/26/5808828.html
-Advertisement-
Play Games

項目裡面需要對mongodb的性能進行測試,看了下網上很多做法都是使用YCSB進行測試,因此開始學習使用YCSB。 參考資料: 1 安裝 基於參考文檔(https://github.com/brianfrankcooper/YCSB/tree/master/mongodb )安裝java,mvn,y ...


項目裡面需要對mongodb的性能進行測試,看了下網上很多做法都是使用YCSB進行測試,因此開始學習使用YCSB。 

參考資料:

  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目錄如下:

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裡面構造測試需要的數據,如:

./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實現

參數設置:

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舉例子 
基礎配置:

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配置,如下:

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函數實現
如下:
原來的實現:
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;
    }
}
修改後:
public final int update(final String table, final String key, final HashMap<String, ByteIterator> values) {
// 對原來的update函數做修改,在每次update時都多做幾次操作
int ret = updateOneTable(table, key, values);
if (ret != 0) {
return ret;
}

for (int i = 0; i < TABLE_NUM; ++i) {
String tableName = table + String.valueOf(i);
ret = updateOneTable(tableName, key, values);
if (ret != 0) {
return ret;
}
}

return 0;
}

public final int updateOneTable(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;
}
}

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 轉載請註明出處:http://www.cnblogs.com/Joanna-Yan/p/5802146.html 問題描述: 在項目中Activity A中嵌套Fragment B,Fragment B中再嵌套Fragment C,如圖: 問題1:在點擊Activity A中主菜單1進行切換時,報錯 ...
  • 1.補間動畫(Tween) 分類:縮放scale、位移translate、旋轉rotate、透明度改變alpha 步驟:1.定義動畫;2.載入動畫;3.啟動動畫 ...
  • 1.在java代碼中 (SplashActivity繼承AppCompatActivity時無效) 2.在manifest.xml中改Theme 3.先在style.xml中自定義style 再在manifest.xml中引用 ...
  • Android Weekly issue #219, 筆記. ...
  • 一:首先查看一下關於UIButton的定義 UIButton是繼承於UIControl,並且也遵循NSCoding的協議; 知識點1:關於UIControlState的Enum值 知識點2:contentHorizontalAlignment;可以設置UIButton文字的對齊方式,contentH ...
  • 改變顏色 [_hotProductsTableView setSeparatorColor : kSeparatorColor]; -(void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; if ([_hotProductsTable ...
  • 最近在Android手機開發中使用了ORM框架Sugar1.4,節省了大量代碼,同時也遇到不少麻煩,記錄如下: 1. 使用group by將查詢結果轉換為POJO對象 在Sugar1.4中,可以使用如下代碼將查詢結果轉換為POJO對象。 該方法會調用SugarRecord類的inflate方法,如下 ...
  • 表大小 慢的sql select a.city, a.agent_id, a.username, a.real_name, phone, zgy_name, login_count, user_count, count(distinct b.invest_id) user_invested, sum ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...