【问题标题】:Maximizing S3 upload performance with AWS C++ SDK使用 AWS C++ SDK 最大化 S3 上传性能
【发布时间】:2019-10-20 10:53:53
【问题描述】:

我正在使用启用了 ENA 适配器的 c5.18xlarge 实例(因此预计每个 AWS 支持都具有到 S3 的 25 Gbps 连接)。我在 RHEL 7 上使用 AWS C++ SDK(版本 1.3.59)使用 256 MB 的部分大小将 70 GB 的文件上传到单个 S3 对象。根据 AWS 支持,我已将 ClientConfiguration 的 maxConnections 字段设置为 999,并将其 executor 字段设置为使用池大小为 999 的 PooledThreadExecutor(这些提高了我的性能)。我正在执行一系列 S3Client::UploadPart() 调用,自己处理这些;使用 UploadPartCallable() 并让 SDK 管理线程时,我得到了非常相似的性能。

这是我看到的表现: - 36 个线程:7.5 Gbps - 200 个线程:15.7 Gbps

AWS 支持报告了类似的行为(实际上他们使用了 900 个线程)。

我查看了 S3Client 的底层实现以及所有低级线程管理和 curl 句柄管理。我没有看到任何明显低效的事情发生。我需要 200 个线程才能在具有 36 个物理内核的机器上实现这种性能,这对我来说没有任何意义。这是预期的吗?有人可以解释正在发生的事情或将 SDK 配置为不需要这么多线程的不同方法吗?如果我小心的话,我想我可以提供自己的 HTTPClientFactory 并定制一些东西来切断如何管理 curl 句柄的互斥锁,但这似乎不太可能解释我所看到的。

感谢您的帮助。

-亚当

【问题讨论】:

    标签: aws-sdk-cpp


    【解决方案1】:

    我在 RHEL 7 上使用 AWS C++ SDK(版本 1.3.59)将 70 GB 文件上传到使用 256 MB 部分大小的单个 S3 对象。

    您可能受到磁盘/存储设备读取吞吐量的限制。能够达到 15.7 Gbps 确实令人印象深刻。

    【讨论】:

    • 啊,我应该澄清一下;对于这个测试,我分配了一个大缓冲区并直接从该内存缓冲区上传到 S3,因此没有文件 I/O。网络、后端 S3 实现和 SDK 的某种组合一定会限制性能。需要这么多线程让我感到非常惊讶......
    • 每个线程都与 S3 建立自己的连接。连接越多,您可以转移到 S3 的次数就越多。
    【解决方案2】:

    在我的测试中,我看到Aws::Utils::Threading::PooledThreadExecutor 创建的所有线程都在一个 CPU 内核中运行(而 Spot 实例有 72 个 vCPU)。您在测试中看到过同样的行为吗?

    我进一步提高性能的方法是使用我自己的线程模型和 S3Client 阻塞 API,而不是 PooledThreadExecutor 和 S3 异步方法(例如 UploadPartAsync())。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-18
      • 1970-01-01
      • 1970-01-01
      • 2022-08-20
      • 2021-06-13
      • 2017-10-17
      • 2021-06-13
      • 1970-01-01
      相关资源
      最近更新 更多