Caliper压力测试
目前FISCO BCOS适配的Caliper版本为0.2.0,请在部署Caliper运行环境时确保Caliper的版本为0.2.0,如在部署或使用过程中遇到任何问题,请优先参考 https://github.com/FISCO-BCOS/FISCO-BCOS/issues/1248 中的解决方案进行排查。
1. 环境要求
第一步. 配置基本环境
- 部署Caliper的计算机需要有
外网权限
; - 操作系统版本需要满足以下要求:Ubuntu >= 16.04、CentOS >= 7或MacOS >= 10.14;
- 部署Caliper的计算机需要安装有以下软件:
python 2.7、make、g++、gcc及git
。
第二步. NodeJS
-
版本要求:
NodeJS 8 (LTS), 9, 或 10 (LTS),Caliper尚未在更高的NodeJS版本中进行过验证。
-
安装指南:
建议使用nvm(Node Version Manager)安装,nvm的安装方式如下:
# 安装nvm
curl -o- https://gitee.com/mirrors/nvm/raw/v0.33.2/install.sh | bash# 加载nvm配置
source ~/.$(basename $SHELL)rc
# 打开环境配置文件,追加淘宝镜像
# nvm淘宝镜像
export NVM_NODEJS_ORG_MIRROR=http://npm.taobao.org/mirrors/node# 安装Node.js 8
nvm install 8
# 使用Node.js 8
nvm use 8
第三步. 部署Docker
bash <(curl -s -L get.docker.com)
第四步. 安装Docker Compose
curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-composedocker-compose --version
2. Caliper部署
第一步. 部署
npm 安装
# 建立工作目录
mkdir caliper-benchmarks && cd caliper-benchmarks
# npm项目初始化
npm init -y
这一步主要是为在工作目录下创建package.json文件以方便后续依赖项的安装,如果不需要填写项目信息的话可以直接执行npm init -y。
# 安装 caliper-cli
npm install --only=prod @hyperledger/caliper-cli@0.2.0
# 验证安装成功
npx caliper --version
拉源码安装
git clone https://github.com/hyperledger/caliper-benchmarks.git
cd caliper-benchmarks
git checkout v0.2.0
npx caliper --version
第二步. 绑定
–caliper-bind-sut :用于指定需要测试的区块链平台,即受测系统(System under Test);
–caliper-bind-sdk:用于指定适配器版本;
–caliper-bind-cwd:用于绑定caliper-cli
的工作目录,caliper-cli
在加载配置文件等场合时均是使用相对于工作目录的相对路径;
caliper-bind-args:用于指定caliper-cli
在安装依赖项时传递给npm
的参数,如用于全局安装的-g
。
ps:chmod 777 caliper-benchmarks
# tmd,我也不知道为什么700,用root执行不行,必须755把,下面才能绑定成功
# 对fisco 进行绑定
npx caliper bind --caliper-bind-sut fisco-bcos --caliper-bind-sdk latest
3.自定义测试用例
Caliper前后端分离的设计原则使得只要后端的区块链系统开放了相关网络端口,Caliper便可以对该系统进行测试。结合Docker提供的性能数据统计服务或本地的ps命令工具,Caliper能够在测试的同时收集节点所在机器上的各种性能数据,包括CPU、内存、网络及磁盘的使用等。尽管Caliper能工作在不使用Docker模式而是使用原生二进制ficos-bcos可执行程序搭建出的链上,但是那样Caliper将无法获知节点所在机器上的资源消耗
。因此,在目前的Caliper版本下(v0.2.0),我们推荐使用Docker模式搭链
。
配置区块链网络
当我们在使用caliper去进行测试的时候,是测试两种东西,一种是性能,一种是网络,所以命令相对较长:
npx caliper benchmark run --caliper-workspace caliper-benchmarks --caliper-benchconfig /root/tools/caliper/config.yaml --caliper-networkconfig /root/tools/caliper/fisco-bcos.json
其中,
–caliper-workspace:用于指定caliper-cli的工作目录
,如果没有绑定工作目录,可以通过该选项动态指定工作目录;
–caliper-benchconfig:用于指定测试配置文件
,测试配置文件中包含测试的具体参数,如交易的发送方式、发送速率控制器类型、性能监视器类型等;
–caliper-networkconfig:用于指定网络配置文件
,网络配置文件中会指定Caliper与受测系统的连接方式及要部署测试的合约等。
相关配置文件解析:
配置fisco-bcos适配器
fisco-bcos.json文件
{"caliper": {"blockchain": "fisco-bcos"},"fisco-bcos": {"config": {"privateKey": "bcec428d5205abe0f0cc8a734083908d9eb8563e31f943d760786edf42ad67dd","account": "0x64fa644d2a694681bd6addd6c5e36cccd8dcdde3"},"network": {"nodes": [{"ip": "127.0.0.1","rpcPort": "8545","channelPort": "20200"},{"ip": "127.0.0.1","rpcPort": "8546","channelPort": "20201"},{"ip": "127.0.0.1","rpcPort": "8547","channelPort": "20202"},{"ip": "127.0.0.1","rpcPort": "8548","channelPort": "20203"}],"authentication": {"key": "./networks/fisco-bcos/fisco/nodes/127.0.0.1/sdk/node.key","cert": "./networks/fisco-bcos/fisco/nodes/127.0.0.1/sdk/node.crt","ca": "./networks/fisco-bcos/fisco/nodes/127.0.0.1/sdk/ca.crt"},"groupID": 1,"timeout": 100000},"smartContracts": [{"id": "helloworld","path": "src/fisco-bcos/helloworld/HelloWorld.sol","language": "solidity","version": "v0"}]},"info": {"Version": "2.0.0","Size": "4 Nodes","Distribution": "Single Host"}
}
-
caliper.command.start:
启动Caliper时会首先执行的start配置中的命令,主要用于初始化 -
caliper.command.end:
退出Caliper时会执行的end配置中的命令。 -
network.nodes:
一个包含了所有要连接节点的列表,列表中的每一项需要指明被连接节点的IP地址,RPC端口以及Channel端口号,所有端口号需要和节点的配置文件保持一致。 -
network.authentication:
即节点下的sdk文件夹中的所对应的证书文件和配置文件。ps:可以不写。
-
network.smartContracts:
要测试的合约,目前FISCO BCOS适配器支持通过language字段指定两种类型的合约——Solidity合约和预编译合约,当测试合约为Solidity合约时,language字段需要指定为solidity,当测试合约为预编译合约时,language字段需要指定为precompiled。当测试合约为预编译合约时,需要在address字段中指定预编译合约的地址,否则需要在path字段中指定Solidity合约的路径。
config.yaml文件
---
test:name: Hello Worlddescription: This is a helloworld benchmark of FISCO BCOS for caliperclients:type: localnumber: 1rounds:- label: getdescription: Test performance of getting nametxNumber:- 10000rateControl:- type: fixed-rateopts:tps: 1000callback: benchmarks/samples/fisco-bcos/helloworld/get.js # PS- label: setdescription: Test performance of setting nametxNumber:- 10000rateControl:- type: fixed-rateopts:tps: 1000callback: benchmarks/samples/fisco-bcos/helloworld/set.js # PS
monitor:type:# - docker- process# docker:# name:# - node0# - node1# - node2# - node3process:- command: node# arguments: fiscoBcosClientWorker.jsmultiOutput: avginterval: 0.5
- 测试内容配置
test项负责对测试内容进行配置。配置主要集中在round字段中指定如何对区块链系统进行测试。每一个测试可以包含多轮,每一轮可以向区块链发起不同的测试请求。具体要HelloWorld合约测试,测试中包含两轮,分别对合约的get接口和set接口进行测试
。在每一轮测试中,可以通过txNumber或txDuration字段指定测试的交易发送数量或执行时间
,并通过rateControl字段指定交易发送时的速率控制器
,在本节的示例中,使用了QPS为1000的匀速控制器,更多速率控制器的介绍可以参考官方文档。
- 性能监视器配置
非docker---------
-
1.monitor.type,需要指定为
process
,只对进程进行监控;2.monitor.process,一个包含所有要监视的进称列表,
其中每个进程的command属性为一个正则表达式,表示进程名称
;每个进程还可以有一个arguments属性(未在上述示例中使用到),表示进程的参数。
Caliper会先使用ps命令搜索commad + arguments,然后匹配以得到目标的进程的进程ID及系统资源的使用情况
。每个进程的multiOutput属性用于指定结果的输出方式,目前支持平均值(avg)及总和(sum)
两种方式;3.monitor.interval,监视器的采样间隔,单位为秒。
docker----------
工作负载文件
工作负载文件即一个js文件,本身实现没有过多的要求,可以在此模块中实现任何逻辑。但有三个函数是必需的:
- init(blockchain,context,args)
init函数是在测试开始时被调用的,需要接收三个参数,第一个是区块链实例
,第二个是区块链的上下文
,第三个是用户提供的设置对象
。 - run() => Promise
run函数是在速率控制器每次启动发送交易时
被调用的,里面必须要有invokeSmartContract
或者queryState函数
。 - end()
end()函数是在每一轮测试结束时被调用
的,工作负载模块可以在这个时刻进行
set.js举例
一个需要增删改合约数据
'use strict';module.exports.info = ' setting name';let bc, contx;
let txnPerBatch;module.exports.init = function (blockchain, context, args) {txnPerBatch = 1;bc = blockchain;contx = context;return Promise.resolve();
};/** * 生成调用合约函数的abi* @param * @return*/
function generateWorkload() {let workload = [];for (let i = 0; i < txnPerBatch; i++) {let w = {'transaction_type': 'set(string)','n': 'hello! - from ' + process.pid.toString(),};workload.push(w);}return workload;
}module.exports.run = function () {let args = generateWorkload();// 调用增删改函数修改合约return bc.invokeSmartContract(contx, 'helloworld', 'v0', args, null);
};module.exports.end = function () {// Do nothingreturn Promise.resolve();
};
get.js举例
'use strict';module.exports.info = ' querying name';let bc, contx;module.exports.init = function (blockchain, context, args) {// Do nothingbc = blockchain;contx = context;return Promise.resolve();
};module.exports.run = function () {// 查询函数查询合约状态return bc.queryState(contx, 'helloworld', 'v0', null, 'get()');
};module.exports.end = function () {// Do nothingreturn Promise.resolve();
};
负载文件对应的合约文件
pragma solidity ^0.4.2;contract HelloWorld {string name;constructor() public {name = "Hello, World!";}function get() public view returns (string) {return name;}function set(string n) public {name = n;}
}
相关文章:
Caliper压力测试
目前FISCO BCOS适配的Caliper版本为0.2.0,请在部署Caliper运行环境时确保Caliper的版本为0.2.0,如在部署或使用过程中遇到任何问题,请优先参考 https://github.com/FISCO-BCOS/FISCO-BCOS/issues/1248 中的解决方案进行排查。 1. 环境要求 …...

