09 spring-boot-acurator 定时检测 redis 集群导致 “IOException: Too many open files“

news/2024/4/30 8:18:44/文章来源:https://blog.csdn.net/u011039332/article/details/131357618

前言

问题的现象主要是如下 

项目刚启动的时候 十分正常, 然后 随着时间的推移, 比如说 项目跑了 四五天之后 

项目 突然出现问题, 一部分服务能够正常访问, 一部分服务抛出异常

异常信息 就是 too many files 

这里的主要的问题是 在异常之前, redis 集群没有密码, 然后 某一天 redis 集群增加了密码之后, 就出现了 上述的问题

当然 这个 也是 从后面的情况中 推导出去的

异常信息 如下

java.io.IOException: Too many open filesat sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method)at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:422)at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:250)at org.apache.tomcat.util.net.NioEndpoint.serverSocketAccept(NioEndpoint.java:450)at org.apache.tomcat.util.net.NioEndpoint.serverSocketAccept(NioEndpoint.java:73)at org.apache.tomcat.util.net.Acceptor.run(Acceptor.java:95)at java.lang.Thread.run(Thread.java:748)
2023-06-16 11:03:00.354 [http-nio-8291-Acceptor-0] ERROR org.apache.tomcat.util.net.Acceptor - Socket accept failed
java.io.IOException: Too many open filesat sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method)at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:422)at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:250)at org.apache.tomcat.util.net.NioEndpoint.serverSocketAccept(NioEndpoint.java:450)at org.apache.tomcat.util.net.NioEndpoint.serverSocketAccept(NioEndpoint.java:73)at org.apache.tomcat.util.net.Acceptor.run(Acceptor.java:95)at java.lang.Thread.run(Thread.java:748)

异常出现了 too many files, 一般的处理方式就是 查看项目 是否有那么多 需要打开的 文件, 网络连接, socket, pipe 等等 

如果项目确实 需要打开那么多的 FileDescriptor, 那么 调整 linux 的 open fields 的数量即可 

但是 如果是 大量的异常情况的 FileDescriptor, 那么 就需要排查对应的问题了

我们这里的情况就是 大量的 异常的 FileDescriptor

问题的调试

首先看一下 现场情况

查看 当前进程的所有 fd 的信息如下, 可以看到 大量的 socket 的 FileDescriptor

