Spring 引导管理 - 系统错误中打开的文件过多

Spring Boot Admin - Too Many open Files In System Error

我正在尝试在 ECS Fargate 上 运行 spring-boot-admin - 几分钟后服务器死机并且日志中充满了 'too many open files in system' 错误。

我正在使用 spring-boot 2.3.1,并尝试了 2.2.3 和 spring-boot-admin 的 2.3.0-SNAPSHOT。该 jar 运行ning 在 ubuntu 20.04 基本映像上,安装了 openjdk-11-jdk-headless。 ECS 服务有 2gb RAM 可用,我增加了 nofile 和 nproc 的 Ulimits (100000)

      Ulimits:
        - Name: nofile
          HardLimit: 1000000
          SoftLimit: 1000000
        - Name: nproc
          HardLimit: 1000000
          SoftLimit: 1000000

堆栈跟踪:

2020-06-29 22:03:35.691 ERROR 6 --- [io-8080-exec-24] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is io.netty.channel.ChannelException: io.netty.channel.unix.Errors$NativeIoException: newSocketStream(..) failed: Too many open files in system] with root cause io.netty.channel.unix.Errors$NativeIoException: newSocketStream(..) failed: Too many open files in system 2020-06-29 22:03:36.345 ERROR 6 --- [io-8080-exec-14] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is io.netty.channel.ChannelException: io.netty.channel.unix.Errors$NativeIoException: newSocketStream(..) failed: Too many open files in system] with root cause io.netty.channel.unix.Errors$NativeIoException: newSocketStream(..) failed: Too many open files in system 2020-06-29 22:03:36.350 ERROR 6 --- [o-8080-Acceptor] org.apache.tomcat.util.net.Acceptor : Socket accept failed java.io.IOException: Too many open files in system at java.base/sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method) ~[na:na] at java.base/sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:533) ~[na:na] at java.base/sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:285) ~[na:na] at org.apache.tomcat.util.net.NioEndpoint.serverSocketAccept(NioEndpoint.java:469) ~[tomcat-embed-core-9.0.36.jar!/:9.0.36] at org.apache.tomcat.util.net.NioEndpoint.serverSocketAccept(NioEndpoint.java:71) ~[tomcat-embed-core-9.0.36.jar!/:9.0.36] at org.apache.tomcat.util.net.Acceptor.run(Acceptor.java:95) ~[tomcat-embed-core-9.0.36.jar!/:9.0.36] at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]

我有一组 8 个微服务与 sba-client(目前没有安全性)连接,用于 3 个环境(总共 24 个实例)。只有客户端中的设置是:

spring.boot.admin.client.instance.prefer-ip=true
spring.boot.admin.client.url=https://xxxxx.com
spring.boot.admin.client.instance.name=
spring.boot.admin.client.instance.metadata.tags.environment=${spring.profiles.active}

我已经启用了 prefer IP,因为这些实例中的大多数都不在 Eureka 或负载均衡器之后,并且只处理队列外的数据。

服务器只设置了spring.boot.admin.ui.public-url

前几分钟一切正常 - 但随后这些错误开始出现,一切都崩溃了。 Cloudwatch 指标显示 cpu 达到 100%,然后 sba 上的目标组健康检查失败,ECS 重新启动任务。目前这大约需要 30 分钟。

从默认值提高 ulimits 增加了应用崩溃前的时间,但它最终还是崩溃了——就好像它的套接字/连接泄漏一样。

我没有任何经验 运行使用 webflux / netty 应用程序 - 有什么我遗漏的吗?我需要设置更高的 ulimit 吗?

我遇到了同样的问题,发现 spring 启动时有一个问题:Many File Open Issue : Spring Boot 2.3.0 -> Spring Boot 2.3.1 #21934

在新版本发布之前,将 reactor-netty 升级到 0.9。9.RELEASE 应该会修复它,对我来说是这样!

我遇到了同样的问题,不幸的是将 reactor-netty 更新为 0.9.9.RELEASE 并没有解决问题,但降级为 0.9.7.RELEASE.