【iOS安全】使用LLDB调试iOS App | LLDB基本架构 | LLDB安装和配置
LLDB基本架构 参考: https://crifan.github.io/ios_re_dynamic_debug/website/debug_code/lldb_debugserver.html https://book.crifan.org/books/ios_re_debug_debugserver_lldb/website/ LLDB安装和配置 1. 让iPhone中出现/Developer/usr/bin/debugserver 最初…...
一、核心概念深入解析
一、核心概念深入解析 1. shared_ptr 的线程安全性澄清 引用计数是原子操作:shared_ptr 的引用计数(use_count)在多线程中递增 / 递减是安全的(原子操作),但对象本身的读写需额外同步(如 std:…...
python直方图
在Python中,绘制直方图(Histogram)是一项非常常见的任务,通常用于数据可视化,以展示数据的分布情况。Python中有多种库可以绘制直方图,其中最常用的两个库是Matplotlib和Seaborn。此外,Pandas库…...
[特殊字符] Unity 性能优化终极指南 — Text / TextMeshPro 组件篇
UGUI Text组件的不当使用及其性能瓶颈与优化 在Unity UGUI系统中,Text 组件(或其升级版 TextMeshPro)是显示文本信息的核心元素。然而,如果不当使用,它极易成为UI性能瓶颈的罪魁祸首,尤其是在预制体、属性…...

Idea 配置 Maven 环境
下载 Maven 官网:https://maven.apache.org/index.html 点击左侧 Downloads,然后选择 Files 中的 zip 包下载(下载慢可以使用迅雷) 配置 Maven 将压缩包解压,比如我解压后放到了 D:\developer\environment\apache-…...
git clone报错:SSL certificate problem: unable to get local issuer certificate
上述报错的完整信息是: Cloning into test... fatal: unable to access https://github.com/xxxx/xxxx.git/: SSL certificate problem: unable to get local issuer certificate 该报错表示 Git 在使用 HTTPS 协议克隆仓库时,无法验证 GitHub 的 SSL …...

Kafka 如何保证不重复消费
在消息队列的使用场景中,避免消息重复消费是保障数据准确性和业务逻辑正确性的关键。对于 Kafka 而言,保证不重复消费并非单一机制就能实现,而是需要从生产者、消费者以及业务层等多个维度协同配合。接下来,我们将结合图文详细解析…...
SpringBoot整合MyBatis完整实践指南
在Java企业级应用开发中,SpringBoot和MyBatis的组合已经成为主流的技术选型方案之一。本文将详细介绍如何从零开始搭建一个基于SpringBoot和MyBatis的项目,包括环境配置、数据库设计、实体类创建、Mapper接口编写以及实际应用等完整流程。 一、环境准备…...

RNN结构扩展与改进:从简单循环网络到时间间隔网络的技术演进
本文系统介绍 RNN 结构的常见扩展与改进方案。涵盖 简单循环神经网络(SRN)、双向循环神经网络(BRNN)、深度循环神经网络(Deep RNN) 等多种变体,解析其核心架构、技术特点及应用场景,…...
docker中,容器时间和宿机主机时间不一致问题
win11下的docker中有个mysql。今天发现插入数据的时间不正确。后来发现原来是docker容器中的时间不正确。于是尝试了各种修改,什么run -e TZ"${tzutil /g}",TZ"Asia/Shanghai",还有初始化时带--mysqld一类的,…...
Unity Shader编程】之高级纹理
一,立方体纹理 Cubemap 用途 用途说明反射贴图表面镜面高光或金属反射环境光采样模拟环境对物体的影响天空盒背景使用六张图拼接场景背景全景投影做360度相机渲染、投影等 二,创建立方体纹理 在 Unity 中创建和保存一个 立方体纹理(Cubema…...

类 Excel 数据填报
类 Excel 填报模式,满足用户 Excel 使用习惯 数据填报,可作为独立的功能模块,用于管理业务流程、汇总采集数据,以及开发各类数据报送系统,因此,对于报表工具而言,其典型场景之一就是利用报表模…...
vscode调试stm32,Cortex Debug的配置文件lanuch.json如何写,日志
https://blog.csdn.net/jiladahe1997/article/details/122046665 https://discuss.em-ide.com/blog/67-cortex-debug 第一版 {// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?li…...

Office文档图片批量导出工具
软件介绍 本文介绍一款专业的Office文档图片批量导出工具。 软件特点 这款软件能够批量导出Word、Excel和PPT中的图片,采用绿色单文件设计,体积小巧仅344KB。 基本操作流程 使用方法十分简单:直接将Word、Excel或PPT文件拖入软件…...

【iOS】ARC 与 Autorelease
ARC 与 Autorelease 文章目录 ARC 与 Autorelease前言何为ARC内存管理考虑方式自己生成的对象,自己持有非自己生成的对象,自己也可以持有不再需要自己持有的对象时释放非自己持有的对象无法释放 ARC的具体实现编译期和运行期ARC做的事情ARC实现: __autoreleasing 与 Autoreleas…...
人工智能在智能零售中的创新应用与未来趋势
随着电子商务的蓬勃发展和消费者需求的不断变化,零售行业正面临着前所未有的挑战和机遇。智能零售作为零售行业的重要发展方向,通过引入人工智能(AI)、物联网(IoT)、大数据和云计算等前沿技术,正…...
业务材料——半导体行业MES系统核心功能工业协议AI赋能
一、前置概念 半导体行业 半导体行业主要生产基于半导体材料(如硅、锗、化合物半导体等)的电子元器件及相关产品,广泛应用于计算、通信、能源、医疗等领域。 MES系统 MES系统(Manufacturing Execution System,制造…...
docker部署命令行 — 启动一个 MySQL 数据库服务 并且把它的数据存储挂载到卷(volume)里
挂载卷的配置写法: version: "3" services:db:image: mysqlvolumes:- mysql_data:/var/lib/mysqlvolumes:mysql_data:这段 docker-compose.yml 配置非常典型,是用来启动一个 MySQL 数据库服务 并且把它的数据存储挂载到卷(volume&…...

铁电液晶破局 VR/AR:10000PPI 重构元宇宙显示体验
一、VR/AR 沉浸感困境:传统显示技术的天花板在哪? (一)纱窗效应与眩晕感:近眼显示的双重枷锁 当用户戴上 VR 头显,眼前像素网格形成的 “纱窗效应” 瞬间打破沉浸感。传统液晶 500-600PPI 的像素密度&…...
2025年微信小程序开发:AR/VR与电商的最新案例
引言 微信小程序自2017年推出以来,已成为中国移动互联网生态的核心组成部分。根据最新数据,截至2025年,微信小程序的日活跃用户超过4.5亿,总数超过430万,覆盖电商、社交、线下服务等多个领域(WeChat Mini …...
从零开始,学会上传,更新,维护github仓库
以下是一份从头到尾、覆盖安装、配置、创建仓库、上传项目到 GitHub 的完整教程。全程使用通用示例,不包含任何具体的仓库链接,仅供参考。 一、准备工作 1. 注册 GitHub 账号 打开浏览器,访问 GitHub 官网(输入 “GitHub” 即可找…...
#STM32 HAL库实现的STM32F407时钟配置程序以及和STM32F103配置对比
以下是使用STM32 HAL库实现的STM32F407时钟配置完整代码(基于8MHz外部晶振,配置为168MHz系统时钟),包含详细注释和关键点说明: 完整HAL库实现(system_stm32f4xx.c main.c) 1. 首先在stm32f4xx…...

竞争加剧,美团的战略升维:反内卷、科技与全球化
5月26日,美团发布2025年第一季度业绩报告,交出了一份兼具韧性与创新性的成绩单。 报告显示,公司一季度总营收866亿元,同比增长18%;核心本地商业收入643亿元,同比增长18%;季度研发投入58亿元&a…...

(17)课36:窗口函数的例题:例三登录时间与连续三天登录,例四球员的进球时刻连续进球。
(89)例三登录时间 : 保留代码版本 : CREATE TABLE sql_8( user_id varchar(2), login_date date ); insert into sql_8(user_id,login_date) values(A,2024-09-02),(A,2024-09-03),(A,2024-09-04),(B,2023-11-25),(B,2023-12- 3…...

高性能分布式消息队列系统(二)
上一篇博客将C进行实现消息队列的用到的核心技术以及环境配置进行了详细的说明,这一篇博客进行记录消息队列进行实现的核心模块的设计 五、项目的需求分析 5.1、项目框架的概念性理解 5.1.1、消息队列的设计和生产消费者模型的关系 在现代系统架构中,…...
Spring 官方推荐构造函数注入
1. 依赖关系明确 构造函数注入可以清晰地声明类的依赖关系,所有必需的依赖项都通过构造函数参数传递,使得代码的可读性更高。这种方式让类的使用者能够直观地了解类的依赖,而不需要通过注解或反射来猜测。 2. 增强代码健壮性 构造函数注入…...

华为OD机试真题——天然蓄水库(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
2025 A卷 200分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 2025华为OD真题目录+全流程解析/备考攻略/经验分享 华为OD机试真题《天然蓄水库》: 目录 题目…...

【Harmony OS】数据存储
目录 数据存储概述 首选项数据存储 关系型数据库 数据存储概述 • 数据存储 是为了解决应用数据持久化问题,使得数据能够存储在外存中,达到保存或共享目的。 • 鸿蒙应用数据存储包括 本地数据存储 和 分布式数据存储 。 • 本地数据存储 为应用…...

MybatisPlus--核心功能--service接口
Service接口 基本用法 MyBatisPlus同时也提供了service接口,继承后一些基础的增删改查的service代码,也不需要去书写。 接口名为Iservice,而Iservice也继承了IRepository,这里提供的方法跟BaseMapper相比只多不少,整…...