Python Boto3 使用多线程 S3 分段上传不起作用

0

【以下的问题经过翻译处理】 你好, 我正在尝试将 113 MB(119.244.077 字节)视频上传到我的存储桶,它总是需要 48 秒,即使我使用 TransferConfig,似乎多线程上传不起作用,任何建议?

def upload_to_s3(file_name, bucket,path_s3):

    config = TransferConfig(multipart_threshold=1024 * 25,
                            max_concurrency=10,
                            multipart_chunksize=1024 * 25,
                            use_threads=True)
    try:
        start_time = time.time()
        _ = s3_client.upload_file(file_name, bucket, path_s3, Config=config)
        elapsed_time = time.time() - start_time
        print(f"Time:  {elapsed_time}")
    except ClientError as e:
        logging.error(e)
        return False

path_s3  = "something"
config = Config(connect_timeout=5,  retries={'max_attempts': 0},max_pool_connections=25) 
s3_client = boto3.client('s3', aws_access_key_id=ACCESS_KEY, aws_secret_access_key=SECRET_KEY, region_name=REGION_NAME, config=config)

# Set here the path of the file
path_file_to_upl = "./data/80e12098-ec85-59db-6e36-82e04e884439.mkv"

#Upload
upload_to_s3(path_file_to_upl, BUCKET_NAME,path_s3)


使用上面的代码我需要 48/49 秒,如果我设置 use_threads=False 时间增加到 71 秒

profile picture
专家
已提问 5 个月前25 查看次数
1 回答
0

【以下的回答经过翻译处理】 检查分段上传是否实际使用多个流的一种方法是在运行传输的机器上运行类似“tcpdump”的实用程序。如果分段上传正常,您会看到不止一个到 S3 的 TCP 连接。如果不是,您将只能看到一个 TCP 连接。

鉴于启用/禁用多线程时存在速度差异(48 秒对 71 秒),我认为分段上传正在运行。

使用分段上传的主要原因是为了更好地利用您拥有的可用带宽,因为(一般来说,我跳过了很多细节)由于延迟、数据窗口等原因,TCP 不会使用所有带宽.即使那样,也会有一个基于可用带宽的最大传输速度。

您是否可能正在使用所有带宽并且 48 秒是此处可能的最佳时间?您尚未指定要从何处上传(EC2 或某个外部 AWS);也不是 S3 的延迟,所以很难说。

我假设你的问题是“我怎样才能让我的转移更快”,但没有其他信息就不可能说。

在这里添加是因为它更整洁

作为“好”的衡量标准,我会尝试使用 AWS CLI 进行相同的传输并查看您从中获得的时间。

目前,如果您可以在大约 48 秒内传输 115 MB,那么您的上传速度大约为 25 Mb/s(假设该区域的延迟非常低)。您的家庭网络到 Internet 的带宽是多少?

profile picture
专家
已回答 5 个月前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则