问题描述
当Spring Boot Admin Server 应用启动后(大约过2、3分钟后),就会产生大量的FD。很快就超出Linux系统设置的open files
的限制。会对其它进程的应用程序产生影响。有时会出现: Too many open files
的错误。
环境描述
JDK version:
kk@test207:~$ java -version
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)
OS version:
kk@test207:~$ uname -a
Linux test207 4.4.0-135-generic #161-Ubuntu SMP Mon Aug 27 10:45:01 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
Spring Boot version:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.3.1.RELEASE</version>
</dependency>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>2.3.1</version>
</dependency>
问题排查
查看当前OS的open files
配置:
kk@test207:~$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 63059
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
# 允许打开最大的FD个数
open files (-n) 1048576
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 63059
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
# 查看 opne files
kk@test207:~$ ulimit -n
1048576
#
kk@test207:~$ cat /proc/sys/fs/file-max
1610209
查看 Spring Boot Admin 的进程已经打开了多少FD
# 查看 monitor-server 应用的 PID
kk@test207:~$ sudo jps -lvm |grep monitor
1315 monitor-server.jar -Xms512m -Xmx512m
# 查看 monitor-server 打开了多少 FD
# FD: file describe 文件描述符。当每次有新的client 和 server 建立socket 时,就会创建一个socket’s fd
kk@test207:~$ sudo lsof -p 1315|wc -l
165478
# 也可以通过 /proc/<PID>/fd 查看,和 lsof -p <PID> 一样
kk@test207:~$ sudo ls /proc/1315/fd |wc -l
168646
发现该应用打开 165478 个FD(其中99%以上都是Socket FD),已超出OS配置的限制。
问题解决
Spring Boot Admin Server 使用了 Spring WebFlux来和Spring Boot Admin Client 端来进行通信。通过在网上看到一篇文章,说是Spring Boot 2.3.1.RELEASE版本 中的 Reactor-Netty 的一个BUG:Many File Open。大家有兴趣可以看看。
只要把 Spring Boot 降级到 2.3.0.RELEASE 的版本或升级到 2.3.11.RELEASE的版本就可以解决问题。
验证
通过下面命令,观察:
kk@test207:~$ sudo lsof -p 30251|wc -l
122
此时,升级了Spring Boot的版本后,再没有出现大量FD的问题。