區塊鏈性能測試工具caliper
- fabric v1.0+
- sawtooth 1.0+
- Iroha 1.0
測試內容指標包括:
- 交易成功率
- 交易吞吐量TPS
- 交易延遲
- 資源消耗
感受一下先
準備
先安裝NodeJS 8.X、node-gyp、Docker、Docker-compose。
git clone https://github.com/hyperledger/caliper.git
cd caliper
npm install
安裝區塊鏈SDK(以fabric為例)
# caliper項目目錄下 npm install [email protected] fabric-ca-client fabric-client
跑個測試
性能測試示例在benchmark
目錄下,用法如下:
node benchmark/simple/main.js -c yourconfig.json -n yournetwork.json
- -c用於指定區塊鏈的配置文件,不指定的話默認為
config.json
; - -n用於指定區塊鏈網絡配置文件,不指定的話由-c指定的配置文件定義。
跑一個smallbank的例子:
node benchmark/smallbank/main.js
生成的報告長這樣(部分):
架構
在這個標準框架核心,是可以譯解信息的“適配層”,讓Caliper可以安裝智能合約,觸發合約,或者查詢各種分布式賬本的狀態,從而更好地測量其有效性。
適配層 Adaptation Layer
適配層用於將現有的區塊鏈系統與Caliper框架集成。適配器使用了相應的鏈SDK和API實現了Caliper Blockchain NBIs。
接口&核心層
- 區塊鏈操作接口:包含部署合約、調用合約、查詢賬本狀態等操作;
- 資源監控:對docker容器、本地進程進行監控,包括CPU、內存、網絡IO等的狀態;
- 性能分析:讀取預定義的性能數據(如TPS、延遲、成功率等)並打印報告。這些數據在調用NBI的時候會記錄(如創建時間,交易提交時間,交易結果等);
- 生成HTML報告。
應用層
- 應用層來運行區塊鏈測試場景。每一個測試場景由一個配置文件來定義,包含底層區塊鏈網絡的配置和測試參數。
- 項目內置一個默認的區塊鏈引擎,當然開發人員也可以基於NBI來定義自己的區塊鏈引擎。
區塊鏈引擎
配置文件
以benchmark/simple/config.json
為例:
{
"blockchain": {
"type": "fabric",
"config": "benchmark/simple/fabric.json"
},
"command" : {
"start": "docker-compose -f network/fabric/simplenetwork/docker-compose.yaml up -d",
"end" : "docker-compose -f network/fabric/simplenetwork/docker-compose.yaml down;docker rm $(docker ps -aq);docker rmi $(docker images dev* -q)"
},
"test": {
"name": "simple",
"description" : "This is an example benchmark for caliper, to test the backend DLT‘s performance with simple account opening & querying transactions",
"clients": {
"type": "local",
"number": 5
},
"rounds": [{
"label" : "open",
"txNumber" : [1000, 1000, 1000],
"rateControl" : [{"type": "fixed-rate", "opts": {"tps" : 50}}, {"type": "fixed-rate", "opts": {"tps" : 100}}, {"type": "fixed-rate", "opts": {"tps" : 150}}],
"arguments": { "money": 10000 },
"callback" : "benchmark/simple/open.js"
},
{
"label" : "query",
"txNumber" : [5000, 5000],
"rateControl" : [{"type": "fixed-rate", "opts": {"tps" : 100}}, {"type": "fixed-rate", "opts": {"tps" : 200}}],
"callback" : "benchmark/simple/query.js"
}]
},
"monitor": {
"type": ["docker", "process"],
"docker":{
"name": ["all"]
},
"process": [
{
"command" : "node",
"arguments" : "local-client.js",
"multiOutput" : "avg"
}
],
"interval": 1
}
}
- blockchain定義被測試區塊鏈類型,並給出具體配置文件;
- command定義了測試開始和結束時的命令;
- test定義了測試相關的信息;
- monitor定義了對資源對象如何進行監控。
Master
master實現的測試流包含三個階段:
- 準備階段:創建和初始化區塊鏈,部署智能合約,並啟動監控;
- 測試階段:啟動一個循環測試,測試任務會被安排給client去執行,client會返回性能測試數據;
- 報告階段:分析測試數據,並生成HTML格式的報告。
OrderClient
Local client
由於Node.js天生時單線程的,因此會fork多個local client子進程來充分利用多核,提高測試效率。每個子進程都運行有一個區塊鏈客戶端。
Zookeeper client
多個zoookeeper client是獨立啟動的,啟動後會註冊自己並待命測試任務,測試後會創建一個包含結果數據的znode。也是會fork多個子進程(local client)。
用戶自定義的測試模塊
其中定義有生成和提交交易的function(返回值都是promise):
init
:會在每輪測試前被client調用;run
:定義如何執行交易。client會根據workload定義循環調用它;end
:每輪測試後被調用,通常定義一些清理工作。
擼一下源碼
還是基於上邊的架構圖,這次從上往下捋。
首先是Benchmark Layer
從測試命令入手,以smallbank
為例:
node benchmark/smallbank/main.js
測試用例位於benchmark/
目錄下。由測試人員編寫,並配置到-c
指定的配置文件的test.rounds[.callback]
中。
在main.js
中主要是加載兩個配置文件,然後調用src/comm/bench-flow.js
的run
方法,將兩個配置文件傳進去:
const framework = require(‘../../src/comm/bench-flow.js‘);
framework.run(absConfigFile, absNetworkFile);
bench-flow.js
可以認為是測試引擎,run
方法定義了完整的測試流程。
下邊是接口和核心層
接口即Blockchain NBIs,位於src/comm/blockchain-interface.js
中的,其中的BlockchainInterface
定義了區塊鏈的基本操作:
為了生成測試報告,首先必須有監控來收集數據,主要側重於對Docker和Process的監控,代碼文件包括monitor-interface.js
和monitor-docker.js
、monitor-process.js
。從名字可以看出是接口和兩個具體實現,看一下接口定義了些啥:
除了啟停操作,主要側重於對CPU、內存和網絡的監控。
數據統計和報告生成功能位於src/comm/report.js
。
適配層
caliper支持對Fabric、Sawtooth等的測試,看架構圖上還想對以太坊進行支持,但是目前還沒有。
具體的適配代碼分別位於src/fabric
、src/sawtooth
、src/iroha
等目錄下,比如fabric.js
中的Fabric
類就繼承自BlockchainInterface
,實現了初始化、安裝/執行智能合約等功能。
這些功能內部自然就是調用了fabric-client
,所以測試前需要先進行安裝:
npm install [email protected] fabric-ca-client fabric-client
區塊鏈性能測試工具caliper