【问题标题】:Overflowing mempool during sending a lot of transaction在发送大量交易期间内存池溢出
【发布时间】:2019-08-20 08:03:15
【问题描述】:

在使用不同的休息服务器(我们使用 2 或 4 个节点/服务器)发送大量交易期间,内存池总是溢出,服务器开始过载,块关闭很长时间,这取决于交易量,交易越多,关闭区块所需的时间就越多,它总是在 20 秒到 20 分钟之间。例如,当我发送 20k txs 时,mempool 被填充到 20k 事务,然后在 20 秒后关闭所有事务的块。如果我们发送 300k 笔交易,mempool 被填满 +-280k,并且在 20 分钟内关闭了 3 个区块,大约 123、~123、~25 txs,但是在这 20 分钟内,tendermint 总是出现像“err="pong timeout"”这样的错误, “err=EOF”、“用于关闭网络连接”等。此外,我们使用 cosmos-sdk 我们无法关闭自动生成块。 https://github.com/tendermint/tendermint/issues/3905 - 这是 github 问题,查看它以获取更多信息

我尝试更改节点配置,但没有太大变化

我不知道我需要做什么,但是我们在内存池方面遇到了麻烦,我们还没有解决。伙计们,你们知道我能用这个做什么吗?

【问题讨论】:

    标签: blockchain tendermint


    【解决方案1】:

    Tendermint 使用两个例程 p2p/conn/connection.go#recvRoutinep2p/conn/connection.go#sendRoutine 处理传入消息和发送响应,这两个都是顺序的。因此,如果一个节点正在处理新的 txs 并迭代调用反应器,它会在所有反应器之前被阻塞(基本反应器请参考node/node.go#createSwitch)。

    Tendermint 在将 txes 添加到 mempool 之前验证签名,根据config/config.go#DefaultMempoolConfig,这大约需要 0.5ms,因此验证 20k txes 实际上需要大约 10s,不包括其他操作成本。

    【讨论】:

    • 好的,但是我们发送了很多交易并且在它们都不会进入内存池之前没有关闭块(它工作不正确,因为块必须每 5+- 秒关闭一次交易金额)。那么当第一个节点的内存池比第二个节点的内存池更满时的情况呢?昨天我在 GitHub 问题(在 cmets 中)添加了两个图表,在第一个图表上,我们可以看到内存池的工作更多或更少同步,但第一个节点的内存池比第二个节点的内存池有更多的事务(卡住大约 3k 个事务)。
    • 也许你可以限制块大小,从而减少关闭块的时间。 types/params.go#BlockParams
    • 我试过了,但没用,我设置了MaxBlockSizeBytes = 1048576(大约 1MB),但封闭块更大(大约 1.5mb)。我是否必须在代码的其他部分更改MaxBlockSizeBytes
    猜你喜欢
    • 1970-01-01
    • 2018-12-21
    • 2020-07-10
    • 1970-01-01
    • 2015-04-13
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多