热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于区块链:一文说清FISCO-BCOS性能压测附实例教程

现在,区块链技术被广泛应用在各行各业中,也承受海量用户、海量数据的挑战,越来越多同学开始关注链与合约的性能。本文别离从原理、实操和技巧三个方面,为大家提供了详尽的FISCOBCOS性能压测指引,联合实例进行演示,总结出压测实用技巧与常见问题,以便大家更好地晋升性能。


“我的区块链能跑多少TPS?”“能不能达到‘官网’所说的峰值?”“为啥总是压不下来?是我的机器不够好吗?”

现在,区块链技术被广泛应用在各行各业中,也承受海量用户、海量数据的挑战,越来越多同学开始关注链与合约的性能。
本文别离从原理、实操和技巧三个方面,为大家提供了详尽的FISCO BCOS性能压测指引,联合实例进行演示,总结出压测实用技巧与常见问题,以便大家更好地晋升性能。

压测原理

压测这事,原理其实不简单,起一个或一堆区块链客户端,先往链上部署一个用来压测的合约或者须要评估性能的智能合约,而后卯足了劲往链上“并发”发送交易,收到区块链返回的交易执行后果(交易回执)后,统计出TPS。

因为区块链分布式网络播送、交易排队打包、共识确认等流程还是比拟漫长的,两头充斥了技术细节,往往导致后果不如预期,这就须要在环境、参数、压测程序以及合约逻辑等方面下功夫,能力失去现实的后果(把计算资源用到极致)、以及确切的后果(我的环境峰值就这么高了)。

深刻压测细节

压测前先“调参”

压测这事一般来说是一个长时间的“力气活”,在启动之前,肯定要先做好足够的筹备。以下一些要害参数,要先调到“最优”。
总交易数:压测程序在一次压测中总共发送的交易数量。强调一下,如果没有达到肯定数量级的交易,压测后果没有统计含意。比方理论TPS应该能够达到5000,那么只发几千到一两万交易的话,因为程序启动和进行等边界条件影响,后果意义不大,至多超过两个数量级的交易数(比方10万笔、整个过程继续1分钟以上),能力看出安稳解决阶段的TPS体现。

QPS(Queries Per Second):每秒申请数,即压测客户端发送交易的速率。形象地说就是:压测客户端能不能“喂饱”链节点,比方链的TPS性能在万级,那么一个压测客户端的发送能力是否足够,要具体评估,一个不够,就要起多个压测客户端,而且每个客户端发送的模式应该是异步的,如果每次都是发送一个交易而后同步等后果再发下一个,是很难“喂饱”区块链节点的(如何确保异步,参见SDK的接口定义)。

然而,QPS也不能过大,当QPS过大时,会让交易沉积在交易池中。这些沉积的交易不能被立刻执行,使得测出的TPS会小于理论的TPS。

合约复杂度:合约的复杂度对TPS后果会有极大影响。合约复杂度简略的了解就是代码量(对应指令数)、数据量(具体来说就是合约里关涉的状态数据量),还有很重要的一点是合约是否反对并行事务逻辑。并行能力用尽服务器资源,要达到并行处理成果,除了上一条所说的压测客户端须要异步发送之外,FISCO BCOS的合约是反对DAG并行计算的,一个一般合约,如果在事务上能够反对并行,关上DAG并行设置,能力用尽服务器上所有的CPU计算能力,否则实际上也是在“串行”解决,只用了一个CPU,成果必定不会太好。
DAG并行合约开发参见:
https://fisco-bcos-documentat…)

链参数配置: 有几个要害的链参数和性能体现相干,包含多长时间出一个区块,一个区块里能打包多少个交易。在压测场景里,这几个数字要配置得比拟适合,咱们默认500ms尝试将交易池(大小:[tx_pool].limit)中的交易打包成一个区块(打包距离:[consensus]. min_block_generation_time),每个默认最多1000笔交易(区块最大交易数:tx_count_limit)。

同时,节点会主动保障在1秒内出一个块。如果出以后区块的工夫大于1秒,下一个区块会少打包一些交易,若小于1秒,会依据设置的区块最大交易数下限尽量打包交易。若单纯为了压测,举荐将打包距离尽可能调小,并重复调节区块最大交易数,让出块工夫平均稳固的同时,尽量迫近最大值。此处举荐将打包距离设置为1ms,区块最大交易数最低为10000笔起步,依据理论后果向上调整。可参考文末“FISCO BCOS 配置文档”进行配置。

硬件配置:如果想要失去尽量高的TPS,要采纳性能更好的硬件。具体而言就是服务器核数越多越好,内存越拮据越好;肯定要用高速机械硬盘或SSD硬盘,慎用绝对低速的网络存储设备,硬盘的IO速度对链的区块和状态写入速度有微小的影响;网络带宽越大提早越低越好,保障压测程序和链节点之间的网络,以及节点和节点之间的网络是畅通高效的。

其余调整:压测客户端和链的日志级别最好开到Error级,尽量地缩小日志输出量。环境里如有其余占用资源(CPU、内存、硬盘网络等)的程序,无妨临时退出。之前有开发者的压测把硬盘写满了,所以当时腾一下硬盘也是有必要的。

