一、Caliper性能测试工具的配置和使用
(1)下载并配置node.js
由于服务器上已经配置完成node.js,所以只需要再检查一遍即可。
返回版本号即配置成功。
(2)创建并初始化Fabric网络
由于服务器上已经下载过fabric-sample和fabric2.2.3二进制文件和镜像,所以只需要进行初始化网络即可。
1 2 3
| cd test-network ./network.sh up createChannel ./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go
|
通过以上代码完成初始化设置
(3)创建Caliper工作区
回到fabric-sample的同一级目录,在同级目录上创建一个名为caliper-workerspace的文件夹,在该文件夹下创建三个名为networks、benchmarks和workload的文件夹。
1 2 3 4 5 6
| cd ../.. mkdir caliper-workspace cd caliper-workspace mkdir networks mkdir benchmarks mkdir workload
|
然后,在caliper-workspace目录中,安装caliper cli:
1
| npm install --only=prod @hyperledger/caliper-cli@0.4.0
|
使用以下终端命令绑定SDK:
1
| npx caliper bind --caliper-bind-sut fabric:2.1
|
(4)构建网络配置文件
在networks文件夹下创建一个名为networkConfig.json的文件
1 2
| cd networks touch networkConfig.json
|
将以下内容复制到该文件中并保存:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| { "version" : "1.0", "name": "Caliper test", "caliper" : { "blockchain": "fabric" }, "clients": { "Admin@org1.example.com": { "client": { "credentialStore": { "path": "/tmp/org1", "cryptoStore": { "path": "/tmp/org1" } }, "organization": "Org1", "clientPrivateKey": { "path": "../fabric-samples/test-network/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/keystore/priv_sk" }, "clientSignedCert": { "path": "../fabric-samples/test-network/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/signcerts/Admin@org1.example.com-cert.pem" }, "connection": { "timeout": { "peer": { "endorser": "300" } } }
} } }, "channels": { "mychannel": { "created" : true, "contracts": [ { "id":"basic", "version":"1.0.0" } ] } }, "organizations":{ "Org1": { "mspid": "Org1MSP", "peers": [ "peer0.org1.example.com" ] } }, "peers": { "peer0.org1.example.com": { "url": "grpcs://localhost:7051", "tlsCACerts": { "pem": "-----BEGIN CERTIFICATE-----\n<UNIQUE CONTENT>\n-----END CERTIFICATE-----\n" }, "grpcOptions": { "ssl-target-name-override": "peer0.org1.example.com", "hostnameOverride": "peer0.org1.example.com" } } } }
|
需要将下面的内容进行替换,需要更具自己网络中生成的证书内容进行更改:

查看方式如下:
1
| cd /home/fabric-samples/test-network/organizations/peerOrganizations/org1.example.com
|
打开connection-org1.json
,复制该文件中”pem”后面的内容,对networkConfig.json文件中的内容进行替换。
(5)构建测试工作负载模块
1 2 3
| cd .. cd workload touch readAsset.js
|
将以下内容复制到该文件中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| 'use strict';
const { WorkloadModuleBase } = require('@hyperledger/caliper-core');
class MyWorkload extends WorkloadModuleBase { constructor() { super(); } async initializeWorkloadModule(workerIndex, totalWorkers, roundIndex, roundArguments, sutAdapter, sutContext) { await super.initializeWorkloadModule(workerIndex, totalWorkers, roundIndex, roundArguments, sutAdapter, sutContext);
for (let i=0; i<this.roundArguments.assets; i++) { const assetID = `${this.workerIndex}_${i}`; console.log(`Worker ${this.workerIndex}: Creating asset ${assetID}`); const request = { contractId: this.roundArguments.contractId, contractFunction: 'CreateAsset', invokerIdentity: 'Admin@org1.example.com', contractArguments: [assetID,'blue','20','penguin','500'], readOnly: false };
await this.sutAdapter.sendRequests(request); } } async submitTransaction() { const randomId = Math.floor(Math.random()*this.roundArguments.assets); const myArgs = { contractId: this.roundArguments.contractId, contractFunction: 'ReadAsset', invokerIdentity: 'Admin@org1.example.com', contractArguments: [`${this.workerIndex}_${randomId}`], readOnly: true };
await this.sutAdapter.sendRequests(myArgs); } async cleanupWorkloadModule() { for (let i=0; i<this.roundArguments.assets; i++) { const assetID = `${this.workerIndex}_${i}`; console.log(`Worker ${this.workerIndex}: Deleting asset ${assetID}`); const request = { contractId: this.roundArguments.contractId, contractFunction: 'DeleteAsset', invokerIdentity: 'Admin@org1.example.com', contractArguments: [assetID], readOnly: false };
await this.sutAdapter.sendRequests(request); } } }
function createWorkloadModule() { return new MyWorkload(); }
module.exports.createWorkloadModule = createWorkloadModule;
|
(6)构建基准测试配置文件
在benchmarks文件夹下创建一个名为myAssetBenchmark.yaml
的文件
1 2 3
| cd .. cd benchmarks touch myAssetBenchmark.yaml
|
将以下内容复制到myAssetBenchmark.yaml
的文件中并保存:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| test: name: basic-contract-benchmark description: test benchmark workers: type: local number: 2 rounds: - label: readAsset description: Read asset benchmark txDuration: 30 rateControl: type: fixed-load opts: transactionLoad: 2 workload: module: workload/readAsset.js arguments: assets: 10 contractId: basic monitors: resource: - module: docker options: interval: 5 containers: - all
|
(7)运行Caliper基准测试
1
| npx caliper launch manager --caliper-workspace ./ --caliper-networkconfig networks/networkConfig.json --caliper-benchconfig benchmarks/myAssetBenchmark.yaml --caliper-flow-only-test --caliper-fabric-gateway-enabled --caliper-fabric-gateway-discovery
|
测试结果如下所示:
吞吐量:

计算机资源占用情况:

同时在caliper-workspace
目录下生成了一个名为report.html
的报告,使用Xftp工具将该文件从服务器上提取出来。