root@ubuntu:~# ll /proc/17843/fd | grep socket
lrwx------ 1 root root 64 Jun 21 09:13 14 -> socket:[1092572]
lrwx------ 1 root root 64 Jun 21 09:13 158 -> socket:[1091360]
lrwx------ 1 root root 64 Jun 21 09:13 183 -> socket:[1091361]
lrwx------ 1 root root 64 Jun 21 09:13 208 -> socket:[1091362]
lrwx------ 1 root root 64 Jun 21 09:13 209 -> socket:[1091363]
lrwx------ 1 root root 64 Jun 21 09:13 210 -> socket:[1091364]
lrwx------ 1 root root 64 Jun 21 09:13 211 -> socket:[1091365]
lrwx------ 1 root root 64 Jun 21 09:13 212 -> socket:[1098021]
lrwx------ 1 root root 64 Jun 21 09:13 213 -> socket:[1091372]
lrwx------ 1 root root 64 Jun 21 09:13 214 -> socket:[1091373]
lrwx------ 1 root root 64 Jun 21 09:13 215 -> socket:[1091374]
lrwx------ 1 root root 64 Jun 21 09:13 216 -> socket:[1093391]
lrwx------ 1 root root 64 Jun 21 09:13 217 -> socket:[1093392]
lrwx------ 1 root root 64 Jun 21 09:13 218 -> socket:[1094944]
lrwx------ 1 root root 64 Jun 21 09:13 219 -> socket:[1091375]
lrwx------ 1 root root 64 Jun 21 09:13 220 -> socket:[1091376]
lrwx------ 1 root root 64 Jun 21 09:13 221 -> socket:[1091377]
lrwx------ 1 root root 64 Jun 21 09:13 222 -> socket:[1091378]
lrwx------ 1 root root 64 Jun 21 09:13 223 -> socket:[1091379]
lrwx------ 1 root root 64 Jun 21 09:13 224 -> socket:[1091380]
lrwx------ 1 root root 64 Jun 21 09:13 225 -> socket:[1091389]
lrwx------ 1 root root 64 Jun 21 09:13 226 -> socket:[1091390]
lrwx------ 1 root root 64 Jun 21 09:13 227 -> socket:[1091391]
lrwx------ 1 root root 64 Jun 21 09:13 228 -> socket:[1091392]
lrwx------ 1 root root 64 Jun 21 09:13 229 -> socket:[1091393]
lrwx------ 1 root root 64 Jun 21 09:13 230 -> socket:[1091394]
lrwx------ 1 root root 64 Jun 21 09:13 231 -> socket:[1091401]
lrwx------ 1 root root 64 Jun 21 09:13 232 -> socket:[1094176]
lrwx------ 1 root root 64 Jun 21 09:13 233 -> socket:[1094181]
lrwx------ 1 root root 64 Jun 21 09:13 234 -> socket:[1094238]
lrwx------ 1 root root 64 Jun 21 09:13 235 -> socket:[1094247]
lrwx------ 1 root root 64 Jun 21 09:13 236 -> socket:[1094248]
lrwx------ 1 root root 64 Jun 21 09:13 237 -> socket:[1095491]
lrwx------ 1 root root 64 Jun 21 09:13 238 -> socket:[1095494]
lrwx------ 1 root root 64 Jun 21 09:13 239 -> socket:[1095495]
lrwx------ 1 root root 64 Jun 21 09:13 240 -> socket:[1095496]
lrwx------ 1 root root 64 Jun 21 09:13 241 -> socket:[1095497]
lrwx------ 1 root root 64 Jun 21 09:13 242 -> socket:[1095498]
lrwx------ 1 root root 64 Jun 21 09:13 243 -> socket:[1091535]
lrwx------ 1 root root 64 Jun 21 09:13 244 -> socket:[1091536]
lrwx------ 1 root root 64 Jun 21 09:13 245 -> socket:[1091537]
lrwx------ 1 root root 64 Jun 21 09:13 246 -> socket:[1091538]
lrwx------ 1 root root 64 Jun 21 09:13 247 -> socket:[1091539]
lrwx------ 1 root root 64 Jun 21 09:13 248 -> socket:[1091540]
lrwx------ 1 root root 64 Jun 21 09:13 249 -> socket:[1098022]
lrwx------ 1 root root 64 Jun 21 09:13 25 -> socket:[1092819]
lrwx------ 1 root root 64 Jun 21 09:13 250 -> socket:[1098023]
lrwx------ 1 root root 64 Jun 21 09:13 251 -> socket:[1098024]
lrwx------ 1 root root 64 Jun 21 09:13 252 -> socket:[1098025]
lrwx------ 1 root root 64 Jun 21 09:13 253 -> socket:[1098026]
lrwx------ 1 root root 64 Jun 21 09:13 254 -> socket:[1110159]
lrwx------ 1 root root 64 Jun 21 09:13 255 -> socket:[1098782]
lrwx------ 1 root root 64 Jun 21 09:13 256 -> socket:[1098783]
lrwx------ 1 root root 64 Jun 21 09:13 257 -> socket:[1095991]
lrwx------ 1 root root 64 Jun 21 09:13 258 -> socket:[1095992]
lrwx------ 1 root root 64 Jun 21 09:13 259 -> socket:[1095993]
lrwx------ 1 root root 64 Jun 21 09:13 26 -> socket:[1092821]
lrwx------ 1 root root 64 Jun 21 09:13 260 -> socket:[1095994]
lrwx------ 1 root root 64 Jun 21 09:26 261 -> socket:[1101540]
lrwx------ 1 root root 64 Jun 21 09:26 262 -> socket:[1101541]
lrwx------ 1 root root 64 Jun 21 09:26 263 -> socket:[1101542]
lrwx------ 1 root root 64 Jun 21 09:26 264 -> socket:[1101543]
lrwx------ 1 root root 64 Jun 21 09:26 265 -> socket:[1101544]
lrwx------ 1 root root 64 Jun 21 09:26 266 -> socket:[1101545]
lrwx------ 1 root root 64 Jun 21 09:26 267 -> socket:[1104166]
lrwx------ 1 root root 64 Jun 21 09:26 268 -> socket:[1104167]
lrwx------ 1 root root 64 Jun 21 09:26 269 -> socket:[1104168]
lrwx------ 1 root root 64 Jun 21 09:26 270 -> socket:[1104169]
lrwx------ 1 root root 64 Jun 21 09:26 271 -> socket:[1104170]
lrwx------ 1 root root 64 Jun 21 09:26 272 -> socket:[1104171]

然后 ss 查看一下当前进程的 socket 的信息, 这里可以看到 具体的主机端口信息, 才能看到大概的 FileDescriptor 的情况 

