错误处理:Boto:[错误104] Peer连接重置

时间:2014-04-30 20:28:48

标签: python error-handling amazon-s3 boto

我有一个从Amazon S3下载的脚本。这些脚本的工作时间为99.9%。偶尔我收到以下错误(socket.error:[Errno 104]连接由同行重置)。一旦我重新启动代码,错误似乎就消失了。由于很难重现错误。我希望下面的代码剪切将修复错误。具体来说,我希望如果出现错误,它会尝试重新下载该文件。我想知道这段代码是否有用,以及是否还有其他内容我应该加入。我认为错误计数器可能是好的,所以如果错误确实不断出现,那么最终继续。 (不完全确定如何添加计数器)

files = [#list of files to download]

for file in files:
    for keys in bucket.list(prefix=file):
        while True:
            try:
                keys.get_contents_to_filename()
            except socket.error:
                continue
            break

3 个答案:

答案 0 :(得分:5)

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

还有一个已知的已接受问题:https://github.com/boto/boto/issues/2207

达到AWS S3的性能限制

事实是,我们已经习惯了boto和AWS S3服务,我们已经忘记了,这些是真正的分布式系统,在某些情况下可能会破坏。

我正在归档(下载,tar,上传)大量文件(大约3年,大约15个Feed,每个大约每天有1440个版本),并使用Celery更快地完成此操作。我不得不说,我有时会更频繁地收到这些错误,可能达到了AWS S3的性能限制。这些错误通常出现在块中(在我的情况下,我上传大约60 Mbps几个小时)。

培训S3表现

当我测量表现时,它被“训练”了。一段时间后,S3桶的响应速度上升,AWS可能检测到更高的负载并启动更多服务器实例。

尝试boto

的最新稳定版本

另一方面,boto试图在很多情况下重试,因此我们的呼叫隐藏了很多失败。有时我升级到最新的稳定版本会有所改善。

我的结论是:

  • 尝试升级到最新的boto
  • 当错误率增加时,降低压力
  • 接受这样一个事实,即AWS S3是具有罕见性能问题的分布式服务

在你的代码中,我肯定会建议添加一些睡眠,(至少5,但30秒对我来说似乎没问题),否则你只是越来越难以推进系统,这可能是在一个不稳定的情况下时刻。

答案 1 :(得分:1)

好吧,看来time.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

答案 2 :(得分:0)

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