项目方说性能达到百万TPS,如何测试它的可信度?

应用系统性能提升的关键在于运维端的接入管理模型(AAA,认证 Authentication、授权 Authorization、计费 Accounting)及业务端的并发(Concurrency)/ 吞吐量 (Throughput) 模型。区块链是典型的“运维友好型”系统,天然的自我治理能力极大程度上优化了接入管理模型,但现有区块链系统的并发 / 吞吐量模型指标却饱受诟病。无论是 BTC 的 7tps,还是 ETH 的 40tps 在传统业务系统动辄万级甚至十万级 tps 面前都难以抬头。

区块链项目的需求:

  • 聚焦底层基础设施,项目自身行业或领域特征不明显,易引入本行业业务;

  • 能够实现微服务级部署,扩容友好,易迁移部署;

  • 并发吞吐量 5k+,稳定支撑 10w 级 DAU,可靠性强。

根据需求有的放矢地寻觅区块链项目,寻觅的过程其实远比想象的简单。区块链项目多如牛毛,但纯做技术框架不扯业务场景或者经济模型的项目真心不多。通过对主流交易所的项目筛选,基本圈定了 EOS、QTUM、AELF 项目。EOS 官宣吞吐量约 3300~3500tps,QTUM 官宣吞吐量为 BTC 的十倍(权且估算 100tps),AELF 项目 7 月伊始发布测试网,官方暂未发布吞吐量信息。

现有的区块链系统业务处理能力普遍面向价值传递进行建设,因此对于区块链系统性能的评测思路应面向交易过程展开。AELF 项目在区块链架构方面主打的特征是“主链 + 多级侧链”,链间有专门的跨链算法实现相对隔离的业务单元间资源的协同,链内节点均运行于集群,节点内部通过并行化方案提升吞吐量指标。根据官方在社区披露的信息,测试网初期(即目前)提供主链并行计算模块的测试验证,确认主链性能后再灰度升级至多级侧链版本,从软件质量体系的角度而言是合理的。通过参与社区内的技术直播互动,也与项目技术团队充分探讨了 AELF 选用的几个技术方案,尤其是 Akka 并行框架。积极选用已被验证的成熟技术元素确实是做新系统、新基础设施时的难能可贵的姿态,进一步提升了对 AELF 项目的好感度。PS:该团队技术的人也在社区,很 NICE 很好沟通。

Transaction,传统 IT 人习惯叫“事务”,区块链圈的人通常叫“交易”,可能是 BTC 白皮书翻译传承下来的吧。软件测评应充分考虑软件质量体系的要求,同理,对于一个区块链底层架构而言,模拟价值传输压力的交易激励能够作为区块链底层基础设施 tps 指标的验证形式。

据此,先定义一个原子事务作为本次测试验证的基本测试用例——“合约转账”。1 次“合约转账”包括 2 次读 2 次写操作,具体步骤如下:

  • 从 A 账户读取余额(1 次读);

  • 从 B 账户读取余额(1 次读);

  • 从 A 账户减去金额(1 次写);

  • 从 B 账户增加金额(1 次写)。

因之前接触过 BTC,深深叹服中本聪大神 UTXO 体系设置的精妙,但传统应用系统往往还是依赖账户模型体系,因此选用一个经典的原子转账事务作为标准测试用例,并以该用例的执行效率作为吞吐量指标的依据。AELF 支持区块链智能合约,上述原子事务须编写为合约脚本部署至测试网。

进而,再定义一个基本的测试流程梗概:

该测试流程可作为一个典型的区块链性能测评策略。以一次“合约转账”为一个基本业务执行单元,编写运行于区块链平台上的“合约脚本”程序,该程序能够被区块链系统各节点部署并执行。实施测评前需依据特定的用例或随机生成测试用例初始化测试数据,不同场景、不同轮次的测评实施须基于相同的测试数据以确保测试结果可信。测试数据作为交易申请相继对主网发起激励,对于 AELF 此类采用分布式并行化思想进行架构设计的项目,可采用多组数据并发激励的形式以测试较高并发交易场景下区块链系统的性能。测试过程中,可通过实时监视或特定时间片监视的方式判定测试用例的执行情况,时间片可设置为出块周期的 N 倍(N<=6,借鉴 BTC 主网 6 区块确认的惯例)。

继续定义不同的测试场景:

  • 场景 I:单机场景,1 业务处理节点 +1 业务数据集;

  • 场景 II:集群 - 单机场景,N 业务处理节点 +1 业务数据集;

  • 场景 III:分布式集群场景,N 业务处理节点 +N 业务数据集。

单机场景旨在验证区块链系统的独立性能,因区块链为分布式集群系统,针对单机场景测评验证对于最终全网性能指标结论的意义不是很大,但有助于我们更好地定义集群测试的边界。如单机测评的性能指标为 P,进行集群测评时能够以 P 为基础通过节点 / 进程增长与性能指标增长之间的关系判定是否有必要进行更大规模的测评验证。此外,在单机测试的过程中通过补充带有网络延迟的测试环境有助于对网络环境影响因素进行基本的定量。

