【问题标题】:Upload files to AWS S3 takes a lot of CPU将文件上传到 AWS S3 占用大量 CPU
【发布时间】:2019-11-05 23:17:44
【问题描述】:

我目前正在开发服务器应用程序 (JEE),但在将文件上传到 AWS S3 时遇到了一些问题。我正在使用 Java SDK (S3client.putObject) 上传这些文件。当服务器启动时,一切都按预期发生。文件在服务器(EC2 实例)中生成并在几秒钟内上传到 S3。但是几天后,性能下降了很多。通常需要 5 或 6 秒才能上传的文件现在需要 10 到 30 分钟(是的,分钟)。我分析了应用程序,这里的罪魁祸首是使用 AWS Java SDK 进行上传的部分。奇怪的是,CPU 利用率接近 100% 并保持几分钟。由于这基本上是一个 IO 操作,我不明白为什么它可能需要这么多 CPU 周期才能运行。 有没有人经历过这种行为? 关于在哪里看的任何提示?

PS:文件大小从 1 到 50 MB。

非常感谢!

更新: 创建文件并将它们上传到 S3 的 EC2 实例是 m1.large。 我使用的是 1.6.4 AWS SDK 版本。

【问题讨论】:

  • 即使您不重新启动应用,上传文件的时间最终会降到“5 或 6 秒”吗?
  • 不,它不会返回。我需要重启应用服务器
  • 如果您将 SSL 用于 S3,如果您已经采取了其他步骤来优化 S3 性能,则可以考虑使用 AES-NI。
  • @CleversonSchmidt 听起来你有某种资源泄漏
  • @HyperAnthony 如果 AES-NI 是问题所在,不应该每次都发生吗?

标签: amazon-web-services amazon-s3


【解决方案1】:

我在适用于 .NET 的 AWS 开发工具包中遇到了同样的问题。将 50GB 文件上传到 S3 会加载 100% 的 CPU 使用率。

我分析了应用程序。

事实证明,这是因为所有 AWS API 请求都必须“签名”,并且文件(尤其是大文件)是通过多个请求和块发送的,有时是数千个,其中一些是同时发送的。然后通过 SHA256 对每个请求进行哈希处理,并使用 IAM 凭证进行签名。

限制并发线程数,禁用httpS(使用http),限制块数,增加块大小等。这样做可以减轻负载,但它仍然会使用大约20-30%快速连接 :(((即使您在同一区域从 EC2 发送到 S3,这非常快的连接)

【讨论】:

    【解决方案2】:

    我想不出为什么 SDK 代码会导致您的 CPU 如此之高。我的第一个猜测是某种垃圾收集问题。当您上传数据时,您是将 File 对象传递给 AmazonS3.putObject 还是某种流(包括 FileInputStream)?处理流可能有点棘手,因为不能保证它们是可重复的,并且您必须在上传时明确提供 ObjectMetadata 中的 Content-Length,否则 SDK 必须在内存中缓冲您的上传以计算总长度。这是我推荐的第一件事。

    附带说明.. 您应该查看 SDK 中的 TransferManager API。它为您提供了一个漂亮的简单界面,用于向/从 Amazon S3 上传和下载文件,并内置了多项优化。

    如果这仍然没有线索,那么我建议为此制作一个简单的复制案例。编写一个简单的类文件,将随机文件上传到相同的 S3 密钥,并使其运行的持续时间与您的应用程序代码相同。如果您能够在那个简单的设置中重现问题,那么我们可以查看代码并帮助对其进行调试,但是由于您的完整应用程序代码中涉及所有其他变量,我们无能为力猜猜会发生什么。

    【讨论】:

    • 非常感谢!我将 Inputstream 传递给 AmazonS3.putObject 并设置内容长度。我会检查 TransferManager API 看看是否有帮助。
    猜你喜欢
    • 2018-07-13
    • 2012-06-20
    • 1970-01-01
    • 2019-02-20
    • 1970-01-01
    • 2019-10-31
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    相关资源
    最近更新 更多