Производительность загрузки AWS CLI Намного выше, чем у Boto3

#python-3.x #performance #boto3 #aws-cli #botocore

Вопрос:

Я пытаюсь загрузить значительное количество небольших файлов из AWS S3 (50 000 ) и постоянно отмечаю, что команда AWS sync CLI доминирует в моем решении, написанном в boto3. Я начал просматривать исходный код интерфейса командной строки AWS в поисках способов улучшения моего решения boto, но помимо репликации TransferManager и TransferConfig я не вижу точной причины такого повышения производительности

Например, команда синхронизации:

aws s3 sync s3://my-bucket/folder/subfolder folder/subfolder

Для 50 000 небольших файлов требуется около 111 секунд. На самом деле, это даже после того, как я завернул sync в subprocess пробежку. И мой аналогичный код на python занимает почти вдвое больше времени (210 секунд).:

 import boto3
import botocore
from s3transfer.manager import TransferManager
from s3transfer.manager import TransferConfig

# can get list of files anyhow, list_objects_v2, etc
files = []

botocore_config = botocore.config.Config(max_pool_connections=10)
s3_client = boto3.client('s3', config=botocore_config)

transfer_config = TransferConfig(
   max_request_concurrency=10,
   max_request_queue_size = 1000,
   multipart_threshold = 8 * (1024 ** 2),
   multipart_chunksize = 8 * (1024 ** 2),
   max_bandwidth = None
)

transfer_config.max_in_memory_upload_chunks = 6
transfer_config.max_in_memory_download_chunks = 6

s3t = TransferManager(s3client, transfer_config)

start = time.time()

for file in files:
    s3t.download(bucket=bucket, key=file, fileobj=file, subscribers=None)

s3t.shutdown()

end = time.time()
benchmark = end - start
print(f's3transfer {benchmark}')

 

Мой вопрос в том, чего мне не хватает, чтобы сделать эту загрузку более эффективной? Я вижу, что интерфейс командной строки AWS может загружать файлы намного быстрее, несмотря на то, что он использует один и тот же низкоуровневый модуль botocore для выполнения своих запросов.

Комментарии:

1. Всегда ли папка назначения в синхронизации пуста? в противном случае вы не загружаете все 50 тысяч файлов, а просто проверяете наличие дельт. Кроме того, что произойдет, если вы просто используете s3 = boto3.client («s3») s3.download_file («ИМЯ КОРЗИНЫ», «ИМЯ ОБЪЕКТА», «ИМЯ ФАЙЛА») и вообще пропустите s3transfer. Я не использовал s3transfer, но использовал мультипроцессор для ускорения загрузки многих небольших файлов. Может быть, просто больше накладных расходов при использовании s3transfer???

2. что такое TransferManager ?

3. Я обязательно очищаю папку назначения перед запуском. Интерфейс командной строки AWS использует s3transfer для фактического выполнения sync команд, и другие примеры загрузки boto3, которые я видел, указывают на то, что сеансы boto3 не являются потокобезопасными, но клиентские. Кроме того, TransferManager является ли класс, объявленный boto3 (и версия также объявлена как часть s3transfer), предположительно, для увеличения пропускной способности