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