Caliper是一個區塊鏈性能測試框架,可用於測試不一樣的區塊鏈實現。支持node
測試內容指標包括:git
先安裝NodeJS 8.X、node-gyp、Docker、Docker-compose。github
git clone https://github.com/hyperledger/caliper.git cd caliper npm install
# caliper項目目錄下 npm install grpc@1.10.1 fabric-ca-client fabric-client
性能測試示例在benchmark
目錄下,用法以下:docker
node benchmark/simple/main.js -c yourconfig.json -n yournetwork.json
config.json
;跑一個smallbank的例子:npm
node benchmark/smallbank/main.js
生成的報告長這樣(部分):json
在這個標準框架核心,是能夠譯解信息的「適配層」,讓Caliper能夠安裝智能合約,觸發合約,或者查詢各類分佈式帳本的狀態,從而更好地測量其有效性。promise
適配層用於將現有的區塊鏈系統與Caliper框架集成。適配器使用了相應的鏈SDK和API實現了Caliper Blockchain NBIs。網絡
以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 } }
master實現的測試流包含三個階段:框架
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 grpc@1.10.1 fabric-ca-client fabric-client