YCSB效能測試工具使用

五柳-先生發表於2016-02-27

在網上查In-Memory NoSQL效能測試的資料時,偶然間發現了這個效能測試工具YCSB,全稱為“Yahoo! Cloud Serving Benchmark”。它內建了對常見NoSQL資料庫和資料網格產品的支援,如CassandraMongoDBHBaseRedisInfinispan等等很多的主流產品,而且不僅安裝使用簡單,還能自由擴充套件測試資料型別和支援的資料庫產品。

編譯安裝

首先說一下YCSB的安裝。直接下載tar.gz分發包的話其實也不需要安裝什麼,解壓後通過bin目錄下的指令碼執行即可(依賴pythonJRE)。但由於tar.gz分發包比較大,一百多M,而且我這裡總是連線超時,於是直接下載master庫的原始碼,自己編譯。編譯方法也很簡單,因為工程是Maven管理的,所以只要有Maven環境就可以直接在YCSB根目錄下執行package任務,之後就能在distribution工程的target看到ycsb-0.1.4.tar.gz。最後將編譯出的包拷貝到自己的環境如虛擬機器裡,就能使用了。本機除錯也是可以的,只需在IDE中配置好Client.main()方法的啟動引數就行了。

使用

現在來說一下如何使用YCSB,以Redis的效能測試為例,分為1.初始化測試資料 (loading階段)2.執行測試操作(transaction階段)。首先進行初始化,先保證Redis服務已經啟動,然後在YCSB根目錄下執行:

> bin/ycsb load redis -s -P workloads/workloada -p "redis.host=127.0.0.1" -p "redis.port=6379"

之後我們在Redis中就能看到1000條資料,因為workloada中定義了recordcount=1000。每一個key都是hash型別,我們可以重執行上面的命令,將redis改為basicbasic是一種dummy客戶端,實際並不操作任何資料庫,而是將YCSB對資料庫的各種操作的key-value輸出到控制檯,這樣我們就能看到這些key-value是怎麼插入到Redis的,value都是什麼樣子的了。

繼續開始真正的測試:

> bin/ycsb run redis -s -P workloads/workloada -p "redis.host=127.0.0.1" -p "redis.port=6379" \

 -threads 128 -p "operationcount=10000" -p "measurementtype=timeseries" \

 -p "timeseries.granularity=5000"

簡單解釋一下這些引數:-threads是模擬的執行緒數,-p是傳入的引數,可以是客戶端的引數,可以是YCSB內部元件的引數,例如measurementtype會配置Measurements輸出時間序列而不是直方圖,也可以覆蓋workload檔案中預定義的引數,例如上面的operationcount。還有一個常用的引數是-target,指的是每秒最大運算元,當一秒內到達這個閾值,執行緒就會休眠1毫秒。

輸出的內容大概是這個樣子,主要關注總的執行時間、吞吐量,以及讀和寫的平均延遲:

[OVERALL], RunTime(ms), 60058.0

[OVERALL], Throughput(ops/sec), 27049.768557061507

[UPDATE], Operations, 812803

[UPDATE], AverageLatency(us), 2275.102034564341

[UPDATE], MinLatency(us), 616

[UPDATE], MaxLatency(us), 64614

[UPDATE], Return=0, 812800

[UPDATE], 0, 4529.805933250927

[UPDATE], 5000, 2208.521014693651

[UPDATE], 10000, 2148.7565276549426

[UPDATE], 15000, 2139.8536001184116

[UPDATE], 20000, 2205.0305368941204

[UPDATE], 25000, 2165.1238092653402

[UPDATE], 30000, 2180.7067298448014

[UPDATE], 35000, 2188.5334523973074

[UPDATE], 40000, 2145.7207987586858

[UPDATE], 45000, 2199.350677041509

[UPDATE], 50000, 2175.385860213585

[UPDATE], 55000, 2156.2515744608663

[READ], Operations, 811752

[READ], AverageLatency(us), 2304.3717539346994

[READ], MinLatency(us), 629

[READ], MaxLatency(us), 75380

[READ], Return=0, 811751

[READ], 0, 4634.609504308506

[READ], 5000, 2233.603889043769

[READ], 10000, 2179.2526166711627

[READ], 15000, 2165.0853859227886

[READ], 20000, 2234.4603871649133

[READ], 25000, 2178.2390324907783

[READ], 30000, 2208.70719241602

[READ], 35000, 2207.444112422369

[READ], 40000, 2173.767667054904

[READ], 45000, 2223.0628439478996

[READ], 50000, 2200.857439151695

[READ], 55000, 2178.257027425664

原始碼分析

YCSB的核心類都在Maven子模組core中,主要有ClientClientThreadCoreWorkloadDB實現類等。


 

其主流程是:python指令碼bin/ycsb會呼叫Client類的main()方法,初始化WorkloadDB的實現類,並根據-threads引數建立多個Client執行緒,-s引數建立一個Status執行緒。每個執行緒會迴圈recordcountoperationcount(workloada中定義)除以threads次,並根據引數bin/ycsb load/run決定是初始化資料doInsert()還是執行讀寫操作doTransaction()


新增新資料庫

1.新建module:在YCSB根目錄pom.xml下新增一個MavenmoduleartifactIdxxx-binding(ycsb指令碼會根據這個名字字尾掃描jar包,加入到classpath),而目錄名則為字首xxx

2.配置pom.xml:開啟新建子modulepom.xml,加入<build>一段,這樣執行package任務後會在target目錄下生成一個包含了所有依賴的大jar包,這是maven-assembly外掛的功能。之後將core模組(因為下面我們要繼承DB)和其他所有依賴項新增到pom.xml中。

3.新建DB子類:在此子module中新建package和類,繼承DB類。

4.打包module:執行package任務,在target下會生成一個xxx-binding.jar。拷貝到YCSB包下xxx-binding/lib目錄下。

5.執行測試:可以通過-db指定我們的DB類,或在ycsb Python指令碼中給我們的類加個別名。

轉載: http://blog.csdn.net/dc_726/article/details/43991871

相關文章