使用 web3.py 查询远程以太坊节点时出现间歇性“读取超时”错误

Posted

技术标签:

【中文标题】使用 web3.py 查询远程以太坊节点时出现间歇性“读取超时”错误【英文标题】:Intermittent "Read time out" errors when using web3.py to query remote ethereum node 【发布时间】:2018-09-13 09:44:15 【问题描述】:

我正在尝试运行一些 web3.py 函数调用,以从远程 Ethereum geth 节点检索数据,该节点运行托管在 AWS EC2 Linux 实例上的 Rinkeby 测试网。

我从本地 Python3 解释器设置了我的提供程序,它成功连接,并且对于某些基本函数调用间歇性地工作:

import web3, json, requests
from web3 import Web3, HTTPProvider
provider = HTTPProvider( 'http://remote-node-ip-address:8545' )
w3 = Web3(provider)

但是,当我运行某些函数调用(例如来自 Python3 解释器的 w3.eth.accounts)时,远程服务器似乎明显变慢(挂起)并且基本上经常出现此错误:

requests.exceptions.ReadTimeout: HTTPConnectionPool(host='remote-node-ip', port=8545): Read timed out.

(读取超时=10)

但有时它工作得很好,因此整体网络连接到位。当我通过 SSH 连接到实际上是一个 Docker 容器的远程 AWS 服务器时,它似乎确实很慢而且很慢。我从下面的 TOP 输出中唯一注意到的是 WA 的 %CPU 非常高,达到 99.5%:

> top - 23:44:51 up  6:42,  0 users,  load average: 1.76, 1.73, 1.75
> Tasks:   4 total,   1 running,   3 sleeping,   0 stopped,   0 zombie
> %Cpu(s):  0.3 us,  0.3 sy,  0.0 ni,  0.0 id, **99.5 wa**,  0.0 hi,  0.0
> si,  0.0 st KiB Mem :  2049248 total,  1102520 free,   596396 used,  
> 350332 buff/cache KiB Swap:        0 total,        0 free,        0
> used.  1289532 avail Mem 
> 
>   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+
> COMMAND         406 root      20   0 1526260 491008    424 S  0.5 24.0
> 0:05.30 geth         
>     1 root      20   0   56416  11620      0 S  0.3  0.6   1:18.18 supervisord     422 root      20   0   36636   1116    684 R  0.3  0.1
> 0:00.01 top             412 root      20   0   18232    460      8 S 
> 0.0  0.0   0:00.02 bash

我尝试将我的 AWS 实例扩展到一个 4-vCPU、cpu 优化的 c5.xlarge 实例,但我遇到了同样的问题。我还针对在我的本地主机上运行 Rinkeby 的本地 geth 节点测试了相同的命令,没有任何问题。

是否有人对解决我的远程 geth 节点这些问题的最佳方法有任何意见?

【问题讨论】:

【参考方案1】:

看起来您的 I/O 已用尽。您可以尝试通过iotop 确认。

以太坊节点在本地 SSD 上运行最佳。如果您尝试使用 EBS 甚至本地旋转磁盘,您的节点可能会定期停止。

查看instances that support a local SSD:

以下实例支持使用固态驱动器 (SSD) 提供高随机 I/O 性能的实例存储卷:C3、F1、G2、I2、I3、M3、R3 和 X1。

【讨论】:

您提到的大多数实例类型都是遗留类型。我确实找到/测试了 C3,但遇到了同样的问题。默认的 EBS gp2 卷是 SSD,但 AWS 确实具有称为 io1 的高“预置 IOPS”卷类型。我设置了一个最大 20000 IOPS(AWS ECS 限制)和 401 GB(IOPS:GB 比率必须

以上是关于使用 web3.py 查询远程以太坊节点时出现间歇性“读取超时”错误的主要内容,如果未能解决你的问题,请参考以下文章

为啥在尝试从节点脚本部署以太坊智能合约时出现“无效发件人”(-32000)?

如何获取以太坊合约和账户信息(使用geth和web3.py)

python以太坊开发的主要相关技术

如何使用 python 将 web3 连接到以太坊主网络?

web3 (python) 创建的交易不会反映在以太坊区块链上

Web3.py错误 - The field extraData is 97 bytes, but should be 32