超级账本Fabric的性能测试

21
在尝试实现IBM团队在其文章Hyperledger Fabric: A Distributed Operating System for Permissioned Blockchains中报告的性能时,我遇到了一些问题和错误。我收集了所有有用的信息,并希望与HF社区分享。此外,我对Fabric开发人员关于其性能有几个问题。
目标描述:使用Cello在四个c5.9xlarge(36vCPU)aws实例上部署的Hyperledger Fabric v1.1.0网络。
{
    fabric001: {
      cas: [],
      peers: ["anchor@peer1st.main"],
      orderers: ["orderer1st.orderer"],
      zookeepers: ["zookeeper1st"],
      kafkas: ["kafka1st"]
    },
    fabric002: {
      cas: [],
      peers: ["worker@peer2nd.main"],
      orderers: ["orderer2nd.orderer"],
      zookeepers: ["zookeeper2nd"],
      kafkas: ["kafka2nd"]
    },
    fabric003: {
      cas: [],
      peers: ["worker@peer3rd.main"],
      orderers: ["orderer3rd.orderer"],
      zookeepers: ["zookeeper3rd"],
      kafkas: ["kafka3rd"]
    },
    fabric004: {
      cas: ["ca1st.main"],
      peers: [],
      orderers: ["orderer4th.orderer"],
      zookeepers: ["zookeeper4th"],
      kafkas: ["kafka4th"]
    }
}

TLS已禁用。

Fabric通道配置(所有其他参数均为默认值):

BatchTimeout: 1s
BatchSize:
    MaxMessageCount: 500
    AbsoluteMaxBytes: 200 MB
    PreferredMaxBytes: 50 MB

我为CouchDB和LevelDB这两种状态数据库进行了测试。我使用官方的Fabcar链码(Golang实现)进行测试。我创建了一个简单的nodejs应用程序,使用SDK与Fabric网络进行交互,并公开了HTTP API以进行负载测试。该应用程序是无状态的,可以轻松扩展。
对于负载测试,我使用了YandexTank工具。我进行了两种高负载测试:查询(通过peer001向Fabric状态发送请求,当区块链为空时)和插入(区块链内的交易)。

结果

CouchDB作为状态数据库

基于这个,我可以得出结论:Fabric Peer在负载下与CouchDB连接存在问题。 我的问题: Fabric社区是否知道这个错误?你们有解决它的计划吗?

LevelDB作为状态数据库

  • 查询结果https://overload.yandex.net/102035。如下图所示,fabric001容器的CPU和内存使用情况: fabric001 container instances (leveldb, query) 区块链没有任何错误,只是看到延迟降低。
  • 插入结果https://overload.yandex.net/102040。如下图所示,fabric001容器的CPU和内存使用情况: fabric001 container instances (leveldb, insert) 激进的延迟降低始于约850 rps。区块链没有任何错误。
我的问题: 这种延迟降低的原因是什么?为什么我无法达到IBM在他们的文章中报告的3500 rps性能?Fabric社区有什么改善性能的计划?

只是出于好奇...你能否使用最新的主分支重复LevelDB实验? :) - yacovm
我需要自己构建Docker镜像吗?我可以尝试一下,但我需要开发人员提供一些信息。我能否仅从主节点构建Peer镜像,并将其与1.1.0版本的其他Fabric元素一起部署? - Dmitry Pugachev
前两张图片看起来像是来自instance fabric003,而不是描述中所说的fabric001。情况真的是这样吗? - adnan.c
此外,前两张图片看起来像是同一张图片(曲线形状和时间戳相似)。如果您能够确认/更新它们,那就太好了。 - adnan.c
1
@DmitryPugachev 你好!不确定你是否在几个月后重新进行了测试。很想知道它是否有所改善。 - emiliomarin
显示剩余2条评论
1个回答

14
Fabric是一个排队系统。在高负载下,等待时间呈指数增长(排队属性),因此事务延迟也会增加。但是,对于golevelDB,我们应该以低延迟获得至少2000 tps。
从CPU利用率图中可以看出,在36个vCPU中,只有16个vCPU被充分利用。在core.yaml中为每个节点设置了validatorPoolSize的值是多少?您可以将此值设置为等于或小于块大小,并检查吞吐量是否增加。
性能会根据以下因素而异:
1.工作负载(fabcar vs fabcoin), 2.磁盘(hdd vs ssd,本地vs网络附加), 3.负载生成器(CLI vs SDK), 4.负载生成方法(开放系统vs封闭系统 vs一些分布)和 5.网络带宽(至少1.6 Gbps,可实现2700 tps)。
此外,请确保负载生成器不成为瓶颈。最好将延迟进一步分为(认可延迟、排序延迟、提交延迟),并收集其他资源利用率,例如网络和磁盘,以便可以轻松识别瓶颈。
你可以参考我们的技术论文,标题为《Hyperledger Fabric性能基准测试与优化》。我们进行了全面的实证研究。使用levelDB,我们应该能够获得至少2000 TPS的低延迟。

@senthilnathan,感谢您的回答,我非常感激。也许您可以简单介绍一下CouchDB作为状态数据库的情况? - Dmitry Pugachev
1
@DmitryPugachev :) 由于golevelDB是一个嵌入式数据库,因此与CouchDB相比,我们可以获得更高的吞吐量。使用CouchDB作为状态数据库时,对于每个get/putState,节点需要通过安全的HTTP发出GET/POST REST API调用。结果,性能会下降。我们在CouchDB上最多达到了700 tps。有关详细答案,请参阅上述论文中的第V.D、VI.C和VI.D节。 - senthil nathan
@senthilnathan 这太棒了!在测试期间使用了哪个Hyperledger Fabric版本?这份文档有最新版本吗?谢谢。 - Greivin López

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接