压测后果含意

  • 正确/谬误交易数:如果压测后果蕴含很多谬误或超时的交易,那么本次压测的意义不大。一般来说达到99%及以上的正确率,对业务才有意义。
  • TPS(Transactions Per Second):每秒解决交易数,即区块链解决此类型交易的性能。

压测操作

应用已有压测程序Java-SDK-Demo

FISCO BCOS提供了基于 Java-SDK实现的压测程序:Java-SDK-Demo。
*旧版本中提供了基于Caliper的压测程序,欢送各位开发者继续优化Caliper压测程序。在本文,更举荐应用Java-SDK-Demo。
Java-SDK-Demo Github地址

  • 压测 FISCO BCOS 2+ 版本:

https://github.com/FISCO-BCOS…

  • 压测 FISCO BCOS 3+ 版本:

https://github.com/FISCO-BCOS…

压测场景

  • 转账场景
  • KVTable场景
  • DMC场景
  • 更多请查看压测程序目录

压测办法

参考我的项目下的README

操作实例
本操作以 Java-SDK-demo 中的转账场景进行举例。

  • 转账合约:ParallelOk.sol
  • 压测程序:ParallelOkPerf.java

步骤一:查看压测命令
*命令中提醒的[tps]理论含意为QPS,即该压测程序的交易发送速率。

$ cd java-sdk-demo/dist/
$ java -cp 'conf/:lib/*:apps/*' org.fisco.bcos.sdk.demo.perf.ParallelOkPerf
Usage:
===== ParallelOk test===========
java -cp 'conf/:lib/*:apps/*' org.fisco.bcos.sdk.demo.perf.ParallelOkPerf [parallelok] [groupId] [add] [count] [tps] [file] [enableDAG].
java -cp 'conf/:lib/*:apps/*' org.fisco.bcos.sdk.demo.perf.ParallelOkPerf [parallelok] [groupId] [transfer] [count] [tps] [file] [enableDAG].

步骤二:执行压测程序

转账场景压测的操作分为两步:

  1. 筹备:批量生成转账用户并初始化用户金额(add)
    *执行后,生成用户列表文件user1000.txt,下一步会用到。
# java -cp 'conf/:lib/*:apps/*' org.fisco.bcos.sdk.demo.perf.ParallelOkPerf parallelok] [groupId] [add] [count] [tps] [file] [enableDAG]
# 参数:压测parallelok合约,群组group0,操作是增加用户add,用户数1000,qps=1000,要生成的用户列表文件名,启动交易并行执行
java -cp 'conf/:lib/*:apps/*' org.fisco.bcos.sdk.demo.perf.ParallelOkPerf parallelok group0 add 1000 1000 user1000.txt true
  1. 压测:用户间两两转账(transfer)
    *可一直反复此步骤,调整参数进行压测。
# java -cp 'conf/:lib/*:apps/*' org.fisco.bcos.sdk.demo.perf.ParallelOkPerf [parallelok] [groupId] [transfer] [count] [tps] [file] [enableDAG]
# 参数:压测parallelok合约,群组group0,操作时用户转账transfer,总交易数10000,qps=1000,应用的用户列表文件,启动交易并行执行
java -cp 'conf/:lib/*:apps/*' org.fisco.bcos.sdk.demo.perf.ParallelOkPerf parallelok group0 transfer 10000 1000 user1000.txt true

步骤三:查看后果

TPS

  • 包含谬误交易:TPS(include error requests)
  • 不包含谬误交易:TPS(exclude error requests)

正确/谬误交易数

validation:
user count is 1000
verify_success count is 1000
verify_failed count is 0

残缺后果

Total transactions: 10000
Total time: 12676ms
TPS(include error requests): 788.8923950773114
TPS(exclude error requests): 788.8923950773114
Avg time cost: 1221ms
Error rate: 0.0%
Time area:
0   

压测自定义合约

开发压测程序,压测自定义合约,与开发一个区块链利用一样,可参考区块链利用开发文档,参考仿写即可。
以Ok.sol为例,该合约蕴含的是一个根底的链上资产转让逻辑,是比拟精简的合约,适宜用来测验链的根本解决能力。如果你的业务逻辑较为简单,首先请清晰地了解这一点:合约逻辑越简单,TPS越低。(所以咱们举荐链上的事务尽量简洁,只蕴含须要多方共识的外围事务。)

  1. 找出被压测的合约(Ok.sol);
  2. 编译合约生成java代码(Ok.java),并集成入Java-SDK-Demo中;
  3. 编写压测程序(PerformanceOk.java);
  4. 编译代码并部署到你的压测环境;
  5. 压测,且保障所有的交易后果都是失常的,谬误的交易后果使压测意义不大。

所有开发均在Java-SDK-Demo中进行,需开发的三个文件及目录构造如下:

  • 合约:Ok.sol
  • 合约编译出的Java代码:Ok.java
  • 压测程序:PerformanceOk.java
