Tezos的Merkle树存储量提高了六倍

2022-02-25 08:18:08

改善存储是提高区块链节点整体性能的最有效方法之一。区块链节点必须定期、持续地访问包含区块链状态的存储(在Tezos中也称为上下文)。节点访问该存储的速度会影响块应用时间——较慢的存储模块会降低块应用的速度,从而对节点的整体速度和稳定性构成瓶颈。

如果由于某种原因存储不可用,则块的应用无法继续,节点“冻结”。当发生此类冻结(可能持续数分钟)时,节点会被卡住,直到存储完成其维护任务。如果块应用程序需要超过30秒(当前允许创建块的时间,也称为块时间),那么面包师可能无法烘焙块,他们可能会失去烘焙或背书的奖励。

到目前为止,TezEdge支持两种不同的上下文存储实现,Octez v11实现,以及我们自己的基于Rust的实现,即只保留最近7个周期的数据的内存中垃圾收集存储。

现在还有第三种选择。我们开发了一种持久化上下文存储,将整个Tezos区块链状态保存在磁盘上,我们将其命名为Tezos Edge v1。15上下文存储。与Octez v11实现相比,这已经转化为性能上的重大改进:

TezEdge v1。15与Octez v11实现相比,上下文存储在磁盘中执行的读取(输入)量略多于一半,写入(输出)量不足三分之一。它还具有最小方差,这意味着读/写没有峰值。您可以跳转到标题为“上下文存储高级跟踪工具”的部分,以查看完整的详细信息。

此外,我们的实现不会受到上述冻结的影响。这增加了成功烘焙或背书一块砖并获得奖励的可能性。

Octez(v13)的下一个版本将采用改进的存储实现,解决我们在本文中讨论的问题。我们期待着与Octez背后的团队合作,发布我们基准测试的更新版本。

如果我们想对Tezos节点执行任何类型的工作,我们需要首先引导它,这意味着我们需要重新处理每个操作块,从genesis块开始,以链头的块结束。

我们启动了TezEdge节点的两个实例,同时使用16GB的RAM,并允许两个节点的最大存储带宽均为300MB/s。这两个实例之间唯一的区别是其中一个使用了我们新的和改进的TezEdge v1。15个存储空间,而另一个使用Octez v11存储空间。

引导节点受到两个约束:Tezos经济协议和被引导节点的存储。TezEdge v1。15存储需要44131秒才能完成200多万个数据块的处理(95.1%为自举)。同时,Octez v11存储只需要295756秒就可以执行引导过程中75.4%的存储部分(160万)

在存储选项卡的右侧,您可以找到完整的统计信息。向下滚动至底部以查找总时间,这是此处的重要值。在新的TezEdge v1中,它要少得多。15.储存,主要是因为它避免了冰冻。此外,Octez v11存储实现在读取上花费如此之多的原因之一是它还需要等待合并

因为我们的项目是开发一个Tezos节点外壳,所以我们的重点是它的每个模块。这包括存储,优化存储会极大地影响引导速度。我们的存储性能如此之好的原因是,我们不仅减少了引导所需的数据大小,而且还加快了数据的处理速度。

在TezEdge v1中。15上下文存储,我们的数据文件仅附加,这意味着新数据可以附加到存储中,但现有数据是不变的。通常,在无序数据文件中查找值是通过线性扫描完成的(顺序检查列表中的每个值,直到找到匹配项或搜索整个列表)。然而,对于大型数据集来说,这种扫描往往相当昂贵。数据库通常通过使用索引来避免这种情况。

数据库索引是由两列组成的特殊查找表。第一列是搜索键,第二列是数据指针。键是要从数据库表中搜索和检索的值,指针或引用在数据库中存储特定搜索键的磁盘块地址。对关键字段进行排序,以便加速所有查询的数据检索操作。

这些索引通常只是一系列有序的条目,但新条目是以随机顺序添加的。这意味着您需要不时地对索引进行排序。这种类型的维护工作需要一些时间,在某些情况下,在完成之前,存储将不可用。

在当前的Octez v11上下文存储中(对于Octez v11,Irmin 2.9),有一个索引可用于通过散列对任何存储对象进行寻址。这个索引可能会变得非常大(对于一个包含所有mainnet历史记录的节点来说,现在的索引大于70GB),这使得它的维护成本非常高。

我们在TezEdge v1中使用的索引。15只在存储中存储对提交特殊对象的引用,这些对象包含有关表示区块链状态的Merkle树的特定版本的信息,从而使它们小得多。它们足够小,可以在节点启动时在内存中完全加载和排序——例如,提交索引(我们的主索引)的大小不到100 MB。这样的小索引不需要定期维护——磁盘上的索引不需要排序。由于这个原因,TezEdge v1。15.储存不易结冰。此外,将索引存储在内存中可以提高性能。

这是因为在Tezos中,存储对象从不直接寻址,而是通过遍历从提交对象开始的Merkle树来访问。除此之外,树中的对象总是根据其在数据库文件中的偏移量而不是哈希值来引用其他对象。这避免了在商店中查找对象时进行一次代价高昂的间接操作。

Octez上下文存储的下一个版本(Irmin 3.0)也将实现一个解决大索引问题的解决方案,类似于我们在这里描述的。

通过减少上下文存储中的延迟来跟踪和防止威胁存储回报的高延迟调用

由于Tezos的积木必须在30秒内烘焙,如果一个电话(如提交)花费太多时间,面包师可能会失去烘焙或代言奖励。当存储遇到本文前面讨论的峰值时,就会发生这种情况。

这就是为什么我们的主要目标是减少通话延迟——这样就不会有个别通话导致面包师因为花费太多时间而失去奖励。我们的第二个目标是减少这些调用所需的总时间,以便节点的存储性能更好。

我们开发了一种先进的跟踪工具,用于跟踪存储中的通话。我们可以使用这个工具来比较存储实现,甚至可以选择任何过去或当前的协议。

从顶部向下,在突出显示的存储选项卡下方,您首先可以看到当前上下文是irmin,这意味着显示的统计信息是针对Octez v11上下文存储的。

下面是所有Tezos协议的列表。让我们选择杭州,最新的协议,因为这是面包师目前正在使用的。

从左到右,首先,我们看到操作类型的名称,这个图代表所有提交调用。

图形被组织成垂直的块行。每个垂直行表示在特定时间范围内进行的通话,如标题为“通话持续时间”的x轴所述。

灰色方块表示通话有足够的持续时间。橙色方块表示持续时间比平时长,红色方块表示持续时间太长,会给烘焙奖励带来风险。

在这个屏幕截图中,我们可以看到>;100秒射程。由于块创建有30秒的限制,因此;100秒呼叫将阻止应用区块,这意味着烘焙和背书奖励将丢失。

如前所述,我们不仅大大加快了数据的读取和写入速度,而且还减少了必须从节点硬盘读取或写入的数据量。

对于在运行节点的服务器中使用企业级SSD的大型烘焙服务公司来说,减少必须写入和读取的数据量尤其有价值。

SSD的寿命有限,通过将数据存储到SSD上,寿命会进一步缩短,寿命的缩短与存储的数据量成正比。因此,减少在烘焙过程中必须写入硬盘的数据量可以延长硬盘的使用时间。

随着区块链数据的规模和存储需求将呈指数增长,这在未来将变得更加重要。

我们已经发布了两个TezEdge节点实例,一个使用Octez v11存储实现,另一个使用新的TezEdge v1。15上下文存储。您可以通过浏览器中的Edge explorer查看每个实例:

运行Octez v11上下文存储的节点已处理1620147个块,并应用了75.4%的操作。

与边缘v1一起运行的节点。15上下文存储处理了2039622个块,并应用了95.1%的操作

虽然system overview(系统概述)选项卡以CPU和RAM的图表开始,但在本文中,我们首先比较存储I/O,因为这是存储整体性能方面最重要的图表,以及它对成功烘焙和认可的影响程度。

请注意,在这两个图中,光标都是故意放在尖峰上的。此外,Octez v11存储图表的y轴停止在400MB,而边缘v1。15个存储站的容量为200MB。

边缘v1的输入/输出。15存储空间明显低于旧版本的存储空间。这里的重要价值是:

验证器-每秒读取,这在TezEdge v1中。15存储空间是Octez v11存储空间的一半多一点

验证器——每秒写入,不到Octez v11存储中的三分之一。

虽然有一些尖峰,但它们的频率要低得多,而且它们从未达到Octez v11存储中图表中的高度。Octez v11存储实现中出现这种峰值的原因是索引的合并,随着处理的块越来越多,索引变得越来越大。

这里要注意的值是标记为验证器的绿线。在这里你可以看到新的TezEdge v1。15存储使用的内存更少,变化也小得多——它不会出现“峰值”,内存使用量会突然增加,正如您在第一张图中看到的,在Octez v11存储实现中,这种情况非常常见。

请注意,边缘v1中的大尖峰。15 RAM图是由协议011更新引起的。这包括对上下文树进行重大重组,这是一项非常昂贵的操作。虽然上下文树的新表示形式更好,但将过去版本的树迁移到新版本需要一段时间。

在这里我们可以看到,在TezEdge v1中提交时间更快。15.储存。这是因为,在之前讨论的Octez v11存储冻结期间,操作会大大减慢。冻结是由索引维护任务引起的,这些任务不会在TezEdge v1中发生。15.储存。这些冻结会导致延迟峰值,这意味着某些呼叫可能会花费太长时间,导致面包师错过烘焙或代言的奖励。

与提交和签出类似,在Octez v11存储中,MEM、MEM TREE和FIND以及这一行中的其他几个操作的速度要慢得多。

您可以看到TezEdge v1的性能有所改善。15通过运行TezEdge Explorer的两个实例来存储,一个用于使用Octez v11存储实现的节点,另一个用于使用TezEdge v1的节点。15存储实现。

在我们的下一个版本中,用户将能够从持久化版本加载我们在上一篇文章中描述的内存存储,这意味着您不必在每次启动节点时从头开始处理整个链。我们还将支持制作Tezos区块链的快照,以便更快地引导。但是,请注意,我们的快照与Octez快照不兼容。

我们希望您喜欢我们关于新的和改进的存储的文章。请随时通过电子邮件与我联系,我期待收到您的问题、意见和建议。要阅读更多关于Tezos和TezEdge节点的信息,请访问我们的文档、订阅我们的媒体、在Twitter上关注我们或访问我们的GitHub。