然后 这里可以明确的就是 大量的 异常的和 redis 集群保持连接的 socket 未正常关闭 

root@ubuntu:~/docker/ay-resource-portals# ss -tiap | grep 17843
ESTAB      0      0      192.168.220.140:5005                 192.168.220.1:62199                 users:(("java",pid=17843,fd=5))
LISTEN     0      100       :::8291                    :::*                     users:(("java",pid=17843,fd=35))
ESTAB      0      0         ::ffff:192.168.220.140:52566                   ::ffff:192.168.220.133:afs3-callback         users:(("java",pid=17843,fd=261))
ESTAB      0      0         ::ffff:192.168.220.140:58626                   ::ffff:192.168.220.133:afs3-vlserver         users:(("java",pid=17843,fd=239))
ESTAB      0      0         ::ffff:192.168.220.140:58726                   ::ffff:192.168.220.133:afs3-vlserver         users:(("java",pid=17843,fd=257))
ESTAB      0      0         ::ffff:192.168.220.140:60864                   ::ffff:192.168.220.133:afs3-volser           users:(("java",pid=17843,fd=235))
ESTAB      0      0         ::ffff:192.168.220.140:56576                   ::ffff:192.168.220.133:afs3-errors           users:(("java",pid=17843,fd=248))
ESTAB      0      0         ::ffff:192.168.220.140:56392                   ::ffff:192.168.220.133:afs3-errors           users:(("java",pid=17843,fd=211))
ESTAB      0      0         ::ffff:192.168.220.140:58658                   ::ffff:192.168.220.133:afs3-vlserver         users:(("java",pid=17843,fd=245))
ESTAB      0      0         ::ffff:192.168.220.140:56784                   ::ffff:192.168.220.133:afs3-errors           users:(("java",pid=17843,fd=272))
ESTAB      0      0         ::ffff:192.168.220.140:32840                   ::ffff:192.168.220.133:afs3-volser           users:(("java",pid=17843,fd=265))
ESTAB      0      0         ::ffff:192.168.220.140:52478                   ::ffff:192.168.220.133:afs3-callback         users:(("java",pid=17843,fd=255))
ESTAB      0      0         ::ffff:192.168.220.140:40552                   ::ffff:192.168.220.133:afs3-prserver         users:(("java",pid=17843,fd=226))
ESTAB      0      0         ::ffff:192.168.220.140:56614                   ::ffff:192.168.220.133:afs3-errors           users:(("java",pid=17843,fd=253))
ESTAB      0      0         ::ffff:192.168.220.140:40590                   ::ffff:192.168.220.133:afs3-prserver         users:(("java",pid=17843,fd=232))
ESTAB      0      0         ::ffff:192.168.220.140:46740                   ::ffff:192.168.220.133:afs3-kaserver         users:(("java",pid=17843,fd=228))
ESTAB      0      0         ::ffff:192.168.220.140:52340                   ::ffff:192.168.220.133:afs3-callback         users:(("java",pid=17843,fd=231))
ESTAB      0      0         ::ffff:192.168.220.140:52312                   ::ffff:192.168.220.133:afs3-callback         users:(("java",pid=17843,fd=225))
ESTAB      0      0         ::ffff:192.168.220.140:56522                   ::ffff:192.168.220.133:afs3-errors           users:(("java",pid=17843,fd=236))
ESTAB      0      0         ::ffff:192.168.220.140:56734                   ::ffff:192.168.220.133:afs3-errors           users:(("java",pid=17843,fd=266))
ESTAB      0      0         ::ffff:192.168.220.140:35912                   ::ffff:192.168.220.133:27017                 users:(("java",pid=17843,fd=30))
ESTAB      0      0         ::ffff:192.168.220.140:60768                   ::ffff:192.168.220.133:afs3-volser           users:(("java",pid=17843,fd=217))
ESTAB      0      0         ::ffff:192.168.220.140:46834                   ::ffff:192.168.220.133:afs3-kaserver         users:(("java",pid=17843,fd=246))
ESTAB      0      0         ::ffff:192.168.220.140:58534                   ::ffff:192.168.220.133:afs3-vlserver         users:(("java",pid=17843,fd=221))
ESTAB      0      0         ::ffff:192.168.220.140:35938                   ::ffff:192.168.220.133:27017                 users:(("java",pid=17843,fd=49))
ESTAB      0      0         ::ffff:192.168.220.140:40688                   ::ffff:192.168.220.133:afs3-prserver         users:(("java",pid=17843,fd=249))
ESTAB      0      0         ::ffff:192.168.220.140:46906                   ::ffff:192.168.220.133:afs3-kaserver         users:(("java",pid=17843,fd=258))
ESTAB      0      0         ::ffff:192.168.220.140:40806                   ::ffff:192.168.220.133:afs3-prserver         users:(("java",pid=17843,fd=262))
ESTAB      0      0         ::ffff:192.168.220.140:56428                   ::ffff:192.168.220.133:afs3-errors           users:(("java",pid=17843,fd=218))
ESTAB      0      0         ::ffff:192.168.220.140:58468                   ::ffff:192.168.220.133:afs3-vlserver         users:(("java",pid=17843,fd=208))
ESTAB      0      0         ::ffff:192.168.220.140:33660                ::ffff:10.30.2.25:mysql                 users:(("java",pid=17843,fd=33))
ESTAB      0      0         ::ffff:192.168.220.140:52616                   ::ffff:192.168.220.133:afs3-callback         users:(("java",pid=17843,fd=267))
ESTAB      0      0         ::ffff:192.168.220.140:36766                   ::ffff:10.60.50.16:8848                  users:(("java",pid=17843,fd=26))
ESTAB      0      0         ::ffff:192.168.220.140:56454                   ::ffff:192.168.220.133:afs3-errors           users:(("java",pid=17843,fd=224))
ESTAB      0      0         ::ffff:192.168.220.140:37262                   ::ffff:10.60.50.16:8848                  users:(("java",pid=17843,fd=254))
ESTAB      0      0         ::ffff:192.168.220.140:40718                   ::ffff:192.168.220.133:afs3-prserver         users:(("java",pid=17843,fd=256))
ESTAB      0      0         ::ffff:192.168.220.140:58516                   ::ffff:192.168.220.133:afs3-vlserver         users:(("java",pid=17843,fd=215))
ESTAB      0      0         ::ffff:192.168.220.140:60822                   ::ffff:192.168.220.133:afs3-volser           users:(("java",pid=17843,fd=229))
ESTAB      0      0         ::ffff:192.168.220.140:60918                   ::ffff:192.168.220.133:afs3-volser           users:(("java",pid=17843,fd=247))
ESTAB      0      0         ::ffff:192.168.220.140:46992                   ::ffff:192.168.220.133:afs3-kaserver         users:(("java",pid=17843,fd=264))
ESTAB      0      0         ::ffff:192.168.220.140:46782                   ::ffff:192.168.220.133:afs3-kaserver         users:(("java",pid=17843,fd=234))
ESTAB      0      0         ::ffff:192.168.220.140:60988                   ::ffff:192.168.220.133:afs3-volser           users:(("java",pid=17843,fd=259))
ESTAB      0      0         ::ffff:192.168.220.140:58818                   ::ffff:192.168.220.133:afs3-vlserver         users:(("java",pid=17843,fd=263))
ESTAB      0      0         ::ffff:192.168.220.140:58698                   ::ffff:192.168.220.133:afs3-vlserver         users:(("java",pid=17843,fd=250))
ESTAB      0      0         ::ffff:192.168.220.140:60734                   ::ffff:192.168.220.133:afs3-volser           users:(("java",pid=17843,fd=210))
ESTAB      0      0         ::ffff:192.168.220.140:52258                   ::ffff:192.168.220.133:afs3-callback         users:(("java",pid=17843,fd=213))
ESTAB      0      0         ::ffff:192.168.220.140:40856                   ::ffff:192.168.220.133:afs3-prserver         users:(("java",pid=17843,fd=268))
ESTAB      0      0         ::ffff:192.168.220.140:46808                   ::ffff:192.168.220.133:afs3-kaserver         users:(("java",pid=17843,fd=240))
ESTAB      0      0         ::ffff:192.168.220.140:58602                   ::ffff:192.168.220.133:afs3-vlserver         users:(("java",pid=17843,fd=233))
ESTAB      0      0         ::ffff:192.168.220.140:52380                   ::ffff:192.168.220.133:afs3-callback         users:(("java",pid=17843,fd=237))
ESTAB      0      0         ::ffff:192.168.220.140:52230                   ::ffff:192.168.220.133:afs3-callback         users:(("java",pid=17843,fd=158))
ESTAB      0      0         ::ffff:192.168.220.140:46714                   ::ffff:192.168.220.133:afs3-kaserver         users:(("java",pid=17843,fd=222))
ESTAB      0      0         ::ffff:192.168.220.140:60796                   ::ffff:192.168.220.133:afs3-volser           users:(("java",pid=17843,fd=223))
ESTAB      0      0         ::ffff:192.168.220.140:60960                   ::ffff:192.168.220.133:afs3-volser           users:(("java",pid=17843,fd=252))
ESTAB      0      0         ::ffff:192.168.220.140:52448                   ::ffff:192.168.220.133:afs3-callback         users:(("java",pid=17843,fd=212))
ESTAB      0      0         ::ffff:192.168.220.140:47046                   ::ffff:192.168.220.133:afs3-kaserver         users:(("java",pid=17843,fd=270))
ESTAB      0      0         ::ffff:192.168.220.140:32892                   ::ffff:192.168.220.133:afs3-volser           users:(("java",pid=17843,fd=271))
ESTAB      0      0         ::ffff:192.168.220.140:40526                   ::ffff:192.168.220.133:afs3-prserver         users:(("java",pid=17843,fd=220))
ESTAB      0      0         ::ffff:192.168.220.140:46874                   ::ffff:192.168.220.133:afs3-kaserver         users:(("java",pid=17843,fd=251))
ESTAB      0      0         ::ffff:192.168.220.140:46690                   ::ffff:192.168.220.133:afs3-kaserver         users:(("java",pid=17843,fd=216))
ESTAB      0      0         ::ffff:192.168.220.140:46648                   ::ffff:192.168.220.133:afs3-kaserver         users:(("java",pid=17843,fd=209))
ESTAB      0      0         ::ffff:192.168.220.140:40622                   ::ffff:192.168.220.133:afs3-prserver         users:(("java",pid=17843,fd=238))
ESTAB      0      0         ::ffff:192.168.220.140:56480                   ::ffff:192.168.220.133:afs3-errors           users:(("java",pid=17843,fd=230))
ESTAB      0      0         ::ffff:192.168.220.140:58864                   ::ffff:192.168.220.133:afs3-vlserver         users:(("java",pid=17843,fd=269))
ESTAB      0      0         ::ffff:192.168.220.140:40498                   ::ffff:192.168.220.133:afs3-prserver         users:(("java",pid=17843,fd=214))
ESTAB      0      0         ::ffff:192.168.220.140:56546                   ::ffff:192.168.220.133:afs3-errors           users:(("java",pid=17843,fd=242))
ESTAB      0      0         ::ffff:192.168.220.140:60892                   ::ffff:192.168.220.133:afs3-volser           users:(("java",pid=17843,fd=241))
ESTAB      0      0         ::ffff:192.168.220.140:40650                   ::ffff:192.168.220.133:afs3-prserver         users:(("java",pid=17843,fd=244))
ESTAB      0      0         ::ffff:192.168.220.140:56646                   ::ffff:192.168.220.133:afs3-errors           users:(("java",pid=17843,fd=260))
ESTAB      0      0         ::ffff:192.168.220.140:58560                   ::ffff:192.168.220.133:afs3-vlserver         users:(("java",pid=17843,fd=227))
ESTAB      0      0         ::ffff:192.168.220.140:52288                   ::ffff:192.168.220.133:afs3-callback         users:(("java",pid=17843,fd=219))
ESTAB      0      0         ::ffff:192.168.220.140:37272                   ::ffff:10.60.50.16:8848                  users:(("java",pid=17843,fd=45))
ESTAB      0      0         ::ffff:192.168.220.140:40466                   ::ffff:192.168.220.133:afs3-prserver         users:(("java",pid=17843,fd=183))
ESTAB      0      0         ::ffff:192.168.220.140:52410                   ::ffff:192.168.220.133:afs3-callback         users:(("java",pid=17843,fd=243))
ESTAB      0      0         ::ffff:192.168.220.140:8291                    ::ffff:192.168.220.140:40466                 users:(("java",pid=17843,fd=46))

