使用s3cmd时有没有办法指定最大重试次数?

时间:2015-09-24 16:40:14

标签: amazon-web-services s3cmd

我查看了usage guide以及config docs,我只是没有看到它。这是我的bash脚本的输出,当S3出现故障时使用s3cmd sync

WARNING: Retrying failed request: /some/bucket/path/
WARNING: 503 (Service Unavailable): 
WARNING: Waiting 3 sec...
WARNING: Retrying failed request: /some/bucket/path/
WARNING: 503 (Service Unavailable): 
WARNING: Waiting 6 sec...
ERROR: The read operation timed out

看起来它使用指数退避重试两次,然后失败。当然必须有一些方法来明确说明s3cmd应重试失败的网络呼叫的次数?

2 个答案:

答案 0 :(得分:2)

我认为您无法设置最大重试次数。我在GitHub上看了它的源代码(https://github.com/s3tools/s3cmd/blob/master/S3/S3.py)。

看起来该值为5且硬编码:

第240行:

## Maximum attempts of re-issuing failed requests
_max_retries = 5

重试间隔计算如下:

第1004行:

def _fail_wait(self, retries):
    # Wait a few seconds. The more it fails the more we wait.
    return (self._max_retries - retries + 1) * 3    

以及执行重试的实际代码:

if response["status"] >= 500:
        e = S3Error(response)

        if response["status"] == 501:
            ## NotImplemented server error - no need to retry
            retries = 0

        if retries:
            warning(u"Retrying failed request: %s" % resource['uri'])
            warning(unicode(e))
            warning("Waiting %d sec..." % self._fail_wait(retries))
            time.sleep(self._fail_wait(retries))
            return self.send_request(request, retries - 1)
        else:
            raise e

所以我认为在第二次尝试之后发生了一些其他错误并且它导致它退出重试循环。

答案 1 :(得分:0)

503的可能性非常小,因为S3已关闭,它几乎从未,永远不会下降。您的帐户更有可能受到限制,因为您在短时间内提出了太多请求。

你应该减慢你的请求,如果你控制速度,或者我会建议选择更好的键,即不是都以相同的前缀开始的键 - 一个很好的广泛的键将允许s3到更好地分散工作量。

来自Jeff Barr的博文:

  

此外,S3中的密钥按前缀分区。

     

正如我们所说,S3具有自动化功能,可以不断寻找区域   需要拆分的密钥空间。分区由于分割而分开   持续的高要求率,或者因为它们包含大量的请求率   键(这将减慢分区内的查找速度)。有   将密钥移动到新创建的分区中的开销,但是   请求率低,没有特殊技巧,我们可以保持性能   即使在分区拆分操作期间也相当高。这种分裂   操作每天都会发生数十次,直到S3   从用户性能角度来看未被注意到。但是,请求时   单个分区上的速率显着增加,分区分裂   变得不利于要求表现。那么,如何做这些更重   工作量随着时间的推移而工智能命名键本身!

     

我们经常看到内容所在的S3引入了新的工作负载   由用户ID,游戏ID或其他类似的半无意义组织   标识符。这些标识符通常会逐渐增加   数字或各种类型的日期时间结构。不幸的是   这个命名选择的一部分涉及S3缩放是双重的:   首先,所有新内容必然最终归单一所有   分区(记住上面的请求率......)。第二,全部   分区保持稍微较旧(通常较少'热')的内容   有效地比其他命名约定更快地变冷   浪费每个分区每秒可用的操作数   随着时间的推移让所有旧的人感到寒冷。

     

使这些方案在S3中运行良好的最简单技巧   任何请求率都只是简单地反转这里的数字顺序   标识符(使用日期或基于时间的精度秒数   身份标识)。然后这些标识符有效地以随机方式开始   数字 - 以及其中的一些 - 然后粉丝了   跨越许多潜在子分区的事务。每一个   子分区的尺度足够接近线性(即使是一些   内容更热或更冷)每个没有有意义的操作   第二预算也被浪费了。事实上,S3甚至有一个算法   检测这种并行类型的写入模式并将自动进行   同时从同一个父级创建多个子分区 -   随着请求热量增加系统的每秒预算运算   被检测到。

https://aws.amazon.com/blogs/aws/amazon-s3-performance-tips-tricks-seattle-hiring-event/