繁体   English   中英

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

[英]How to handle running out of direct memory when downloading large files with Vert.x & Netty?

我有一个 Vert.x Web 服务,它偶尔会从 AWS S3 下载大型 ZIP 文件。 下载后,档案被解压缩,个别文件被重新上传到 AWS S3。 Web 服务作为t2.large (8GB 内存)实例托管在 AWS Elastic Beanstalk 中。 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 配置来缓解这个问题吗?

请检查这个

github.com/aws/aws-sdk-java-v2/issues/1301

我们在 SDK 中发现了一个问题,当使用 s3 异步客户端将大对象下载到文件时,它可能会导致缓冲区使用过多并最终导致 OOM。 修复 #1335 在 2.7.4 中可用。 可以用最新版试试吗? 如果您继续看到该问题,请随时重新打开。 " – AWS PS 21 小时前 删除

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM