flood生成大型参数化RPC调用集,随机抽样,分布类似于不同类型的区块链工作负载。
原文作者:Storm Slivkoff, Georgios Konstantopoulos
原文标题:Introducing flood: a load testing tool for benchmarking EVM nodes
原文来源:paradigm.xyz
编译:Yvonne,MarsBit
简介
负载测试是开发弹性、高性能数据系统的关键步骤。然而,负载测试尚未广泛应用于加密货币基础设施的开发。我们很高兴能够通过引入flood来弥补这一差距,这是一个专门为RPC端点的性能分析而设计的基准测试工具。
我们最初构建的flood目的是优化Reth,并了解其在各种负载下的延迟和吞吐量。然而,我们认为,除Reth之外,flood在优化许多类型的加密基础设施的性能方面具有重要的效用。
我们很高兴在Apache/MIT许可下将flood作为免费的开源软件进行开源。它的代码和安装说明可以在Github存储库中找到。Flood既可以从命令行使用,也可以作为python库使用。还有一个Docker的flood镜像,便于集成到CI/CD和其他类型的管道( pipeline)中。
什么是负载测试,为什么它很重要?
负载测试指的是测量系统的性能特征如何受到不同类型的工作负载的影响。这种方法背后的关键见解是,当系统承受越来越多的负载时,吞吐量、延迟和错误率等性能指标通常会降低。因此,观察不同受控负载下的系统可以发现系统的瓶颈、故障模式和最终性能能力。
负载测试获得的信息可以通过多种方式加以利用。当系统处于主动开发状态时,负载测试会突出显示最需要改进的系统瓶颈。在比较两个系统时,负载测试可以揭示哪个系统性能更好或更可靠。作为一种特殊情况,负载测试可以比较单个系统的两个不同的硬件或软件配置。在每种情况下,负载测试都可以开发高度优化的系统。
如何加载测试区块链节点?
我们的重点是RPC,这是通常用于从区块链节点提取数据的通信协议。
目前,测量RPC性能最常用的方法不是负载测试,而是延迟测试:你向RPC节点发送请求,并测量获得响应所需的时间。各种RPC提供程序的延迟测试可以在各种网站上找到。不幸的是,这种类型的测试提供了有限的节点性能视图,因为它几乎没有揭示系统在负载下的行为(详情请参阅我们关于测量延迟和吞吐量的文章)。
在区块链的环境中,工作负载可以在两个重要方面发生变化。典型的变量是规模。与每秒100个请求的负载相比,每秒10,000个请求的负载会给系统带来更大的压力。另一个负载变量是RPC方法。对于从区块链节点提取的每种类型的数据,都有不同的RPC方法。例如,区块vs交易vs日志vs跟踪。每个RPC方法都将不同类型的负载放在系统上。一些RPC方法受存储IO的约束,而另一些方法受CPU的约束。
什么是flood?
考虑到这些原则,我们开发了一个称为flood的负载测试工具。flood通过以下方式为RPC端点的性能特征提供了前所未有的视角:
1) 采用负载测试而不是延迟测试;
2) 将测试覆盖范围扩展到所有相关的RPC方法。
flood由3个基本部分组成:
调用生成引擎:flood生成大型参数化RPC调用集,随机抽样,分布类似于不同类型的区块链工作负载。flood利用Paradigm Data Portal数据集来确保全面覆盖区块链历史。
负载测试引擎:flood然后调用Vegeta(一个由@tsenart在Go语言中编写的高性能负载测试工具),使用这些调用对RPC端点进行负载测试。
报告引擎:在执行测试后,flood用各种图表、表格和报告总结结果。这些摘要很容易集成到脚本和数据管道中。
这些组件中的每一个都是高度可配置的,使flood能够覆盖广泛的测试场景和环境。
flood能做什么?
在flood的典型操作中,用户指定他们想要测试的RPC方法以及RPC端点列表。例如,你可能希望在两个版本的Reth上测试eth_getLogs的性能。随后,flood将针对这些RPC端点运行不同的受控负载。例如,它可能以每秒1,000、2,000、4,000和8,000个请求的速度运行eth_getLogs。继而,Flood将显示表格和图表,总结性能指标如何随负载变化。输出与下图相似的图标:
性能指标在负载下降低的特定方式为了解系统的瓶颈和最终性能容量提供了丰富的见解。有关解释和利用负载测试数据的详细信息,我们推荐阅读Cesarini的「Designing for Scalability with Erlang/OTP」第15章。
除了这一简单的操作模式,flood还提供了高级功能,以适应各种类型的用户:
Flood可以使用不同的负载测试计划,包括:“压力测试”(随着时间的推移逐渐增加负载),“峰值测试”(一个大的突然负载随后是小负载)和“浸泡测试”(长时间运行负载)。
flood可以协调负载测试,在每个RPC节点上以本地模式运行,以消除网络瓶颈造成的不便。
flood有一个“equality”测试模式,检查每个RPC端点是否返回相同的响应。
为什么构建flood?
在Paradigm,我们正在开发一种名为Reth的新节点实现,性能是其主要目标之一。我们开发flood是为更详细地描述Reth的性能。我们已经使用flood发现了在各种工作负载和系统配置下出现的许多Reth性能瓶颈。这些瓶颈随后得到了纠正。通过flood,我们创建了一个紧密的反馈循环,Reth开发者可以充分了解任何代码库更改如何转化为端到端系统性能。
在Reth之外,我们相信flood将能够帮助解决许多与RPC节点相关的未解决的问题:
运行节点时,哪些硬件规格最重要?存储IO与RAM速度、RAM容量与CPU速度的相对重要性是什么?RAID值得吗?
对于每个第三方RPC提供商,每个RPC方法的有效速率限制是什么?
哪个节点客户端为不同类型的工作负载提供了最佳性能?
结论
在这篇文章中,我们介绍了flood,这是一个负载测试工具,它提供了一个前所未有的区块链节点性能特征视图。虽然我们最初构建flood是为优化Reth的开发,但我们相信它将为其他类型的高性能加密基础设施的开发释放更多活力。我们期待看到更多人使用flood来构建其高性能和可靠的系统。