fabric测试工具Caliper的安装配置使用

fabric测试工具Caliper的安装配置使用

一、Caliper性能测试工具的配置和使用

(1)下载并配置node.js

由于服务器上已经配置完成node.js,所以只需要再检查一遍即可。

1
2
node -v
npm -v

返回版本号即配置成功。

(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"
}
}
}
}

需要将下面的内容进行替换,需要更具自己网络中生成的证书内容进行更改:

image-20220311153020490

查看方式如下:

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

测试结果如下所示:

吞吐量:

image-20220311154146282

计算机资源占用情况:

image-20220311154222125

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

image-20220311154659849

image-20220311154839208

image-20220311154856950

作者

John Doe

发布于

2022-03-16

更新于

2025-02-28

许可协议

You need to set install_url to use ShareThis. Please set it in _config.yml.
You forgot to set the business or currency_code for Paypal. Please set it in _config.yml.

评论

You forgot to set the shortname for Disqus. Please set it in _config.yml.
You need to set client_id and slot_id to show this AD unit. Please set it in _config.yml.