
有许多与区块链的逻辑和质量相关的指标。 它们有助于识别代码中的瓶颈,并在区块链的共识算法和最终算法中发现逻辑和优化问题。 分布式系统(包括区块链)的任何开发都需要同时分析多个节点的工作。 他们使项目团队可以监视整个区块链网络的状态,查看单个节点的问题,检测网络上DoS攻击的发生等等。 让我们看看主要的。 让我们潜入。
“每秒交易”
在分布式系统的情况下,TPS是一个非常混乱且模棱两可的数字,它并不总是反映提供给用户的服务的真实质量。 TPS测量来自分布式数据库。 数据库中的TPS已针对测试事务或其集合进行了标准化(某些INSERT,某些UPDATE,在常量SELECT的背景下进行了如此多的DELETE)以用于硬编码的集群配置,甚至在同一台机器上。 这些度量通常仅给出对分布式数据库或区块链性能的粗略估计,因为事务处理时间可能会因许多因素而有很大差异。
面向一致性的数据库(请参阅“ CAP定理”)只有在从其他节点收到足够数量的确认后才提交事务,这很慢。 面向可用性的数据库认为仅将事务写入磁盘即可成功。 他们立即为客户提供了更新的数据,而且速度非常快(尽管将来可能会回滚此事务)。 同样,如果基准测试中使用的事务仅更新一个单元格的数据,则TPS显然会高于事务可能影响多个单元格并相互阻塞的情况。 每个数据库中使用这些锁的算法都是以自己的方式实现的-这就是为什么我们一方面看不到Oracle,MSSQL,PostgreSQL与另一方面MongoDB,Redis,Tarantool之间的“ TPS竞争”的原因,这是非常不同的内部机制和不同的任务。
我认为,“测量TPS”是指对区块链的性能进行全方位的测量:
- 在可重复的条件下
- 具有接近现实的块验证器数量
- 使用各种类型的交易:
- 研究区块链的典型特征(例如,主要加密货币的transfer())
- 加载存储子系统(每笔交易都有大量更改)
- 加载带宽(大交易量)
- CPU负载(在进行大规模加密转换或计算的情况下)
要谈论珍贵的“每秒事务”,您需要描述所有条件(验证器的数量,其地理分布,丢包级别等)并描述基准测试的逻辑。 在区块链中,简单地将交易滚动到内部数据库并不意味着它已被共识接受。 例如,就工作量证明而言,从统计上讲,交易根本不会完成,并且如果某笔交易包含在一台机器上的某个区块中,则并不意味着该交易将被整个网络接受(例如,如果另一个分叉获胜)。
如果区块链具有用于确保交易最终性的其他算法(EOS,以太坊2.0,使用与GRANDPA最终性达成共识的Polkadot平行链),则可以将处理时间视为节点“看到”交易与该交易所在的下一个最终区块之间的间隔包括在内。 在项目承诺中很少看到这样的,更接近现实的“ TPS”。 自然,它们比白皮书中描述的要低,但是它们提供的信息尽可能多。
因此,我再次警告您,术语“ TPS”中可以包含许多不同的含义。 持怀疑态度,并要求提供详细信息。
特定于区块链的指标