重新构造一下问题的现场, 这个还是 蛮花时间的, 集群搭建好了, 密码配置了, 项目启动好了之后, 没有期望的那么多 FileDescriptor 的创建 

然后 调试生产环境的项目情况, 原来这部分 和 redis 创建的连接是来自于 acurator 发送的测试请求 

然后 我们这里构造测试请求, 然后 观察 fd 的相关信息, 可以看到 redis集群 总共六个节点, 每次 请求之后, /proc/$pid/fd 下面增加 六个 FileDescriptor, 并且 长时间没有释放

curl http://192.168.220.140:8291/actuator/health 

至此 问题就基本上 复现出来了, 然后生产环境上面有 spring-boot-admin, 会定时 向各个 微服务节点 发送 /actuator/health 检测状态, 然后 随着 时间的推移, FileDescriptor 越来越多 

完整的请求上下文信息如下, 当前请求是 http://192.168.220.140:8291/actuator/health 

然后 来到 HealthEndpointWebExtension 来处理业务请求 

然后再到 CompositeHealthIndicator 来检测各个类型的指标, 然后我们这里出现问题的是在 检查 redis 的情况 的时候出现的问题

然后是获取 redis 的连接, 检查 健康状况 什么的

具体的和 redis 创建连接的地方 

核心构成 每一次 请求都需要和 redis 创建连接的地方是在这里 

