1. 程式人生 > >區塊鏈性能測試工具caliper

區塊鏈性能測試工具caliper

strong order multi 編寫 數據 收集 一個 nodejs 因此

Caliper是一個區塊鏈性能測試框架,可用於測試不同的區塊鏈實現。支持

  • fabric v1.0+
  • sawtooth 1.0+
  • Iroha 1.0

測試內容指標包括:

  • 交易成功率
  • 交易吞吐量TPS
  • 交易延遲
  • 資源消耗

感受一下先

準備

先安裝NodeJS 8.X、node-gyp、Docker、Docker-compose。

git clone https://github.com/hyperledger/caliper.git
cd caliper
npm install

安裝區塊鏈SDK(以fabric為例)

# caliper項目目錄下
npm install [email protected] fabric-ca-client fabric-client

跑個測試

性能測試示例在benchmark目錄下,用法如下:

node benchmark/simple/main.js -c yourconfig.json -n yournetwork.json
  • -c用於指定區塊鏈的配置文件,不指定的話默認為config.json
  • -n用於指定區塊鏈網絡配置文件,不指定的話由-c指定的配置文件定義。

跑一個smallbank的例子:

node benchmark/smallbank/main.js

生成的報告長這樣(部分):

技術分享圖片

架構

在這個標準框架核心,是可以譯解信息的“適配層”,讓Caliper可以安裝智能合約,觸發合約,或者查詢各種分布式賬本的狀態,從而更好地測量其有效性。

技術分享圖片

適配層 Adaptation Layer

適配層用於將現有的區塊鏈系統與Caliper框架集成。適配器使用了相應的鏈SDK和API實現了Caliper Blockchain NBIs。

接口&核心層

  • 區塊鏈操作接口:包含部署合約、調用合約、查詢賬本狀態等操作;
  • 資源監控:對docker容器、本地進程進行監控,包括CPU、內存、網絡IO等的狀態;
  • 性能分析:讀取預定義的性能數據(如TPS、延遲、成功率等)並打印報告。這些數據在調用NBI的時候會記錄(如創建時間,交易提交時間,交易結果等);
  • 生成HTML報告。

應用層

  • 應用層來運行區塊鏈測試場景。每一個測試場景由一個配置文件來定義,包含底層區塊鏈網絡的配置和測試參數。
  • 項目內置一個默認的區塊鏈引擎,當然開發人員也可以基於NBI來定義自己的區塊鏈引擎。

區塊鏈引擎

技術分享圖片

配置文件

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
  }
}
  • blockchain定義被測試區塊鏈類型,並給出具體配置文件;
  • command定義了測試開始和結束時的命令;
  • test定義了測試相關的信息;
  • monitor定義了對資源對象如何進行監控。

Master

master實現的測試流包含三個階段:

  • 準備階段:創建和初始化區塊鏈,部署智能合約,並啟動監控;
  • 測試階段:啟動一個循環測試,測試任務會被安排給client去執行,client會返回性能測試數據;
  • 報告階段:分析測試數據,並生成HTML格式的報告。
    Order

    Client

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.jsrun方法,將兩個配置文件傳進去:

    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.jsmonitor-docker.jsmonitor-process.js。從名字可以看出是接口和兩個具體實現,看一下接口定義了些啥:

技術分享圖片

除了啟停操作,主要側重於對CPU、內存和網絡的監控。

數據統計和報告生成功能位於src/comm/report.js

技術分享圖片

適配層

caliper支持對Fabric、Sawtooth等的測試,看架構圖上還想對以太坊進行支持,但是目前還沒有。

具體的適配代碼分別位於src/fabricsrc/sawtoothsrc/iroha等目錄下,比如fabric.js中的Fabric類就繼承自BlockchainInterface,實現了初始化、安裝/執行智能合約等功能。

技術分享圖片

這些功能內部自然就是調用了fabric-client,所以測試前需要先進行安裝:

npm install [email protected] fabric-ca-client fabric-client

區塊鏈性能測試工具caliper