首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >用于S3到EC2下载的FileOutputStream.close()上的Java挂起

用于S3到EC2下载的FileOutputStream.close()上的Java挂起
EN

Stack Overflow用户
提问于 2018-10-23 21:13:19
回答 1查看 310关注 0票数 4

我有一个挂在FileOutputStream.close()上的应用程序(实际上它挂在原生FileOutputStream.close0()上,但不管怎样)。还有..。我真的不知道是什么原因造成的。Java/Linux调试专家如何解决这个问题?

我用jstack找到了犯罪现场,如下所示:

代码语言:javascript
复制
s3-transfer-manager-worker-1" #22 prio=5 os_prio=0 tid=0x00007f9f40007800 nid=0x2e6 runnable [0x00007f9fac4d7000]
   java.lang.Thread.State: RUNNABLE
        at java.io.FileOutputStream.close0(Native Method)
        at java.io.FileOutputStream.access$000(FileOutputStream.java:53)
        at java.io.FileOutputStream$1.close(FileOutputStream.java:356)
        at java.io.FileDescriptor.closeAll(FileDescriptor.java:212)
        - locked <0x00000005c3bbc440> (a java.io.FileDescriptor)
        at java.io.FileOutputStream.close(FileOutputStream.java:354)
        at sun.nio.ch.FileChannelImpl.implCloseChannel(FileChannelImpl.java:139)
        at java.nio.channels.spi.AbstractInterruptibleChannel.close(AbstractInterruptibleChannel.java:115)
        - locked <0x00000005c3bbc600> (a java.lang.Object)
        at com.amazonaws.util.IOUtils.closeQuietly(IOUtils.java:70)
        at com.amazonaws.services.s3.internal.ServiceUtils.appendFile(ServiceUtils.java:473)
        at com.amazonaws.services.s3.transfer.internal.CompleteMultipartDownload.call(CompleteMultipartDownload.java:46)
        at com.amazonaws.services.s3.transfer.internal.CompleteMultipartDownload.call(CompleteMultipartDownload.java:29)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)

下载代码

以下是我们的S3下载代码的简化版本:

代码语言:javascript
复制
AmazonS3Client s3Client = new AmazonS3Client(new DefaultAWSCredentialsProviderChain());
s3Client.setRegion(...);
TransferManager s3TransferManager = TransferManagerBuilder.standard().withS3Client(s3Client).build();

GetObjectRequest objectRequest = new GetObjectRequest(...);
Path localTempFile = Files.createTempFile(...);
Download downloadHandle = s33TransferManager.download(objectRequest, localTempFile.toFile());

downloadHandle.waitForCompletion();

很不错的香草味。

背景

这是Java AWS S3 API将文件下载到本地磁盘的一种非常简单的用法。我可以使用aws s3 cp ...命令行应用程序下载相同的文件。更令人困惑的是,这个应用程序以前工作得很好。它有大约1000个这样的文件要下载,在开始下载之前,它已经下载了其中的11个。

我知道的事情:

这些文件都很强大,每个大约20 GB,,

  • ,我试了很多次,让它放在那里1:00h,最近是2:00h。它保持挂起状态。

  • 我们有足够的可用磁盘空间: 200 GB。(如果这就是问题所在,无论如何它都会抛出一个异常),我试着关闭它,然后再打开(通过sudo reboot).

  • It's an m4.2xlarge EC2

  • ,CPU不忙。

  • 我可以通过aws s3 cp ...命令行从S3下载完全相同的文件到完全相同的位置,这就排除了以下问题:(again).

  • IOPS

  • 磁盘空间问题和短缺(除非Java SDK的TransferManager正在做一些非常不同的事情,并且下载速度很慢:在命令行上下载文件只需要大约5分钟。

  • permission problems.

下一步?

不幸的是,我所知道的并不足以让我在调试中走得更远。是否有特定的Linux指标或命令需要检查,以查看系统资源是否已耗尽或死锁?

EN

回答 1

Stack Overflow用户

发布于 2018-10-24 04:50:15

我几乎不想这么说,因为它是每个程序员最喜欢的跟踪马,但“它是商业安全软件”。当我们禁用扫描过程时,它会神奇地自我修复。

事实证明,它并没有完全挂起,它只是以令人难以置信的速度组装所有下载的.part文件:每40秒就有一个8MB的块。我猜安全进程正在拦截文件写入,并以某种方式将它们纠缠在一起?我不知道。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52950030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档