集群 - 单机场景旨在针对面向区块链底层平台所支撑的实际业务类型进行覆盖性测试。区块链技术本身是去中心化的,但区块链系统所支撑的上层业务可能有中心化特征,因此需要进行多对一场景的模拟测评。该场景的设计针对数据 I/O 存在固定瓶颈的情况下对区块链系统业务处理吞吐量进行定量测评。

分布式集群场景旨在针对处于 P2P 网络拓扑中交易执行处理与交易数据协同均需实现区块链共识的业务场景进行覆盖性测试。该场景为典型的区块链系统场景,通过单机场景及集群 - 单机场景的测评,能够辅助我们对该场景下的测试边界及测试差异性因子进行综合分析,确定测试实施的方式及被测部署环境的典型性,从而得到较为可靠的测评结论。

区块链系统的运行有多个层次,区块链程序可被部署至多台服务器(Server),每台服务器可运行多个进程级实例(Worker),对 AELF 而言,每个实例内可以配置多个并行化业务单元(Actor)。因此性能指标 TPS 受服务器、进程、业务单元的影响均需在测试中体现,最优 TPS 测评结果应表现在一个适宜的服务器、进程、业务单元配置之下,在测试条件允许之内寻找这个最优的配置也是本次测评的目的之一。

综上,拟实现的测试验证目的包括但不限于单服务节点运行状态下的并发执行能力及集群环境下的性能延展性。

对 AELF 测试网进行开发接入的核心是厘清 Benchmark 环境,通过与技术团队的咨询交流,下述为基本的搭建与部署执行步骤。

克隆及编译 代码:

  • git clone https://github.com/AElfProject/AElf.git aelf

  • cd aelf

  • dotnet publish –configuration Release -o /temp/aelf

确认 配置文件目录

  • Mac/Linux: ~/.local/share/aelf/config

  • Windows: C:\Users\xxxxx\AppData\Local\aelf\config

配置数据集 信息:

  • 将代码中的 aelf/config/database.json 拷贝至配置文件目录

  • 根据本机 Redis 安装情况修改配置

单机场景 部署:

将代码中的 aelf/config/actor.json 拷贝至配置文件目录,并根据本机情况配置 IsCluster、WorkerCount、Benchmark、ConcurrencyLevel

运行 ConcurrencyManager

dotnet AElf.Concurrency.Manager.dll --actor.host 192.168.100.1 --actor.port 4053

// --actor.host Manager 的 IP 地址 --actor.port Manager 的监听端口

将代码中的 aelf/config/actor.json 拷贝至配置文件目录,并根据本集群情况配置 IsCluster、HostName、WorkerCount、Benchmark、ConcurrencyLevel、Seeds

运行 ConcurrencyWorker

如 Worker 收到 Manager 的欢迎信息则说明该 Worker 加入集群,后续节点扩容可依托此环境开展

运行 Benchmark 

上图测试环境为 8 个 Redis 实例构建的集群,5 个 Twemproxy,每台服务器连接不同的 Twemproxy,TPS 指标能够随扩容而增长至理想值附近。

其他相关测试参数:使用 240000 个交易,重复 5 次。

通过上述测试验证的执行结果基本能够看出随着系统的扩容,吞吐量性能指标的增长是较为健康的,测试范围之内预期最优指标约为 1.3w~1.5w tps。此外,在每一组特定的部署模式下,能够通过系统调优获得平均约 10%~15% 的性能提升,吞吐量性能曲线的极值点符合较为合理,符合快升缓降的泊松分布。目前小拓扑集群下的环境搭建验证基本能够满足中小型业务系统的吞吐量需求,初步可应用于传统应用系统的优化重构——当然,只用区块链技术做分布式数据库和通信组件难免有点大材小用,后续还需关注多级侧链体系的测试情况,进一步融和分布式业务模型。

简单的测试验证后,同为搬砖码农的笔者也有一些建议给 AELF 技术团队:

  • 当 Transaction 数量级较大,且后续引入侧链的结构较复杂时,目前的分组策略耗时可能会有比较显著的提升,如 10w 级事务分 1k 级处理单元组时,可能的分组时间会达到 800ms~1000ms,分组策略在后续多级侧链体系下有待进一步优化;

  • 系统目前配置的 Round-Robin-Group 路由策略在生产环境下并非最优,路由能力可通过配置调优的方式得到进一步提升;

  • 并行化事务处理过程中建议增加健康状态监控机制,如 MailBox,以方便运维、开发团队了解执行过程及定位问题,否则复杂关联事务的死锁可能会导致无法预见的系统失效。

刨除掉上述三点,该测试网目前的表现可圈可点,后续进展值得期待。以上即为对区块链性能评测的方案分享。

