Python 错误处理:Boto:[错误104]对等方重置连接

Python 错误处理:Boto:[错误104]对等方重置连接,python,error-handling,amazon-s3,boto,Python,Error Handling,Amazon S3,Boto,我有一个从AmazonS3下载的脚本。这些脚本99.9%的时间都能正常工作。偶尔我会遇到以下错误(socket.error:[Errno 104]由对等方重置连接)。一旦我重新启动代码,错误似乎就消失了。因为很难重现错误。我希望下面的代码片段能够修复这个错误。具体来说,我希望如果出现错误,它会尝试重新下载文件。我想知道这段代码是否有效,是否还有其他需要添加的内容。我认为一个错误计数器可能是好的,所以如果错误继续出现,它最终会继续。(不确定如何添加计数器) 我也有同样的问题。如果你在GitHub上

我有一个从AmazonS3下载的脚本。这些脚本99.9%的时间都能正常工作。偶尔我会遇到以下错误(socket.error:[Errno 104]由对等方重置连接)。一旦我重新启动代码,错误似乎就消失了。因为很难重现错误。我希望下面的代码片段能够修复这个错误。具体来说,我希望如果出现错误,它会尝试重新下载文件。我想知道这段代码是否有效,是否还有其他需要添加的内容。我认为一个错误计数器可能是好的,所以如果错误继续出现,它最终会继续。(不确定如何添加计数器)


我也有同样的问题。如果你在GitHub上搜索boto,你会发现,我们并不孤单

还有一个已知的公认问题:

达到AWS S3的性能极限 事实是,我们已经习惯了boto和AWSS3服务,我们已经忘记了,这些都是真正的分布式系统,在某些情况下可能会崩溃

我归档(下载、tar、上传)了大量的文件(大约3年,15个feed,每个feed每天大约有1440个版本),并使用芹菜来更快地完成这项工作。我不得不说,有时我会更频繁地遇到这些错误,可能达到了AWSS3的性能极限。这些错误经常成批出现(在我的例子中,我上传了大约60Mbps,持续了几个小时)

培训S3表现 当我衡量绩效时,它是“经过培训的”。一个小时后,S3 bucket的响应速度迅速提高,AWS可能检测到更高的负载,并启动更多为其服务的实例

尝试最新稳定版本的
boto
另一件事是,
boto
在很多情况下都试图重试,所以很多失败都隐藏在我们的调用中。有时,我升级到最新的稳定版本后,感觉好多了

我的结论是:
  • 尝试升级到最新稳定的
    boto
  • 当错误率增大时,降低压力
  • 接受这样一个事实,AWS S3是分布式服务,很少有性能问题

在您的代码中,我绝对建议您添加一些睡眠(至少5秒,但30秒对我来说似乎很好),否则您只是在越来越努力地推动一个系统,而这个系统目前可能处于不稳定的状态。

嗯,似乎是时候了。sleep()工作了一段时间。但是,现在文件更大了,这甚至不起作用。看来我需要重新启动循环才能让它重新工作。这项修改似乎奏效了

def download(filesToDownload):
    temp = []
    for sFile in filesToDownload:
        for keys in bucket.list(prefix='<bucket>%s' % (sFile)):
            while True:
                try:
                    keys.get_contents_to_filename('%s%s' % (downloadRoot,sFile))
                    temp.append(sFile)
                except:
                    time.sleep(30)
                    x = set(filesToDownload) - set(temp)
                    download(x)
                break
def下载(filesToDownload):
温度=[]
对于FileToDownload中的sFile:
对于bucket.list(前缀=“%s%”(sFile))中的键:
尽管如此:
尝试:
键。将内容获取到文件名(“%s%s%”(downloadRoot,sFile))
临时附加(sFile)
除:
时间。睡眠(30)
x=设置(filesToDownload)-设置(temp)
下载(x)
打破

我曾经遇到过这个问题,修复的是创建一个新的访问密钥,因为旧的密钥被破坏了

同样的问题也发生在我身上,我通过apt get安装了awscli。但在通过pip删除和安装新版本后,问题得到了解决。
def download(filesToDownload):
    temp = []
    for sFile in filesToDownload:
        for keys in bucket.list(prefix='<bucket>%s' % (sFile)):
            while True:
                try:
                    keys.get_contents_to_filename('%s%s' % (downloadRoot,sFile))
                    temp.append(sFile)
                except:
                    time.sleep(30)
                    x = set(filesToDownload) - set(temp)
                    download(x)
                break