[转帖]Redis连接未释放,造成TCP连接数过多

redis,连接,释放,造成,tcp,连接数 · 浏览次数 : 0

小编点评

**问题原因:** 当TCP连接数达到5000多时,服务器发现建立了大量的ESTABLISHED连接,这些连接可能是由于以下原因: 1. **连接保持超时:** 默认情况下,TCP连接保持超时时间较短,默认值为60秒。当连接数超过5000时,服务器可能无法及时释放连接,导致连接持续占用。 2. **未释放资源:** 即使连接已关闭,服务器也可能继续保持一些资源,例如连接描述符等,这些资源会随着时间的推移而占用资源。 3. **连接请求过多:** 在某些情况下,服务器可能设置过高的连接请求数量,导致连接请求数超过了服务器可处理的范围。 **解决方案:** 1. **设置连接保持时间:** 可通过设置`keepalive`选项来调整连接保持时间。例如,可以使用`keepalive`选项设置60秒,意味着服务器在每次连接成功后发送一个包并等待对方回应。 2. **清理连接资源:** 可使用`close()`函数释放连接描述符等资源,例如关闭套接层套接,释放连接描述符等。 3. **限制连接请求数量:** 可设置连接请求数量,例如限制每个端口上的连接数为10个。 4. **检查代码中的连接操作:** 仔细检查服务器代码中的连接操作,确保每个连接都被正确关闭。 5. **监控连接数:** 可使用监控工具监控TCP连接数,及时发现连接数超过阈值的异常情况。

正文

https://segmentfault.com/a/1190000022704886

 

早上看到服务器告警通知,TCP连接数比较高,达到5000多,我设置的阈值是5000,正常TCP连接不会这么高,这样的一个阈值我可以提前知道有问题早点解决,不至于后面引起一系列问题,甚至拖垮服务器。

排查

登陆服务器,查看TCP连接数,如下

[root@app01]# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
SYN_RECV 1
ESTABLISHED 8591
FIN_WAIT2 36
SYN_SENT 2
TIME_WAIT 85

netstat有关详细命令,前面有篇转载过一篇文章很详细,这里不介绍。TCP当时连接数是5000多,这里是后面连接数增加上去截的图。

接着想知道这些连接数是什么服务创建的呢?通过tcp socket建立的连接端口就能看到,截取部分如下

[root@app01]# netstat -antlp
tcp        0      0 iZbp147cv:afs3-prserver iZbp147cvofre8yt7:47204 ESTABLISHED 6541/./redis-server 
tcp        0      0 iZbp147cv:afs3-callback iZbp147cvofre8yt7:46618 ESTABLISHED 6540/./redis-server 
tcp        0      0 iZbp147cvofre8yt7:42628 iZbp147cv:afs3-callback ESTABLISHED 27325/java          
tcp        0      0 iZbp147cv:afs3-callback iZbp147cvofre8yt7:40318 ESTABLISHED 6540/./redis-server 
tcp        0      0 iZbp147cvofre8yt7:54024 iZbp147cv:afs3-prserver ESTABLISHED 27325/java          
tcp        0      0 iZbp147cv:afs3-prserver iZbp147cvofre8yt7:33924 ESTABLISHED 6541/./redis-server 
tcp        0      0 iZbp147cvofre8yt7:48902 kafkaServ:afs3-prserver ESTABLISHED 27325/java          
tcp        0      0 iZbp147cvofre8yt7:52654 kafkaServ:afs3-prserver ESTABLISHED 12753/java          
tcp        0      0 iZbp147cvofre8yt7:56148 iZbp147cv:afs3-prserver ESTABLISHED 27325/java          
tcp        0      0 iZbp147cvofre8yt7:46952 redisServ:afs3-prserver ESTABLISHED 27325/java          
tcp        0      0 iZbp147cvofre8yt7r:http 180.175.27.94:56713     TIME_WAIT   -                   
tcp        0      0 iZbp147cvofre8yt7:43484 redisServ:afs3-prserver ESTABLISHED 27325/java          
tcp        0      0 iZbp147cv:afs3-callback iZbp147cvofre8yt7:39678 ESTABLISHED 6540/./redis-server 
tcp        0      0 iZbp147cv:afs3-prserver iZbp147cvofre8yt7:38570 ESTABLISHED 6541/./redis-server 
tcp        0      0 iZbp147cvofre8yt7:37096 redisServ:afs3-prserver ESTABLISHED 27325/java          
tcp        0      0 iZbp147cvofre8yt7:47764 redisServ:afs3-prserver ESTABLISHED 27325/java          
tcp        0      0 iZbp147cvofre8yt7:34100 redisServ:afs3-prserver ESTABLISHED 27325/java          
tcp        0      0 iZbp147cvofre8yt7:59924 kafkaServ:afs3-prserver ESTABLISHED 5299/java           
tcp        0      0 iZbp147cv:afs3-prserver iZbp147cvofre8yt7:59626 ESTABLISHED 6541/./redis-server 
tcp        0      0 iZbp147cv:afs3-prserver iZbp147cvofre8yt7:47298 ESTABLISHED 6541/./redis-server 