本地TPS
由于通常在代码中显式分配执行此操作的功能,因此非常方便地衡量节点处理的事务数量及其在本地节点上处理的最大/平均/最小时间。 您可以通过更新状态数据库来简单地测量事务处理了多长时间。 这些事务可能尚未被共识接受,但是已经通过了验证,并且该节点已经可以向客户端提供更新的数据(假设未出现派生链)。
这个指标不是很诚实:如果选择链中的另一个作为主要分支,那么还必须回滚有关回滚事务的统计信息。 但是对于测试,这几乎总是可以忽略的。
通常,这是简短报告中写的数字:“我们的区块链昨天获得了8,000 tps”,因为它很容易测量-仅一个运行的节点和一个加载它的脚本就足够了。 在这种情况下,没有网络延迟,这会减慢网络达成共识的速度,并且该指标显示状态数据库的性能而不受网络影响。 这个数字不是区块链网络的实际带宽,但是显示了如果共识和网络足够快,它将努力达到的极限。
任何区块链交易的结果都是对存储进行了几次原子更新。 例如,比特币中的支付交易是删除几个旧的UTXO(删除)并添加几个新的UTXO(插入),而在以太坊中,这是执行简短的智能合约代码并再次更新几个键值对。 这些“原子”写操作的数量可以是一个极好的指标,它使您能够识别存储子系统和内部事务逻辑中的瓶颈。
此外,可以用多种编程语言来实现区块链节点-这更加可靠。 评估网络性能时应考虑到这一点,例如,Rust and Go的实现中存在以太坊节点。 其他区块链也寻求其他实现以提高可靠性。
本地生产的块数量
这个简单的指标显示了哪个验证器产生了多少块。 它是一种共识产品,可以被视为评估单个验证者网络“有用性”的主要产品。
验证员在每个模块上都赚钱,因此对机器的稳定运行和安全性很感兴趣。 该数字有助于确定哪个候选验证者最有资格,受保护并准备好在具有真实用户资产的公共网络上工作。 可以通过简单地下载区块链并计算谁产生了多少个区块来公开检查该指标的值。
最终性和最后不可逆的障碍
在具有明确实现的最终性(EOS,以太坊,Tendermint,Polkadot等)的网络中,除了基本的快速共识(每个块一个验证者签名就足够了)之外,某些块还需要一组验证者进行协调。 这些块被认为是最终的,而签名收集算法被认为是最终的。 终结性任务是确保终结块之前区块链中包含的所有交易都不会被抽出并且不会被链中的另一个分支所取代。 这是在权益证明网络中抵御双花攻击的一种保护措施,也是一种在几秒钟内快速将可靠的加密货币交易确认返回给用户的方法。
从区块链用户的角度来看,该交易在被节点接受时并不会完成,而是在一个确定交易所在链的区块出现时才完成。 要完成一个块,验证者必须在p2p网络上接收该块,并相互交换签名。 在这里检查区块链的真实速度,因为用户对通过其事务完成块的时刻感兴趣,而不仅仅是接受并将其写入节点之一的磁盘。
最终性算法也有所不同,相交并与主要共识相结合(请阅读:以太坊中的Casper,EOS中的Last Irreversible Blocks,Equality中的GRANDPA和Parity Polkadot中的GRANDPA及其修改,例如MixBytes RANDPA)。
对于并非每个块都完成的网络,有用的度量标准是最后确定的块与当前最后一个块之间的延迟。 这个数字显示了验证者是如何落伍的,他们同意正确的链条。 如果差距很大,那么终结算法需要额外的分析和优化。
其他区块链指标
其余指标通常在很大程度上取决于共识的类型,因此在主要指标中代表它们并不是很正确。 在这些参数中,例如:链叉的数量,它们在块中的长度,带有事务的块的占用率等。 它们可用于识别网络分离情况或快速定位特定验证程序的问题。
P2P层

记住区块链网络的中间基础-对等子系统非常重要。 是她在验证者之间的块和事务的传递中引入了模糊的延迟。 当验证器的数量很少时,它们将被本地化,对等体列表是经过硬编码的,一切都将快速有效地运行。 但是,由于“ tps”中会出现重大故障,因此值得添加验证器,在地理位置上分配节点并模拟数据包丢失。
例如,当使用可选的确定性算法测试EOS共识时,将验证器的数量增加到遍及四大洲的80-100台机器并不会显着影响达到确定性的速度。 同时,数据包丢失的增加严重影响了最终延迟,这表明需要对p2p层进行其他配置,以更大程度地抵抗网络数据包丢失,而不是较大的等待时间。 不幸的是,存在许多不同的设置和因素,因此,只有基准允许我们了解可提供相当舒适的区块链速度的验证器的有效数量。
可以从文档中了解设备p2p子系统,例如libp2p上的文档或Kademlia或BitTorrent协议上的文档。
p2p的重要指标是:
- 入站出站流量
- 与其他对等方成功/失败连接的数量
- 返回了多少次先前缓存的块数据,以及多少次需要进一步转发请求以搜索所需的块(缓存命中/未命中的模拟)
例如,访问数据时发生大量未命中意味着仅少数节点具有请求的数据,并且它们没有时间将它们分发给所有人,并且所接收的p2p流量/给定的p2p流量将使您可以建立一个网络配置或通道有问题的节点。
区块链节点系统指标

