将文件上传到AWS S3会占用大量CPU

时间:2013-12-16 16:36:14

标签: amazon-web-services amazon-s3

我目前正在研究服务器应用程序(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版本。

2 个答案:

答案 0 :(得分:1)

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

在旁注中..您应该查看SDK中的TransferManager API。它为您提供了一个简单的界面,可以将文件上传到Amazon S3或从Amazon S3下载文件,并且内置了多个优化功能。

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

答案 1 :(得分:1)

我在AWS SDK for .NET中遇到了同样的问题。将50GB文件上载到S3会加载100%的CPU使用率。

我描述了该应用。

原来,这是因为所有AWS API请求都必须“签名”,并且文件 - 特别是大文件 - 通过多个请求发送。块,有时数千,其中一些是同时的。然后,每个请求都通过SHA256进行激活,并使用IAM凭证进行签名。

限制并发线程的数量,禁用httpS(使用http)等等。在快速连接上它仍将使用大约30%:(((如果你从EC2发送到同一区域的S3是< strong> 非常快速的连接)