[使用Vert.x和Netty下载大文件时如何处理直接内存不足?

问题描述 投票:0回答:1

我有一个Vert.x Web服务,有时会从AWS S3下载大型ZIP文件。下载后,将存档解压缩,并将单个文件重新上传到AWS S3。该Web服务在AWS Elastic Beanstalk中作为t2.large(8GB内存)实例托管。 Java应用程序当前配置有2-4GB的堆空间,并且ZIP文件的大小最多为10GB(但是大多数文件最多为2-4GB)。

[当应用程序尝试下载大于2GB的ZIP文件时,ZIP文件的初次下载或单个文件的重新上传始终会失败,并且堆栈跟踪类似于以下内容:

Caused by: io.netty.util.internal.OutOfDirectMemoryError: failed to allocate 16777216 byte(s) of direct memory (used: 1895825439, max: 1908932608)

经过一些研究,似乎Vert.x使用Netty来加快网络I / O的速度,而后者又利用直接内存来提高下载性能。似乎直接内存释放得不够快,这会导致上述类似的内存不足异常。

最简单的解决方案就是将实例大小增加到16GB t2.xlarge,并在运行时分配更多的直接内存(例如-XX:MaxDirectMemorySize),但是我想先探讨其他解决方案。有没有办法以编程方式强制Netty在不再使用后释放直接内存?我可以添加其他的Vert.x配置来缓解此问题吗?

java amazon-s3 jvm netty vert.x
1个回答
0
投票

[如果其他人遇到相同的问题,我发现将S3客户端(software.amazon.awssdk:s3)从2.5.41升级到最新版本(在撰写本文时为2.10.44)似乎已经解决了此问题。 @AWSPS链接到的潜在问题是,SDK似乎已按两倍的频率读取基础频道,此问题已在2.7.4上修复。

© www.soinside.com 2019 - 2024. All rights reserved.