原文地址:www.xuanzhangjiong.top/2019/09/21/…html
前段時間花了一段時間來研究Hyperledger Caliper的原理以及使用方式,研究的時候正處於Caliper改動較大的時候,所以也踩了很多的坑,也發現了一些問題,同時也加深了對這個項目的認識,在這裏進行一下整理和概括,以便你們可以更好地使用Caliper。node
先附上一張官方文檔的架構圖:git
Hyperledger Caliper這個項目其主要的核心思想是實現一套通用的區塊鏈性能測試框架,可以支持Hyperledger旗下的全部framework,可是也不限於下面的項目,也能夠支持其餘的區塊鏈項目,不過須要本身實現adaptation Layer。目前,Caliper已經正式發佈了v0.1.0版本,支持Hyperledger Fabric v1.0-v1.4.三、Sawtooth、Iroha、composer和burrow。github
Adaptation Layper(適配層)docker
適配層相似編程語言中接口與實現中的實現部分,即各類區塊鏈操做最後都會調用到你所指定的Adaptation Layper的具體實現去操做對應的區塊鏈平臺。npm
Interface&Core Layper(接口及核心層)編程
下述內容摘自官方文檔,該層核心思想是定義整個框架的相關流程,從初始化到測試到最後的統計及生成報告和相關的速率控制等實現,主體思想是定義整個核心流程代碼。bootstrap
接口和核心層提供 Blockchain NBI、資源監控、性能監控、報告生成模塊,併爲上層應用提供四種相應的北向接口:ubuntu
Blockchain operating interfaces: 包含諸如在後端區塊鏈上部署智能合約、調用合約、從帳本查詢狀態等操做。 Resource Monitor: 包含啓動/中止監視器和獲取後端區塊鏈系統資源消耗狀態的操做,包括CPU、內存、網絡IO等。如今提供兩種監視器,一種是監視本地/遠程docker容器,另外一種則是監控本地進程。將來將實現更多功能。 Performance Analyzer: 包含讀取預約義性能統計信息(包括TPS、延遲、成功交易數等)和打印基準測試結果的操做。在調用區塊鏈北向接口時,每一個交易的關鍵指標(如建立交易的時間、交易提交時間、交易返回結果等)都會被記錄下來,並用於生成最終的預約義性能指標統計信息。 Report Generator: 生成HTML格式測試報告。後端
Application Layer(應用層)
應用層用於定義區塊鏈網絡的配置,測試的相關配置,指benchmark和network兩個文件夾的配置。相關配置信息在此不進行展開。
整個測試流程,主要包括3個階段:
測試客戶端有2種,一種是local client,一種是zookeeper client,local client模式用於進行單機模式下的測試,zookeeper client模式用於解決單機性能不足,進行分佈式的客戶端測試。可是目前由於架構調整,zookeeper client這種模式將被廢棄,做者嘗試過此種模式的測試,可是存在一些問題github.com/hyperledger…,在這裏貼出來,有興趣的朋友能夠研究下,可是maintainer已經不作維護了。後續將會設計新的分佈式測試方案,能夠關注後期的設計。
用戶本身的定義的test case能夠在benchmark文件夾中實現本身定義的相應JavaScript代碼來實現相應的智能合約方法調用以及初始化和結束時要作的事情。
caliper項目中全部的代碼都位於caliper/packages
目錄下:
├── caliper-burrow
├── caliper-cli
├── caliper-composer
├── caliper-core
├── caliper-fabric
├── caliper-iroha
├── caliper-samples
├── caliper-sawtooth
└── caliper-tests-integration
複製代碼
其中包括各個adaptation Layper層:caliper-burrow、caliper-composer、caliper-fabric、caliper-iroha、caliper-sawtooth。
caliper-cli:用於命令行參數解析。
caliper-core:用於整個項目的核心流程接口的實現。
caliper-samples;用於存放各類區塊鏈網絡的配置文件示例、測試文件的示例,以及各類智能合約。
caliper-tests-integration:用於進行caliper的本地打包發佈和安裝。
在學習使用的時候能夠重點關注fabric-samples文件夾下的相關配置,網絡配置在network目錄中,測試配置在benchmark文件夾中,智能合約文件在src/contract
文件夾中。
目前caliper有了較爲豐富的安裝方法,你們能夠根據本身的喜愛以及實際狀況擇優選擇。
Caliper目前已經將v0.1.0版本發佈到了官方的npm server上了包名爲@hyperledger/caliper-cli
,將製做好的docker鏡像發佈到了docker hub,hyperledger/caliper
,鏡像包括了caliper的二進制文件。
安裝和使用caliper主要有3個步驟:
在這裏介紹下npx命令,npx命令在下面主要是搜索node_modules中下載的caliper命令的做用,起到相似將caliper放到全局搜索路徑的效果。
使用以下命令確認下載的caliper的版本:
user@ubuntu:~/caliper-benchmarks$ npx caliper --version
v0.1.0
複製代碼
Cli提供了不少的輔助信息,可使用--help進行查看。
user@ubuntu:~/caliper-benchmarks$ npx caliper --help
caliper <command>
Commands:
caliper benchmark <subcommand> Caliper benchmark command
caliper bind [options] Bind Caliper to a specific SUT and its SDK version
Options:
--help Show help [boolean]
-v, --version Show version number [boolean]
Examples:
caliper bind
caliper benchmark run
For more information on Hyperledger Caliper: https://hyperledger.github.io/caliper/
複製代碼
bind命令用於指定caliper命令行操做的區塊鏈平臺的sdk類型及版本:
user@ubuntu:~/caliper-benchmarks$ npx caliper bind --help
Usage:
caliper bind --caliper-bind-sut fabric --caliper-bind-sdk 1.4.1 --caliper-bind-cwd ./ --caliper-bind-args="-g"
Options:
--help Show help [boolean]
-v, --version Show version number [boolean]
--caliper-bind-sut The name of the platform to bind to [string]
--caliper-bind-sdk Version of the platform SDK to bind to [string]
--caliper-bind-cwd The working directory for performing the SDK install [string]
--caliper-bind-args Additional arguments to pass to "npm install". Use the "=" notation when setting this parameter [string]
複製代碼
benchmark命令也是整個命令的核心,用於執行相應的測試,須要指定工做目錄,網絡配置及測試配置。
user@ubuntu:~/caliper-benchmarks$ npx caliper benchmark run --help
caliper benchmark run --caliper-workspace ~/myCaliperProject --caliper-benchconfig my-app-test-config.yaml --caliper-networkconfig my-sut-config.yaml
Options:
--help Show help [boolean]
-v, --version Show version number [boolean]
--caliper-benchconfig Path to the benchmark workload file that describes the test client(s), test rounds and monitor. [string]
--caliper-networkconfig Path to the blockchain configuration file that contains information required to interact with the SUT [string]
--caliper-workspace Workspace directory that contains all configuration information [string]
複製代碼
目前這種方式已經很是方便了,能夠直接用npm install
安裝,分爲局部安裝和全局安裝2種方式。
這種方式的好處是能夠在同一臺服務器上設置多個不一樣的測試客戶端並且不會相互干擾。
user@ubuntu:~/caliper-benchmarks$ npm init -y
user@ubuntu:~/caliper-benchmarks$ npm install --only=prod @hyperledger/caliper-cli
user@ubuntu:~/caliper-benchmarks$ npx caliper bind --caliper-bind-sut fabric --caliper-bind-sdk 1.4.0
user@ubuntu:~/caliper-benchmarks$ npx caliper benchmark run --caliper-workspace . --caliper-benchconfig benchmarks/scenario/simple/config.yaml --caliper-networkconfig networks/fabric/fabric-v1.4/2org1peergoleveldb/fabric-go.yaml
複製代碼
初始化npm項目
安裝Caliper命令行
綁定所須要的平臺SDK
調用命令行進行測試
全局安裝
全局安裝不須要初始化。
user@ubuntu:~$ npm install -g --only=prod @hyperledger/caliper-cli
user@ubuntu:~$ caliper bind --caliper-bind-sut fabric --caliper-bind-sdk 1.4.0 --caliper-bind-args=-g
user@ubuntu:~$ caliper benchmark run --caliper-workspace ~/caliper-benchmarks --caliper-benchconfig benchmarks/scenario/simple/config.yaml --caliper-networkconfig networks/fabric/fabric-v1.4/2org1peergoleveldb/fabric-go.yaml
複製代碼
使用Docker鏡像能夠經過直接使用docker命令或者docker-compose的方式進行啓動,只須要配置相應的環境變量以及將相關配置文件映射進容器便可。
下面是docker命令的方式:
user@ubuntu:~/caliper-benchmarks$ docker run \
-v .:/hyperledger/caliper/workspace \
-e CALIPER_BIND_SUT=fabric \
-e CALIPER_BIND_SDK=1.4.0 \
-e CALIPER_BENCHCONFIG=benchmarks/scenario/simple/config.yaml \
-e CALIPER_NETWORKCONFIG=networks/fabric/fabric-v1.4/2org1peergoleveldb/fabric-go.yaml \
--name caliper hyperledger/caliper
複製代碼
下面是docker-compose的方式:
version: '2'
services:
caliper:
container_name: caliper
image: hyperledger/caliper
environment:
- CALIPER_BIND_SUT=fabric
- CALIPER_BIND_SDK=1.4.0
- CALIPER_BENCHCONFIG=benchmarks/scenario/simple/config.yaml
- CALIPER_NETWORKCONFIG=networks/fabric/fabric-v1.4/2org1peergoleveldb/fabric-go.yaml
volumes:
- ~/caliper-benchmarks:/home/node/hyperledger/caliper/workspace
複製代碼
若是docker-compose的配置文件名爲docker-compose.yaml
,直接執行:
docker-compose up
複製代碼
user@ubuntu:~/caliper$ npm i && npm run repoclean -- --yes && npm run bootstrap
複製代碼
user@ubuntu:~/caliper$ cd ./packages/caliper-tests-integration
user@ubuntu:~/caliper/packages/caliper-tests-integration$ npm run start_verdaccio
...
[PM2] Spawning PM2 daemon with pm2_home=.pm2
[PM2] PM2 Successfully daemonized
[PM2] Starting /home/user/projects/caliper/packages/caliper-tests-integration/node_modules/.bin/verdaccio in fork_mode (1 instance)
[PM2] Done.
┌───────────┬────┬──────┬────────┬────────┬─────────┬────────┬─────┬───────────┬────────┬──────────┐
│ App name │ id │ mode │ pid │ status │ restart │ uptime │ cpu │ mem │ user │ watching │
├───────────┼────┼──────┼────────┼────────┼─────────┼────────┼─────┼───────────┼────────┼──────────┤
│ verdaccio │ 0 │ fork │ 115203 │ online │ 0 │ 0s │ 3% │ 25.8 MB │ user │ disabled │
└───────────┴────┴──────┴────────┴────────┴─────────┴────────┴─────┴───────────┴────────┴──────────┘
Use `pm2 show <id|name>` to get more details about an app
user@ubuntu:~/caliper/packages/caliper-tests-integration$ npm run npm_publish_local
...
+ @hyperledger/caliper-core@0.1.0
[PUBLISH] Published package @hyperledger/caliper-core@0.1.0
...
+ @hyperledger/caliper-fabric@0.1.0
[PUBLISH] Published package @hyperledger/caliper-fabric@0.1.0
...
+ @hyperledger/caliper-cli@0.1.0
[PUBLISH] Published package @hyperledger/caliper-cli@0.1.0
複製代碼
user@ubuntu:~/caliper/packages/caliper-tests-integration$ npm install --registry=http://localhost:4873 --only=prod @hyperledger/caliper-cli
user@ubuntu:~/caliper/packages/caliper-tests-integration$ npx caliper bind --caliper-bind-sut fabric --caliper-bind-sdk 1.4.0
user@ubuntu:~/caliper/packages/caliper-tests-integration$ npx caliper benchmark run --caliper-workspace ../caliper-samples --caliper-benchconfig benchmark/simple/config.yaml --caliper-networkconfig network/fabric-v1.4/2org1peergoleveldb/fabric-node.yaml
複製代碼
若是須要本身構建Docker鏡像的話,請執行下述命令:
user@ubuntu:~/caliper/packages/caliper-tests-integration$ npm run docker_build_local
...
Successfully tagged hyperledger/caliper:0.1.0
[BUILD] Built Docker image "hyperledger/caliper:0.1.0"
複製代碼
若是執行完了發佈命令的話,請清理一下環境
user@ubuntu:~/caliper/packages/caliper-tests-integration$ npm run cleanup
上述是我結合官方文檔以及本身在前兩週使用Caliper的過程當中的心得體會,可是受限於目前Caliper目前客戶端的性能問題,我並未採用Caliper進行測試,而是採用了別的方式,會在後續博客中提到。目前Caliper測試Fabric v1.4以上版本使用的SDK採用的是SDK的高級API,封裝效果好,可是測試結果發現,在8核16G的服務器上,測試的sendRate在800TPS左右的時候,服務器CPU就已經滿負荷運行了,沒法提高單機的發送速率,和社區開發者交流後證明,在此版本以前,Caliper單機發送速率經過多進程的方式是能夠達到4000TPS的,因此目前做者僅僅採用Caliper進行測試網絡的初始化、銷燬以及部署智能合約等輔助操做。真正的測試須要社區排查解決CPU佔用率太高的問題以後才能使用,我也會持續關注這個問題,我的認爲是因爲發送的時候創建了過多的event hub的鏈接致使的資源消耗太高的緣由。