记录一次业务环境的服务器tcp_tw状态异常

2021-07-2711:05:20
评论
2,769 2509字

前言:

业务上线了一段时间, 今天巡查发现若干台业务服务器的TCP_tw值过大(1K-5K)漂浮,此时也不是业务高峰期,其他资源负载也不高.

tcp_tw来自于Prometheus监控名称,使用{node_sockstat_TCP_tw}函数进行查询


记录一次业务环境的服务器tcp_tw状态异常

 

名词解释

  • TCP_tw - 等待关闭的TCP连接数
  • node_sockstat_TCP_tw( gauge )  -  TCP 状态中的 套接字数

 

开始

首先进入服务器查询查看不同状态的连接数数量
PS: netstat工具依赖组件yum install net-tools

[xxx@xxx ~]$ netstat -ant|awk '/^tcp/ {++S[$NF]} END {for(a in S) print (a,S[a])}'
LISTEN 22
CLOSE_WAIT 12
ESTABLISHED 39
FIN_WAIT2 12
TIME_WAIT 5

状态描述:
CLOSED:无连接是活动的或正在进行
LISTEN:服务器在等待进入呼叫
SYN_RECV:一个连接请求已经到达,等待确认
SYN_SENT:应用已经开始,打开一个连接
ESTABLISHED:正常数据传输状态
FIN_WAIT1:应用说它已经完成
FIN_WAIT2:另一边已同意释放
ITMED_WAIT:等待所有分组死掉
CLOSING:两边同时尝试关闭
TIME_WAIT:另一边已初始化一个释放
LAST_ACK:等待所有分组死掉

 

不对,查询姿势不对,这个很明显和故障数量差了几个数量级。
尝试进容器看看(以下进入gateway容器查询)

[xxx@xxx ~]$ docker exec -it xxx-gateway bash
bash-4.4# netstat -ant|awk '/^tcp/ {++S[$NF]} END {for(a in S) print (a,S[a])}'
LISTEN 3
ESTABLISHED 36
TIME_WAIT 1291

got it~! , 看样子是找到问题的出处了。

接下来我们查看每个ip跟服务器建立的连接数,10.101.6.0/24这个是我们内网网段

[xxx@xxx ~]$ docker exec -it xxx-gateway bash
bash-4.4#  netstat -nat|awk '{print$5}'|awk -F : '{print$1}'|sort|uniq -c|sort -rn
   1331 10.101.6.67
     20 10.101.6.68
     11 172.28.0.1

查看每个ip建立的ESTABLISHED/TIME_OUT状态的连接数, 看数据没啥问题

bash-4.4# netstat -nat|grep ESTABLISHED|awk '{print$5}'|awk -F : '{print$1}'|sort|uniq -c|sort -rn
     23 10.101.6.68
     12 172.28.0.1
      4 10.101.6.67

查看容器连接10.101.6.67的具体端口,8848是配置中心nacos的端口

bash-4.4# netstat -ant|grep 10.101.6.67
tcp        0      0 172.28.0.4:57756        10.101.6.67:8848        TIME_WAIT
tcp        0      0 172.28.0.4:55992        10.101.6.67:8848        TIME_WAIT
tcp        0      0 172.28.0.4:57178        10.101.6.67:8848        TIME_WAIT
此处省略几千行

 

搜索同类型问题

  • https://juejin.cn/post/6844904152527536135
  • https://blog.csdn.net/chuixue24/article/details/108257432
  • https://help.aliyun.com/document_detail/155707.html

尝试从系统内核层面介入

编辑内核文件/etc/sysctl.conf,加入以下内容:
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1 
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30


net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_fin_timeout = 30 修改系默认的 TIMEOUT 时间
然后执行 /sbin/sysctl -p 让参数生效.

验证TCP总状态 nice~

bash-4.4# netstat -ant|awk '/^tcp/ {++S[$NF]} END {for(a in S) print (a,S[a])}'
LISTEN 3
ESTABLISHED 31
TIME_WAIT 5

验证单IP与服务器连接数 nice~

bash-4.4# netstat -nat|awk '{print$5}'|awk -F : '{print$1}'|sort|uniq -c|sort -rn
21 10.101.6.68
4 10.101.6.67
3 172.28.0.1

验证 ESTABLISHED/TIME_OUT状态 nice~

bash-4.4# netstat -nat|grep ESTABLISHED|awk '{print$5}'|awk -F : '{print$1}'|sort|uniq -c|sort -rn
34 10.101.6.68
4 172.28.0.1
4 10.101.6.67

查看系统TCP总状态

[xxx@xxx ~]$ netstat -ant|awk '/^tcp/ {++S[$NF]} END {for(a in S) print (a,S[a])}'
LISTEN 22
ESTABLISHED 134
TIME_WAIT 4

KO,问题解决了。观察一会。。DONE

 

# 待补充图片

豌豆日志
  • 本文由 发表于 2021-07-2711:05:20
  • 转载请务必保留本文链接:https://pealog.com/529.html
CentOS6更换有效源 系统运维

CentOS6更换有效源

前言 CentOS6官方在2020/11/30已停止维护,yum的Base源已失效 操作   YUM源 备份文件 cp CentOS-Base.repo CentOS-Base.repo.b...
Liunx基础-DHCP 系统运维

Liunx基础-DHCP

# DHCP简单讲解 DHCP就是动态主机配置协议(Dynamic Host Configuration Protocol)是一种基于UDP协议且仅限用于局域网的网络协议,它的目的就是为了减轻TCP/...
Prometheus监控-BlackExporter部署 系统运维

Prometheus监控-BlackExporter部署

黑盒检测就是监测应用程序的外部,可以查询应用程序的外部特征,比如是否相应开放端口上的轮询并返回正确的数据或响应代码,探测监视的一个实例是执行icmp或者echo检查并确认收到响应,这种类型的探测也称为...
Prometheus监控-AlertManager部署 系统运维

Prometheus监控-AlertManager部署

Alertmanager是一个独立的告警模块,接收Prometheus等客户端发来的警报,之后通过分组、删除重复等处理,并将它们通过路由发送给正确的接收器;告警方式可以按照不同的规则发送给不同的模块负...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: