我目前正在使用服务器应用程序(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版本。
我想不出任何原因导致SDK代码会使您的CPU变得如此高。我的第一个猜测是某种垃圾回收问题。上传数据时,您是将File对象传递给AmazonS3.putObject还是某种流(包括FileInputStream)?流可能会有些棘手,因为不能保证流是可重复的,并且您必须在上载时在ObjectMetadata中显式提供Content-Length,作为上载的一部分,否则SDK必须将上载缓冲在内存中以进行计算总长度。这是我建议退房的第一件事。
另外,您应该在SDK中签出TransferManager API。它为您提供了一个很好的简单界面,用于将文件上传到Amazon S3和从Amazon S3下载文件,并且内置了多项优化功能。
如果仍然没有找到线索,那么我建议为此做一个简单的复制实例。编写一个类文件,该文件简单地将一个随机文件上传到相同的S3密钥,并使该文件与应用程序代码的运行时间相同。如果您能够通过这种简单的设置重现该问题,那么我们可以看一下代码并帮助对其进行调试,但是在完整的应用程序代码中涉及所有其他变量的情况下,我们只能做很多事情猜猜可能会发生什么。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句