使用AWS C ++ SDK最大化S3上传性能

时间:2019-06-04 21:57:10

标签: aws-sdk-cpp

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

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

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

我已经研究了S3Client的基础实现以及所有低级线程管理和curl句柄管理。我看不到任何明显无效的事情。对于我来说,在具有36个物理内核的机器上,我需要200个线程来实现这种性能,这对我没有任何意义。这是预期的吗?有人可以解释发生了什么,或者以其他方式将SDK配置为不需要这么多线程吗?我想我可以提供自己的HTTPClientFactory并自定义一些东西,以便在我小心的情况下在卷曲句柄的管理方式上切出一个互斥体,但这似乎不太可能解释我所看到的情况。

感谢您的帮助。

-亚当

1 个答案:

答案 0 :(得分:0)

  

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

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