Caliper介绍
Caliper是区块链性能测试框架,用户可以在定义好测试集的情况下针对自己的区块链网络进行性能测试,获取一系列的测试结果并生成测试报告。
当前支持的区块链解决方案
- fabric v1.0+, 最新支持版本为v1.1.0
- sawtooth 1.0+
- Iroha 1.0 beta-3
- 同时支持Hyperledger Composer 可以参见 Composer Performance Test.
当前支持的性能指标
- 交易成功率
- 交易吞吐量TPS
- 交易延迟
- 资源消耗(CPU/内存/网络IO)
架构
Adaptation Layer 适配器层
Adaptation Layer 将现有的区块链系统集成到Caliper框架中来,每一个适配器都通过相应的区块链的SDK或者RESTful API实现了对应的'Caliper Blockchain NBIs'
Interface&Core Layer 接口和核心层
Interface&Core Layer 实现了核心功能并提供了北向接口,包括了四种NBIs:
- 区块链操作接口:包括部署、调用智能合约,查询账本信息等。
- 资源监控:包括对监控的启停、获取后台区块链系统的资源消耗状态,包括CPU、内存、网络IO等等。目前有提供的有两种监控,一种是监控本地和远程的docker镜像,另一种是监控本地进程。
- 性能分析器::包括读取预定义的性能统计定义(包括TPS、延迟、成功率等)并打印出结果。执行交易时将会记录关键指标,比如创建时间、提交时间、交易结果等。
- 报告生成器: 生成HTML格式的测试报告。
Benchmark Engine 基准引擎
Configuration File 配置文件
主要有两种配置文件,一种是测试基准配置文件,一种是区块链网络拓扑配置文件。
示例:
{
"blockchain": {
"type": "fabric",
"config": "./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)"
},
"test": {
"name": "simple",
"description" : "This is an example benchmark for caliper",
"clients": {
"type": "local",
"number": 5
},
"rounds": [{
"label" : "open",
"txNumber" : [5000, 5000, 5000],
"rateControl" : [{"type": "fixed-rate", "opts": {"tps" : 100}}, {"type": "fixed-rate", "opts": {"tps" : 200}}, {"type": "fixed-rate", "opts": {"tps" : 300}}],
"arguments": { "money": 10000 },
"callback" : "benchmark/simple/open.js"
},
{
"label" : "query",
"txNumber" : [5000, 5000],
"rateControl" : [{"type": "fixed-rate", "opts": {"tps" : 300}}, {"type": "fixed-rate", "opts": {"tps" : 400}}],
"callback" : "benchmark/simple/query.js"
}]
},
"monitor": {
"type": ["docker", "process"],
"docker":{
"name": ["peer0.org1.example.com", "http://192.168.1.100:2375/orderer.example.com"]
},
"process": [
{
"command" : "node",
"arguments" : "local-client.js",
"multiOutput" : "avg"
}
],
"interval": 1
}
}
- blockchain - 定义了使用什么区块链网络,并且指明使用的配置文件。
-
command - 定义了在何时执行的操作。
start: 测试开始时执行
end: 测试完成后执行 -
test - 定义测试元数据。
name&description: 测试名称和简介,生成报告时使用。
clients:定义测试客户端类型,目前有'local' 和'zookeeper'两种。'local' 模式采用本地进程来模拟客户端请求。'zookeeper'模式则客户端会分布在不同的机器上,通过zookeeper的协调来获取测试任务。
hint:提示。主要用在报告生成中,表示调用的是什么链码。
txNumber:每一轮的测试交易次数。
txDuration:每一轮的测试时间。
rateControl:客户端请求的速率,未定义则默认为1TPS。
trim:修剪测试统计结果,用于消除启动和停止时测试的不准确性。比如trim设置为30,如果是按次数设置交易,则测试周期的前后30个交易数据不会被统计。如果是按照时间设置,则测试周期的前后30s的数据不会被统计。
arguments:用户定义的参数,直接透传。
callback:定义本轮测试中所调用的模块。 - monitor - 定义监控的是本地进程还是docker镜像。
Master
定义了三个默认的测试阶段
- 准备阶段 - 根据区块链配置文件生成创建并实例化一个区块链,安装智能合约并启动监控器。
- 测试阶段 - master根据基准测试配置文件启动循环测试。client会获取测试任务开始执行测试,并存储测试结果以备后续分析。
-
报告阶段 - 每一轮测试结果会收集起来进行分析并自动生成HTML格式的测试报告。报告样式如下:
Clients
- Local clients 会通过Node.js 启动多个进程来进行测试,由于node.js是单进程的,测试会启动多个子进程来工作,每个子进程相当于一个client。负载将会均匀的划分到每个client中。
- Zookeeper clients 多个zookeeper clients将会独立启动,并且监听测试信息,测试完毕以后会创建一个znode来记录测试结果。每一个zookeeper client也会本地创建多个字进程来执行实际的测试工作。具体可以参考Zookeper Client Design.
User defined test module
定义了测试函数和以及提交交易,用户可以在这里自定义测试逻辑。
需要定义三个函数:
- init - 在客户端的每一轮测试之前调用,获取区块链数据以及用户的配置信息,用户也可以定义一些其他的初始化信息。
- run - 使用API创建和提交实际的交易信息。客户端会周期性的调用此函数,建议一次只调用一个交易,采用异步模式。如果一次调用多个交易的话,实际的测试测试负载情况会跟配置文件里定义的不同。
- end - 会在每轮测试完成之后调用。用户可以自己定义一些清理工作。
环境准备
- NodeJS 8.X
- node-gyp
- Docker
- Docker-compose
git clone https://github.com/hyperledger/caliper.git
cd caliper
npm install
npm install grpc@1.10.1 fabric-ca-client@1.1.0 fabric-client@1.1.0
执行测试
node ./benchmark/simple/main.js -c ./config.json -n ./fabric.json
-c : 基准测试配置文件, 如果不设置,默认使用 config.json .
-n : 账本网络的配置文件. 如果不设置, 默认使用 config.json中设置的 blockchain config值.
注:以上都是基于fabric v1.1版本
跑一个自带的2org4peer的测试例子:
node benchmark/smallbank/main.js
成功生成报告则表明环境OK。