项目方说性能达到百万TPS,如何测试它的可信度?的更多相关文章

  1. MongoDB的真正性能-实战百万用户

    阅读目录 一.第一个问题:Key-Value数据库可以有好多的Key,没错,但对MongoDB来说,大错特错 二.第二个问题:FindOne({_id:xxx})就快么? 三.第三个问题:精细的使用U ...

  2. 《阿里如何实现秒级百万TPS?搜索离线大数据平台大数据平台架构解读》读后感

    在使用淘宝时发现搜索框很神奇,它可以将将我们想要的商品全部查询出来,但是我们并感觉不到数据库查询的过程,速度很快.通过阅读这篇文章让我知道了搜索框背后包含着很多技术,对我以后的学习可能很有借鉴. 平时 ...

  3. 使用BeetleX的TcpBenchmark工具进行百万设备模拟测试

    其实TCP测试的工具有很多,那BeetleX工具所提供的特点又是什么呢?如果你需数十万的请求或模拟上百万的设备连接,那这个工具相信可以满足你的需要!工具是基于BeetleX的基础功能扩展,支持多IP绑 ...

  4. 项目开发过程中什么是开发环境、测试环境、生产环境、UAT环境、仿真环境?

    项目开发过程中什么是开发环境.测试环境.生产环境.UAT环境.仿真环境? 最近在公司项目开发过程中总用到测试环境,生产环境和UAT环境等,然而我对环境什么的并不是很理解它的意思,一直处于开发阶段,出于 ...

  5. MongoDB的真正性能-实战百万用户一-一亿的道具

    使用情景 开始之前,我们先设定这样一个情景: 1.一百万注册用户的页游或者手游,这是不温不火的一个状态,刚好是数据量不上不下的一个情况.也刚好是传统MySql数据库性能开始吃紧的时候. 2.数据库就用 ...

  6. [转]MySQL关键性能监控(QPS/TPS)

    原文链接:http://www.cnblogs.com/chenty/p/5191777.html 工作中尝尝会遇到各种数据库性能调优,除了查看某条SQL执行时间长短外,还需要对系统的整体处理能力有更 ...

  7. MySQL关键性能监控(QPS/TPS)

    原文链接:http://www.cnblogs.com/chenty/p/5191777.html 工作中尝尝会遇到各种数据库性能调优,除了查看某条SQL执行时间长短外,还需要对系统的整体处理能力有更 ...

  8. 谈谈如何查看Android项目方法数

    我们都知道,Android App的方法数是有天花板的,在方法数达到65536时,就会出现打包异常,这个时候,我们需要去除一些不需要的三方工具包,或者采用多Dex技术分包,都能达到正常打包的效果. 可 ...

  9. 《阿里如何实现秒级百万TPS?搜索离线大数据平台架构解读》--阅读

    离线?在阿里搜索工程体系中我们把搜索引擎.在线算分.SearchPlanner等ms级响应用户请求的服务称之为“在线”服务:与之相对应的,将各种来源数据转换处理后送入搜索引擎等“在线”服务的系统统称为 ...

随机推荐

  1. 常用的shell脚本(安全方向)

    更多shell脚本参考:https://blog.51cto.com/zero01/2046242 1.拒绝密码撞库攻击的ip shell脚本:实现对登录主机失败10次以上的ip进行拒绝登录 #! / ...

  2. Vue中 export default 和 export 区别

    1.export与export default均可用于导出常量.函数.文件.模块等2.在一个文件或模块中,export.import可以有多个,export default仅有一个3.通过export ...

  3. 使用shell脚本监控用户登陆服务器并发送提示信息给微信

    1.需要在/etc/ssh/目录下面创建一个名为sshrc的文件,执行权限可给可不给,那么在有人通过ssh远程登录这台服务器的时候,这段脚本就会被执行 #!/bin/bash ###V1---### ...

  4. 0703-spring cloud config-git配置属性加解密之对称加密

    一.概述 可以使用{cipher} *格式的加密值,只要有一个有效的密钥,那么它们将在主应用程序上下文获取环境之前被解密.要在应用程序中使用加密功能,您需要在您的类路径中包含Spring Securi ...

  5. 【剑指offer】把数组排成最小的数

    一.题目: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 二.思路: ...

  6. SpringMVC在使用Jackson2时关于日期类型格式化的问题

    SpringMVC在使用Jackson2时关于日期类型格式化的问题 如果无效,那么使用 @DateTimeFormat(pattern = "yyyy-MM-dd")

  7. Font Awesome 最简单应用例子

    简介: Font Awesome为您提供可缩放的矢量图标,您可以使用CSS所提供的所有特性对它们进行更改,包括:大小.颜色.阴影或者其它任何支持的效果. 使用方法: 引入<link rel=&q ...

  8. mysql的查询

    1.单表查询 单表查询的语法 SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT 限制条数 ...

  9. Java 基础 面向对象之构造方法和关键字

    构造方法 构造方法简介 在开发中经常需要在创建对象的同时明确对象的属性值,比如员工入职公司就要明确他的姓名.年龄等属性信息. 那么,创建对象就要明确属性值,那怎么解决呢?也就是在创建对象的时候就要做的 ...

  10. CSS选择器操作大全

    一,CSS选择器分类 二,选择器语法 1,基本选择器语法 选择器 类型 功能描述 *  通配选择器  选择文档中所以HTML元素 E  元素选择器 选择指定类型的HTML元素 #id  ID选择器 选 ...