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。
代码改了之后重新运行,再来查看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
到此,问题解决。
小小问题,希望能帮助到遇到同样问题的同学~~
第一步,新建项目maven项目,添加依赖 (1)本文所采用的SpringBoot的版本如下 org.springframework.boot spring-boot-starter-parent