了解区块链延迟和吞吐量

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

大家鲜少提到如何正确地测量一个区块链系统但它却是系统设计和评估过程中最重要的步骤。系统中有许多共识协议、各种性能的变量和对可扩展性的权衡。

然而直到目前都没有一种所有人都认同的可靠方法能够让人进行苹果对比苹果这种同一范畴内的合理比较。在本文我们将概述受到数据中心化系统测量机制启发的一种方法并探讨在评估一个区块链系统时可以避免的一些常见错误。

关键指标及其相互作用

在开发区块链系统时我们应该将两个重要指标考量在内延迟和吞吐量。

用户关心的第一件事就是交易延迟即发起交易或支付和收到确认交易有效性信息比如确认交易发起方有足够的钱之间的时间。

在传统的 BFT 系统中如 PBFT、Terdermint、Tusk 和 Narwhal 等一旦交易被确认就会被敲定而最长链共识机制如 Nakamoto Consensus、Solana/Ethereum PoS中一笔交易可能会被打包进区块然后再重组。结果就是我们需要一直等到交易达到“k 个区块深”了才能进行敲定这就导致了延迟的时间大大超过了单次确认的时间。

其次系统的吞吐量一般对于系统设计者来说十分重要。这就是系统每单位时间所处理的总负载一般表达为每秒交易量 (TPS)。

乍一看这两个关键指标看起来是完全相反的东西。但因为吞吐量由每秒的交易量得出而延迟则是以秒为单位进行测量。自然而然地我们会认为吞吐量 = 负载/延迟。

但事实并非如此。因为许多系统倾向于生成在 y 轴上展示吞吐量或延迟而在 x 轴上展示节点数量的图表所以这种计算方式的实现是不可能的。相反我们能生成一个更好的、包含吞吐量/延迟指标的图表它以非线性的方式呈现让图表清晰易读。

 

当没有竞争时延迟是恒定的仅是改变系统的负载就可以改变吞吐量。会发生这种情况是因为低竞争情况下发送交易的最小开销是固定的且队列延迟为 0致使“无论进来什么都能直接出去”。

在竞争激烈的情况下吞吐量是恒定的但仅是改变负载就可以让延迟发生变化。

这是因为系统已经超负载了而增加更多负载会造成等待队列无限变长。更反常的是延迟似乎会随着实验长度而发生变化这是一个无限增长队列的人为结果。

这些表现都可以在典型的“曲棍球图”或“L型图”上看到它取决于到达间隔的分布下文会谈论到。因此这篇文章的关键要点是我们应该在热区进行测量这里的吞吐量和延迟都会影响我们的基准而不用测量边缘区域这里的吞吐量和延迟只有一个是重要的。

 

测量方法论

在做实验时实验者有三种主要的设计选项

开环 vs. 闭环

现在有两种可以控制对目标发出请求流的主要方法。开环系统基于 n = ∞ 个客户端进行建模这些客户端根据速率 λ 和到达间隔分布例如 Poisson向目标发送请求。闭环系统会在任何给定时间内限制未完成请求的数量。开环系统和闭环系统的区别是特定部署的特点同一个系统可以部署在不同的场景中。

例如一个键值存储key-value store可以在一个开环部署中为数千个应用程序服务器提供服务或在一个闭环部署中只为几个阻塞客户端提供服务。

对正确的部署场景进行测试是必不可少的因为比起闭环系统的延迟通常受制于潜在的未完成请求数量而开环系统可能会产生大量的等待队列所以延迟会更长。一般来说区块链协议可以被任意数量的客户端使用所以在开环环境下对其做评估会更准确。

综合基准测试的到达间隔分布

在创建合成工作负载时我们必然会问如何向系统提交请求许多系统在测量之前会先预加载事务但这会使测量产生偏差因为系统从异常状态 0 开始运行。此外预加载的请求已经在主存储器中也因此绕过了其网络堆栈。

更好一些的方法则是以确定的速率发送请求比如1000 TPS这会导致 L 型的图表橙线的出现因为系统的容量得到了最佳使用。

 然而开放系统往往不以可预测的方式运作。相反它们有处于高负载和低负载的时间段。为了对此进行建模我们可以采用概率间隔分布该分布一般是基于泊松分布。它将导致“曲棍球”图表蓝线因为即使平均速率低于最佳值泊松爆发也会导致一些排队延迟最大容量。但这对我们十分有利因为我们可以看到系统如何处理高负载以及负载恢复正常时系统恢复的速度有多快。

热身阶段

最后要考虑的一点是何时开始测量。我们希望流水线在开始之前充满事务否则将需要测量预热延迟。理想情况下预热延迟的测量应该通过热身阶段中的延迟测量来完成直到测量结果遵循预期的分布。

如何进行比较

最后一个难题是合理比较系统的各种部署。同样难点在于延迟和吞吐量是相互依赖的因此我们可能难以生成公平的吞吐量/节点数图表。

最好的方法是定义服务级别目标 (SLO) 并测量当时的吞吐量而不是简单地将每个系统推到其最高吞吐量这种情况下延迟毫无意义。在吞吐量/延迟图上绘制一条与延迟轴相交 SLO 处的水平线并对相交点进行采样这是一种可视化的好方法。

但我设置了 5 秒的 SLO它只需要 2 秒

有人可能想要增加这里的负载以便利用饱和点之后稍高的可用吞吐量。但是这很危险。如果系统操作配置不足意外的请求爆发将导致系统达到完全饱和致使延迟激增且很快会违背 SLO。实质上在饱和点之后运行会导致一种不稳定的平衡。

因此有两点需要考虑

  1. 过度配置系统。本质上系统应该在饱和点以下运行以便吸收到达间隔分布中的爆发而不会导致排队延迟增加。

  2. 如果 SLO 下方有空间请增加 batch 的大小。这会增加系统关键路径上的负载而不会增多排队延迟它为你提供更高的吞吐量以获得你所要的更高延迟权衡。

我正在产生巨大的负载该如何测量延迟呢

当系统的负载很高时尝试访问本地时钟并为到达系统的每个事务添加时间戳可能会导致结果出现偏差。

相反还有两个更可行的选择。第一种也是最简单的方法是对事务进行抽样例如在某些事务中可能存在一个魔数magic number而这些事务是客户端为其保留计时器的事务。在提交时间之后任何人都可以检查区块链以确定这些事务何时提交从而计算它们的延迟。这种做法的主要优点是它不会干扰到达间隔分布。但是因为必须修改某些事务所以它可能被认为是“hacky具有攻击性质的”。

而更系统的方法则是使用两个负载生成器。第一个是主要的负载生成器由它来遵循泊松分布。第二个请求生成器则用来测量延迟并且它的负载会低得多与系统的其余部分相比可以将这个请求生成器视为单个客户端。即使系统向每个请求发送回复就像某些系统所做的那样例如 一个键值存储我们也可以轻松地将所有回复放到负载生成器中并只测量来自请求生成器的延迟。

唯一棘手的部分是实际的到达间隔分布是两个随机变量的总和但是两个泊松分布的总和仍然是泊松分布所以数学并不难 : )。

总结

测量大规模分布式系统对于识别瓶颈和分析压力下的预期行为是至关重要的。希望通过使用上述方法我们都可以朝着公用语言迈出第一步这最终将让区块链系统更适用于他们所做的工作以及他们对终端用户的承诺。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: 区块链