GetNativeConnection 会抛出异常, 然后 this.connection 一直为空

然后在 getNativeConnection 中会每次创建和 redis 的连接

然后并向其发送 cluster nodes, client list 等两个请求, 然后 redis 均响应 “io.lettuce.core.RedisException: Cannot retrieve initial cluster partitions from initial URIs [RedisURI [host='192.168.220.133', port=7001], RedisURI [host='192.168.220.133', port=7002], RedisURI [host='192.168.220.133', port=7003], RedisURI [host='192.168.220.133', port=7004], RedisURI [host='192.168.220.133', port=7005], RedisURI [host='192.168.220.133', port=7006]]”

然后 具体的异常是在这里, 获取 cluster nodes, client list 的时候看到 异常信息, 然后 抛出对应的 异常信息

这两个接口 正常响应出的数据如下

127.0.0.1:7001> cluster nodes
5cc767285fe4c522e7851d7b2610992160b72e23 192.168.220.133:7001@17001 myself,master - 0 1687364372000 1 connected 0-5460
30f24b7878a573dd5696394de7ea20ea4deb4591 192.168.220.133:7004@17004 slave cfe925b9621300694e1019139a2daef55406eb44 0 1687364373033 4 connected
cfe925b9621300694e1019139a2daef55406eb44 192.168.220.133:7003@17003 master - 0 1687364373000 3 connected 10923-16383
96d9911ec437b7fec1100fe901aa6c19fe38989e 192.168.220.133:7006@17006 slave 15dd54b917bd8c4483616e7029f0c7b3c071078b 0 1687364373000 6 connected
15dd54b917bd8c4483616e7029f0c7b3c071078b 192.168.220.133:7002@17002 master - 0 1687364374043 2 connected 5461-10922
373b275b28079e4ef5bcd581e9877edb8496d712 192.168.220.133:7005@17005 slave 5cc767285fe4c522e7851d7b2610992160b72e23 0 1687364375057 5 connected
127.0.0.1:7001> client list
id=15597 addr=192.168.220.140:52478 fd=20 name= age=801 idle=789 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=client
id=16247 addr=192.168.220.140:52616 fd=33 name= age=147 idle=147 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=client
id=16214 addr=127.0.0.1:51118 fd=22 name= age=179 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=26 qbuf-free=32742 obl=0 oll=0 omem=0 events=r cmd=client
id=15336 addr=192.168.220.140:52288 fd=14 name= age=1057 idle=1057 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=client
id=15348 addr=192.168.220.140:52312 fd=15 name= age=1047 idle=1047 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=client
id=15470 addr=192.168.220.140:52410 fd=18 name= age=926 idle=926 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=client
id=16039 addr=192.168.220.140:52566 fd=21 name= age=355 idle=355 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=client
id=15393 addr=192.168.220.140:52340 fd=16 name= age=1004 idle=953 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=client
id=15258 addr=192.168.220.140:52230 fd=12 name= age=1132 idle=1132 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=client
id=15325 addr=192.168.220.140:52258 fd=13 name= age=1067 idle=1062 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=client
id=15450 addr=192.168.220.140:52380 fd=17 name= age=944 idle=944 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=client
id=15575 addr=192.168.220.140:52448 fd=19 name= age=821 idle=821 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=client