统计了下

[root@app01]# netstat -antlp |grep -i established |egrep "7001|7002"|wc -l
8600

发现大多数建立的ESTABLISHED连接是java和redis之间的TCP连接。
那为何会建立这么多的连接呢?于是又看了监控,流量正常,并没有突发大流量进入。那很有可能是TCP连接后没有释放,找开发检查代码,果然是有个方法获取redis的key后,没有close。
image.png

代码改了之后重新运行,再来查看TCP连接

[root@app01]# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
CLOSE_WAIT 1
ESTABLISHED 792
FIN_WAIT1 2
FIN_WAIT2 33
CLOSING 1
SYN_SENT 2
TIME_WAIT 115

到此,问题解决。

最后

小小问题,希望能帮助到遇到同样问题的同学~~

与[转帖]Redis连接未释放,造成TCP连接数过多相似的内容:

[转帖]Redis连接未释放,造成TCP连接数过多

https://segmentfault.com/a/1190000022704886 早上看到服务器告警通知,TCP连接数比较高,达到5000多,我设置的阈值是5000,正常TCP连接不会这么高,这样的一个阈值我可以提前知道有问题早点解决,不至于后面引起一系列问题,甚至拖垮服务器。 排查 登陆服务

[转帖]Redis命令详解:Keys

https://jackeyzhe.github.io/2018/09/22/Redis%E5%91%BD%E4%BB%A4%E8%AF%A6%E8%A7%A3%EF%BC%9AKeys/ 介绍完Redis连接相关命令后,再来介绍一下与Key相关的命令,Redis作为一个key-value数据库,对

[转帖]Redis集群——SpringBoot连接Redis集群(带密码)

第一步,新建项目maven项目,添加依赖 (1)本文所采用的SpringBoot的版本如下 org.springframework.boot spring-boot-starter-parent

[转帖]redis最大连接和CPU使用过高

https://www.jianshu.com/p/bca85370c808 redis默认最大连接数为10000 redis 使用的cpu过高是因为: 1.存在慢查询语句 slowlog get 10 获取慢查询语句 slowlog len 查看保存了多少慢查询语句 2.连接数量过多,导致要执行的

[转帖]Redis cluster故障复盘,预案、工具、判断一样都不能少!

http://blog.itpub.net/31545813/viewspace-2924677/ 背景 最近从ELK日志分析发现: 有很多应用连接redis 超时; 监控平台出现”redis 集群不健康“告警; 结合之前的经验,我们一般的应处理手段为:重启连接redis超时的应用,原因有以下两点:

[转帖]Redis 最大客户端连接数,你了解吗?

文章系转载,方便整理和归纳,源文地址:https://cloud.tencent.com/developer/article/1803944 1. 前言 上一篇文章《你的Redis集群撑得住吗?》讲了应用增加pod时,有一个应用最大连接数计算公式为:maxTotal * pod数 < Redis c

[转帖]Redis进阶实践之六Redis Desktop Manager连接Windows和Linux系统上的Redis服务

https://www.cnblogs.com/PatrickLiu/p/8360057.html 一、引言 今天本来没有打算写这篇文章,但是,今天测试Redis的时候发现了两个问题,第一个问题是:Redis Desktop Manager无法连接虚拟机上Linux系统上的Redis服务,第二个问题

[转帖]springboot连接redis cluster(带密码)

https://www.cnblogs.com/fengzi7314/p/15427669.html RedisConfig配置内容如下: package com.example.demo5.config; import org.springframework.beans.factory.annot

[转帖]Redis系列(十五)、Redis6新特性之集群代理(Cluster Proxy)

在之前的文章中介绍了Redis6的集群搭建和原理,我们可以使用dummy和smart客户端连接集群,本篇介绍Redis6新增的一个功能:集群代理。客户端不需要知道集群中的具体节点个数和主从身份,可以直接通过代理访问集群,对于客户端来说通过集群代理访问的集群就和单机的Redis一样,因此也能解决很多集

[转帖]Redis系列(十五)、Redis6新特性之集群代理(Cluster Proxy)

在之前的文章中介绍了Redis6的集群搭建和原理,我们可以使用dummy和smart客户端连接集群,本篇介绍Redis6新增的一个功能:集群代理。客户端不需要知道集群中的具体节点个数和主从身份,可以直接通过代理访问集群,对于客户端来说通过集群代理访问的集群就和单机的Redis一样,因此也能解决很多集