【发布时间】:2020-09-21 22:04:33
【问题描述】:
我正在尝试用 Lambda 中的 python 代码下载大小为 15GB 的二进制文件(到 EFS,因为 /tmp 的限制为 500 MB),但它需要太多时间,所以我有超时错误(Lambda 的限制是15 分钟)。
为了轻松调试我正在使用 470MB (abc.tar) 和 /tmp 文件的代码。
我正在尝试使用多部分下载使代码更快地下载文件。
这是我没有线程的脚本:
import json
import boto3
import time
import os
from boto3.s3.transfer import TransferConfig
s3 = boto3.client('s3')
def lambda_handler(event, context):
s_t = time.time()
config = TransferConfig(use_threads=False)
s3.download_file('my_bucket', 'abc.tar', '/tmp/abc.tar', Config=config)
print("time: ", time.time() - s_t) #print time took to download_file
return{
"statusCode": 200
}
下载abc.tar需要25秒。
当我将配置更改为 use_threads=True 时,花了 45 秒(我运行了几次)。
这让我很惊讶,因为我认为线程应该让它更快。
尽管如此,我尝试将此配置(从 this 中等帖子中看到)与 multipart + 线程一起使用:
config = TransferConfig(multipart_threshold=1024*20, max_concurrency=3, multipart_chunksize=1024*20, use_threads=True)
我超时了(70 秒后)。
如何让分段下载文件更快?
【问题讨论】:
-
Lambda 在这里可能不是最佳选择,但请注意,您选择的 Lambda RAM 大小会有所不同,因为 CPU 和网络带宽都会随着 RAM 大小的增加而增加。使用 3GB RAM 选项再试一次,看看有什么不同。或者试试lambda-power-tuning。另请参阅youtube.com/watch?v=FTCaOQJvG6Y
-
正如@jarmod 所说,您为 Lambda 分配了多少内存?在另一种语言的测试中,我看到使用或不使用 TransferManager 大约需要 9 秒。我正在使用 1 GB 和 2 GB 的 Lambda,并且确实看到 2GB 有所改进。
标签: amazon-web-services amazon-s3 aws-lambda boto3