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

时间:2018-04-03 23:51:14

标签: python ethereum web3 geth

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

我从本地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)

但有时它工作正常,因此整体网络连接已到位。当我连接到实际上是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实例,但我遇到了同样的问题。我还针对在我的localhost上运行Rinkeby的本地geth节点测试了相同的命令,并且没有问题。

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

1 个答案:

答案 0 :(得分:1)

看起来您已经在I / O上获得了最大化。您可以尝试使用iotop进行确认。

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

查看instances that support a local SSD

  

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