现在,区块链技术被广泛应用在各行各业中,也承受海量用户、海量数据的挑战,越来越多同学开始关注链与合约的性能。本文别离从原理、实操和技巧三个方面,为大家提供了详尽的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地址
https://github.com/FISCO-BCOS…
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].
步骤二:执行压测程序
转账场景压测的操作分为两步:
筹备:批量生成转账用户并初始化用户金额(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
压测:用户间两两转账(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越低。(所以咱们举荐链上的事务尽量简洁,只蕴含须要多方共识的外围事务。)
找出被压测的合约(Ok.sol);
编译合约生成java代码(Ok.java),并集成入Java-SDK-Demo中;
编写压测程序(PerformanceOk.java);
编译代码并部署到你的压测环境;
压测,且保障所有的交易后果都是失常的,谬误的交易后果使压测意义不大。
所有开发均在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
性能晋升技巧
当你辛辛苦苦地实现了一次压测,发现后果不是很称心,那么就要回过头从“调参”一节从新开始了。这里再强调一些要害技巧,能够让你对压测过程有更强的把控能力。
环境 :在压测的过程中,亲密察看压测客户端和链的环境参数。包含: CPU利用率,保障多个CPU的核都尽量跑满;
网络流量,判断网速是否已成为瓶颈;
硬盘IO状况(尤其是IO Wait指标),判断是否达到了存储能力的瓶颈;
内存,个别不会有太大的问题,但极其状况下,如果内存不足,压测过程有可能会挂住。
以上察看办法,都能够用根本的Linux(或对应操作系统)根底指令,作为压测执行者,对操作系统肯定要足够纯熟,对指令打印的信息要有足够了解。
优化合约逻辑 :如缩小合约接口参数,慎用数组、Mapping等简单的数据结构,精简合约里的计算逻辑、判断逻辑等,缩小不必要的事件(Event),对大的数据思考是否能够只将数据的哈希上链;确认是否能够采纳DAG并行合约引擎。还有一个大杀器,就是采纳FISCO BCOS预编译合约实现合约逻辑,对谋求极致性能的开发者,十分管用。
关注日志 :包含压测客户端的日志,节点的日志,以及系统日志,尤其是外面是否有产生谬误和正告,一旦出现异常,则应立即针对性地解决,不然有可能影响压测后果。程序日志里个别会有详细描述信息,能够参照形容先做本地剖析。
高效交换 :如果要在社群里征询压测问题,倡议把下面提到的配置先做充沛查看,记录压测过程的软硬件指标,说分明合约复杂度,先思考一下是否有串行、并行相干的问题和优化空间,并收集相干的日志信息,而后用多个截图或整合文档的形式一次性把问题发给社区小助手或其余专家小伙伴,以便高效和深刻地探讨。
「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珍藏 ,获取最新版本。