大量来源描述了区块链节点的标准系统指标,因此我将对其进行简要描述。 它们的作用是帮助在代码的所有部分中搜索瓶颈和错误,从而显示节点的哪些子系统负载最大以及执行哪些任务。
中央处理器
他们谈论处理器执行多少次计算。 如果CPU负载很高,则该节点正在使用逻辑或FPU(在区块链中几乎从未使用过)积极地进行计算。 在区块链中,例如,这可能是由于该节点检查电子签名,使用繁重的加密处理交易或进行复杂的计算。
可以将CPU划分为几个更有用的指标,以了解代码的哪些部分最昂贵。 例如,系统是内核代码,用户是用户进程,io正在等待来自缓慢的外部设备(磁盘/网络)的i / o,等等。 这是一篇很好的相关文章 。
记忆体
现代区块链使用键值数据库(LevelDB,RocksDB),这些数据库不断将热数据保留在内存中。 与任何加载的服务一样,由于错误或针对节点代码的有针对性的攻击,总是可能发生内存泄漏。 如果内存节点的消耗增加或急剧增加,则很可能是由于状态数据库中的密钥数量增加,大型事务队列或节点的不同子系统之间的消息数量增加而引起的。 内存不足可能表示可能会增加块中的数据限制或最大的事务复杂性。
对于与网络客户端相对应的全节点https://habrastorage.org/webt/qa/sn/m5/qasnm5bougkjuagneevjkpg9x0w.png,文件缓存指标也很重要。 客户端访问状态数据库和事务日志的各个部分。 这会导致磁盘上的旧块激增,从而可能挤出新块,进而减慢对客户端的响应。
联播网
内部网络的主要指标是流量(以字节为单位),每个网络和协议的已发送和已接收网络数据包的数量,数据包丢失率。 在区块链中,这些指标通常不会受到太多关注,因为 区块链尚未以1 Gbit /秒的速度处理事务。
有一些区块链项目,允许用户共享其wifi或提供用于存储和传输文件或消息的服务。 在测试此类网络时,通过网络接口的流量的数量和质量成为极其重要的指标,因为拥挤的网络通道会毫无例外地影响机器上的所有其他服务。
贮藏
磁盘子系统是所有服务中最慢的组件,通常是导致严重性能问题的原因。 过多的日志记录,意外的备份,不方便的读/写模式,庞大的区块链总量-所有这些都可能导致节点运行速度显着下降或对硬件的严重需求。
从技术上讲,事务日志可以视为状态数据库的WAL( WAL ),因此,这些存储指标非常重要,可让您搜索现代键值数据库机制中的瓶颈。 这些是读取/写入IOPS的数量,最大/最小/平均延迟以及许多其他有助于优化磁盘操作的指标。
结论
因此,我们检查了几组指标,这些指标可以提供有关区块链网络的运行及其优化可能性的非常有价值的信息。 总结起来,您可以将它们分为三类:
- 节点的区块链指标:
产生的块数,已处理的事务数,它们的处理时间,完成时间等。 - 子系统p2p指标:
命中/未命中请求的数量,活动对等体的数量,p2p流量的数量和结构等。 - 节点的系统指标:
cpu,内存,存储,网络等
每个组都以其自己的方式很重要,因为在每个子系统中可能会出现错误,限制了其他组件的操作,并且减慢验证器的数量,甚至可能对整个网络造成严重影响。 同样,共识和最终性算法中最棘手的错误仅在交易量较大或共识参数发生变化时才会出现。 他们的分析需要可重现的测试条件和复杂的负载方案。
区块链的发展始终是多台机器的编排,用于布局配置的脚本以及节点和基准的协调启动,用于从所有机器收集度量和日志的服务器。 因此,在开发区块链时,请考虑雇用合格的开发人员-这将为开发团队提供宝贵的支持。 祝你好运