java-sdk-demo/src/main/java/org/fisco/bcos/sdk/demo
                                              ├── contract
                                              │   ├── Ok.java
                                              │   └── sol
                                              │       └── Ok.sol
                                              └── perf
                                                  └── PerformanceOk.java

性能晋升技巧

当你辛辛苦苦地实现了一次压测,发现后果不是很称心,那么就要回过头从“调参”一节从新开始了。这里再强调一些要害技巧,能够让你对压测过程有更强的把控能力。

  1. 环境:在压测的过程中,亲密察看压测客户端和链的环境参数。包含:
    CPU利用率,保障多个CPU的核都尽量跑满;

网络流量,判断网速是否已成为瓶颈;

硬盘IO状况(尤其是IO Wait指标),判断是否达到了存储能力的瓶颈;

内存,个别不会有太大的问题,但极其状况下,如果内存不足,压测过程有可能会挂住。

以上察看办法,都能够用根本的Linux(或对应操作系统)根底指令,作为压测执行者,对操作系统肯定要足够纯熟,对指令打印的信息要有足够了解。

  1. 优化合约逻辑:如缩小合约接口参数,慎用数组、Mapping等简单的数据结构,精简合约里的计算逻辑、判断逻辑等,缩小不必要的事件(Event),对大的数据思考是否能够只将数据的哈希上链;确认是否能够采纳DAG并行合约引擎。还有一个大杀器,就是采纳FISCO BCOS预编译合约实现合约逻辑,对谋求极致性能的开发者,十分管用。
  2. 关注日志:包含压测客户端的日志,节点的日志,以及系统日志,尤其是外面是否有产生谬误和正告,一旦出现异常,则应立即针对性地解决,不然有可能影响压测后果。程序日志里个别会有详细描述信息,能够参照形容先做本地剖析。
  3. 高效交换:如果要在社群里征询压测问题,倡议把下面提到的配置先做充沛查看,记录压测过程的软硬件指标,说分明合约复杂度,先思考一下是否有串行、并行相干的问题和优化空间,并收集相干的日志信息,而后用多个截图或整合文档的形式一次性把问题发给社区小助手或其余专家小伙伴,以便高效和深刻地探讨。

「FAQ」


Q FISCO BCOS在什么环境下压测达到2万以上TPS?
A 共识节点别离部署在单个服务器上,每台服务器24核32G内存,万兆网的配置,在链参数失去正当优化、合约并行计算的根底上,能够实现数万以上TPS。

Q 我的环境下只能压到1K,如何晋升呢?
A 不同的合约对后果影响很大,有的合约在最好的硬件上可能也只能跑几百TPS,或者有一些坑被踩到了,比方是否同步调用合约、交易池开得太小等。可参考本文【压测技巧】,继续优化。

Q 我的CPU没跑满,是什么起因造成的?
A 最常见的起因是QPS没给够,其余的起因可能有:区块打包的交易数太少,可调大区块打包交易数;未采纳并行合约;合约逻辑中存储量过大,存储成为瓶颈。

Q 我调大了QPS,但呈现了很多谬误交易,如何调整呢?
A QPS远大于理论解决的TPS,造成大量交易缓存在交易池中超时了,在压测中只保障QPS仅略大于TPS即可。

Q 采纳Raft共识算法是不是比PBFT性能要高一些?
A 共识算法对TPS的影响很小,瓶颈在执行与存储。总的来说,压测过程是对性能的一种极致谋求,不仅仅是个力气活,须要对操作系统、区块链零碎的原理都有足够理解,相熟各种参数配置,晓得如何去收集数据、剖析问题、找瓶颈和冲破瓶颈,一次压测里可能会有屡次的重复,最终失去现实的后果,会是一种成就和喜悦。祝你的利用速度和规模都插翅腾飞。

参考链接

压测程序目录:

https://github.com/FISCO-BCOS…
ParallelOk.sol:

https://github.com/FISCO-BCOS…

ParallelOkPerf.java:

https://github.com/FISCO-BCOS…

区块链利用开发文档:

https://fisco-bcos-documentat…

Ok.sol:

https://github.com/FISCO-BCOS…

PerformanceOk.java:

https://github.com/FISCO-BCOS…

编译合约生成java代码:

https://fisco-bcos-documentat…

FISCO BCOS配置文档:

https://fisco-bcos-documentat…

预编译合约:

https://fisco-bcos-documentat…

并行合约开发方法:

https://fisco-bcos-documentat…

理解更多干货内容,请关注FISCO BCOS开源社区公众号,拜访FISCO BCOS代码仓库可下载我的项目所有源代码:https://github.com/FISCO-BCOS/FISCO-BCOS,欢送点击页面右上角star珍藏,获取最新版本。


推荐阅读
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 本文详细解析了JavaScript中相称性推断的知识点,包括严厉相称和宽松相称的区别,以及范例转换的规则。针对不同类型的范例值,如差别范例值、统一类的原始范例值和统一类的复合范例值,都给出了具体的比较方法。对于宽松相称的情况,也解释了原始范例值和对象之间的比较规则。通过本文的学习,读者可以更好地理解JavaScript中相称性推断的概念和应用。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
author-avatar
toelleconneely_348
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有