假设配置了正确的密码之后 

第一次访问 http://192.168.220.140:8291/actuator/health 此时 this.connection 为 null, getNativeConnection 拿到对应的连接, 然后进行测试 

第二次访问 http://192.168.220.140:8291/actuator/health 此时 this.connection 不为 null, 直接使用上次暂存的 connection

StatefulRedisConnection/EpollSocketChannel/LinuxSocket 为什么没有被回收? 

LinuxSocket 被 EpollSocketChannel 引用 

这整个 EpollSocketChannel 列表被 EpollEventLoop.channels 的一个 Map 引用 

而 EpollEventLoop 的生命周期较长 

StatefulRedisConnection 这里不多赘述, 也是被 某对象 引用

问题异常现场

可以看到的是有 3w+ 个 LinuxSocket, 每一个对应于一个 Socket, 占用一个 FileDescriptor

均是泄露的 Redis 连接 以及相关的数据结构

这些 FileDescriptor 主要是包含了 大量的 fd 为 -1 的 FileDescriptor

1个 sun.nio.ch.ServerSocketChannelImpl 监听端口相关

十几个个 sun.nio.ch.SocketChannelImpl, 主要用于处理 客户端的请求

3个 java.net.SocksSocketImpl 来保持和 mongo 的连接 

实际生产的fd 的情况如下, 大量的 socket 的 fd 

