【问题标题】:Downloading large files from S3 to Lambda is faster without threads无需线程即可将大文件从 S3 下载到 Lambda 更快
【发布时间】: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


【解决方案1】:

如果您只是想进行一次性传输,最好使用 DataSync 并执行此操作。这将允许您从 S3 传输到 EFS(反之亦然)。您只需要 EC2 实例上的代理和它的任务。

来自documentation

数据迁移 – 通过网络将活动数据集快速移动到 Amazon S3、Amazon EFS 或 Amazon FSx for Windows File Server。

您是否有理由要在 Lambda 中执行此操作?进入 EFS 后,是否需要将其转移到 S3(或再次从 S3 转移到 EFS)?

【讨论】:

  • 我想每天执行一次,每个 10 GB 50 个文件。
猜你喜欢
  • 1970-01-01
  • 2021-01-08
  • 2017-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-12
相关资源
最近更新 更多