Максимальная производительность загрузки S3 с помощью AWS C ++ SDK - PullRequest
1 голос
/ 05 июня 2019

Я использую экземпляр c5.18xlarge с включенным адаптером ENA (так что ожидайте подключение 25 Гбит / с к S3 для поддержки AWS).Я использую AWS C ++ SDK (версия 1.3.59) на RHEL 7 для загрузки файла размером 70 ГБ в один объект S3, используя размер детали 256 МБ.Для поддержки AWS я установил в поле maxConnections ClientConfiguration значение 999, а в поле его исполнителя - PooledThreadExecutor с размером пула 999 (и это повысило мою производительность).Я выполняю серию вызовов S3Client :: UploadPart (), сам выполняю их;Я получаю очень похожую производительность, когда использую UploadPartCallable () и позволяю SDK управлять потоками.

Вот производительность, которую я вижу: - 36 потоков: 7,5 Гбит / с - 200 потоков: 15,7 Гбит / с

Служба поддержки AWS сообщила о похожем поведении (на самом деле они использовали 900 потоков).

Я просмотрел базовую реализацию S3Client и все низкоуровневое управление потоками и управление дескрипторами завитков.Я не вижу ничего явно неэффективного.Для меня просто не имеет никакого смысла, что мне нужно 200 потоков для достижения этой производительности на машине с 36 физическими ядрами.Это ожидается?Может ли кто-нибудь дать объяснение происходящему или другой способ настроить SDK, чтобы он не требовал такого количества потоков?Я думаю, что мог бы предоставить свой собственный HTTPClientFactory и настроить вещи, чтобы отключить мьютекс в управлении дескрипторами завитков, если я буду осторожен, но это вряд ли объясняет то, что я вижу.

Спасибо залюбая помощь.

-Адам

1 Ответ

0 голосов
/ 06 июня 2019

Я использую AWS C ++ SDK (версия 1.3.59) на RHEL 7 для загрузки файла размером 70 ГБ в один объект S3 с размером детали 256 МБ.

Вероятно, вы ограничены пропускной способностью чтения вашего диска / запоминающего устройства. Это действительно впечатляет, что вы можете достичь 15,7 Гбит / с.

...