socket 的具体信息如下 

问题在新版本

即使是在 spring-data-redis 2.2.x 版本中 泄露的问题依然存在

在 initialize 的过程中 client.getPartitions 会抛出异常, 然后 initialized 总是 false, 然后每次 /actuator/health 请求都会走 client.getPartitions, 创建了一批 tcp 连接, 但是没有释放 

从代码上面来看 貌似, 目前 这个问题 还是存在

然后查看 当前进程的 fd, 发现 还是在不断泄露

异常的情况如下 

配置非 redis 的其他服务

这个问题的复现 也可以在 可以链接的 tcp 非 redis 服务上面复现

具有一定的通用性, 也具有一定的隐蔽性

不仅会消耗 客户端的链接, 也会 消耗对方服务器的资源

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_1046184.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Git的简单使用

Git 一:什么是Git: Git是一个分布式版本控制系统,用于跟踪文件的变化并协作开发项目。它允许多个开发者在同一时间内对同一个项目进行编辑,并能够轻松地管理不同版本的文件。Git通过记录文件的变化并创建快照来跟踪项目的历史记…

C++ //练习 11.14 扩展你在11.2.1节练习(第378页)中编写的孩子姓到名的map,添加一个pair的vector,保存孩子的名和生日。

C Primer(第5版) 练习 11.14 练习 11.14 扩展你在11.2.1节练习(第378页)中编写的孩子姓到名的map,添加一个pair的vector,保存孩子的名和生日。 环境:Linux Ubuntu(云服务器&#x…

论文阅读《Semantic Prompt for Few-Shot Image Recognition》

论文地址:https://arxiv.org/pdf/2303.14123.pdf 论文代码:https://github.com/WentaoChen0813/SemanticPrompt 目录 1、存在的问题2、算法简介3、算法细节3.1、预训练阶段3.2、微调阶段3.3、空间交互机制3.4、通道交互机制 4、实验4.1、对比实验4.2、组…

PicGo + Gitee + VsCode - 搭建私人图床

文章目录 前言搭建图床VsCode 安装插件安装 PicGo准备 Gitee 图床测试 尾声 前言 本人是一个重度 vimer,并且喜欢客制化一些东西… Typora 固然好用,但不支持 vim…发现 vscode 中既可以使用 vim,也可以 md,用起来比较舒服.因此…

关于ansible的模块 ③

转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。 接《关于Ansible的模块①》和《关于Ansible的模块②》,继续学习ansible的user模块。 user模块可以增、删、改linux远…

免费的GPT-3.5 API服务aurora

什么是 aurora ? aurora 是利用免登录 ChatGPT Web 提供的无限制免费 GPT-3.5-Turbo API 的服务,支持使用 3.5 的 access 调用。 【注意】:仅 IP 属地支持免登录使用 ChatGPT的才可以使用(也可以自定义 Baseurl 来绕过限制&#x…

MSOLSpray:一款针对微软在线账号(AzureO365)的密码喷射与安全测试工具

关于MSOLSpray MSOLSpray是一款针对微软在线账号(Azure/O365)的密码喷射与安全测试工具,在该工具的帮助下,广大研究人员可以直接对目标账户执行安全检测。支持检测的内容包括目标账号凭证是否有效、账号是否启用了MFA、租户账号是…

Linux学习-网络UDP

网络 数据传输,数据共享 网络协议模型 OSI协议模型 应用层 实际发送的数据 表示层 发送的数据是否加密 会话层 是否建立会话连接 传输层 数据传输的方式(数据报、流式&#…

企业计算机服务器中了locked勒索病毒怎么办,locked勒索病毒解密流程步骤

网络技术的不断发展为企业的生产运营提供了极大便利,也让企业的生产效率大大提高,但网络是一把双刃剑,给给企业的数据安全问题带来严重威胁。近期,云天数据恢复中心接到浙江某商贸公司的求助,企业计算机服务器遭到了lo…

网络驱动器设备:ISCSI服务器

文章目录 使用ISCSI服务部署网络存储ISCSI技术介绍创建RAID磁盘整列配置ISCSI服务端配置Windows端配置Linux客户端iSCSI服务器CHAP单向认证配置Linux端具体步骤Windows端具体步骤 使用ISCSI服务部署网络存储 主机名IPISCSI服务端192.168.200.10ISCSI客户端192.168.200.20Windo…

UE5、CesiumForUnreal实现加载建筑轮廓GeoJson数据生成白模功能

1.实现目标 在UE5.3中,通过加载本地建筑边界轮廓面GeoJson数据,获取底面轮廓和楼高数据,拉伸生成白模,并支持点选高亮。为防止阻塞Game线程,使用了异步任务进行优化,GIF动图如下所示: 其中建筑数量:128871,顶点索引数量:6695748,三角面数量:2231916,顶点数量:165…

Linux nsenter命令全面解析

Linux nsenter命令是一个强大的工具🛠️,用于进入到已存在的命名空间(Namespace)中执行命令。由于Linux的命名空间技术是构建容器技术的基础,nsenter因此成为了容器管理和调试中不可或缺的工具🐳。本文将从…

【开源语音项目OpenVoice](一)——实操演示

目录 一、前菜 1、Python选择 2、pip源切换 3、ffmpeg配置问题 4、VSCode添加Jupyter扩展 二、配置虚拟环境 1、下载源码 方法一 直接下载源码压缩包 方法二 使用git 1)git加入鼠标右键 2)git clone源码 2、VSCode出场 1)创建pyth…

vue实现验证码验证登录

先看效果&#xff1a; 代码如下&#xff1a; <template><div class"container"><div style"width: 400px; padding: 30px; background-color: white; border-radius: 5px;"><div style"text-align: center; font-size: 20px; m…

鲨鱼恐怖的第六感

除了视觉、嗅觉、听觉、味觉、触觉这五种感官&#xff0c; 鲨鱼还有敏锐的「第六感」&#xff1a;电觉&#xff0c;可以侦测微弱电场&#xff0c;捕捉猎物。 恐怖的背鳍划破水面&#xff0c;直逼我们而来─一头三公尺长的硕大青鲨&#xff0c;正如鱼雷般朝血腥气味方向游去。…

基于SSM的周边乡村旅游小程序

系统实现 游客注册通过注册窗口&#xff0c;进行在线填写自己的账号、密码、姓名、年龄、手机、邮箱等&#xff0c;信息编辑完成后核对信息无误后进行选择注册&#xff0c;系统核对游客所输入的账号信息是否准确&#xff0c;核对信息准确无误后系统进入到操作界面。 游客登录通…

Lesson1--数据结构前言

1. 什么是数据结构&#xff1f; 2. 什么是算法&#xff1f; 3. 数据结构和算法的重要性 4. 如何学好数据结构和算法 5. 数据结构和算法书籍及资料推荐 1. 什么是数据结构&#xff1f; 数据结构(Data Structure) 是计算机存储、组织数据的方式&#xff0c;指相互之间存在一…

宁波银行交出2023年成绩单:高成长高质量,优质服务夯实金字招牌

撰稿 |多客 来源 | 贝多财经 4月9日&#xff0c;宁波银行&#xff08;SZ:002142&#xff09;交出了2023年的业绩答卷。透过财报不难发现&#xff0c;该行在业绩表现、资产质量、创新趋势、风控能力等方面均展现出了强韧的成长性&#xff0c;无愧城商行“优等生”之名。 进入2…

Android Studio学习15——多页面情况下再看Activity生命周期

按返回键退出APP时&#xff1a; 走正常页面的退出流程&#xff1a;onPause–>onStop–>onDestroy(会Destroy,因为它从任务栈中退出了) 再点击图标回来时&#xff1a; 走正常页面的创建流程&#xff1a;onCreate–>onStart–>onResume 按Home键退出App时&#xff1a…

鸿蒙实战开发-如何实现选择并查看文档与媒体文件

介绍 应用使用ohos.file.picker、ohos.multimedia.mediaLibrary、ohos.file.fs 等接口&#xff0c;实现了picker拉起文档编辑保存、拉起系统相册图片查看、拉起视频并播放的功能。 效果预览 使用说明&#xff1a; 在首页&#xff0c;应用展示出最近打开过的文档信息&#xf…