首页 > 其他分享 >排查 CLOSE_WAIT 堆积

排查 CLOSE_WAIT 堆积

时间:2024-02-21 11:36:43浏览次数:29  
标签:accept 排查 关闭 CLOSE 堆积 连接 WAIT

CLOSE_WAIT 堆积的危害

每个 CLOSE_WAIT 连接会占据一个文件描述,堆积大量的 CLOSE_WAIT 可能造成文件描述符不够用,导致建连或打开文件失败,报错 too many open files:

dial udp 9.215.0.48:9073: socket: too many open files
 

如何判断?

检查系统 CLOSE_WAIT 连接数:

lsof | grep CLOSE_WAIT | wc -l
 

检查指定进程 CLOSE_WAIT 连接数:

lsof -p $PID | grep CLOSE_WAIT | wc -l
 

为什么会产生大量 CLOSE_WAIT?

我们看下 TCP 四次挥手过程:

主动关闭的一方发出 FIN 包,被动关闭的一方响应 ACK 包,此时,被动关闭的一方就进入了 CLOSE_WAIT 状态。如果一切正常,稍后被动关闭的一方也会发出 FIN 包,然后迁移到 LAST_ACK 状态。

通常,CLOSE_WAIT 状态在服务器停留时间很短,如果你发现大量的 CLOSE_WAIT 状态,那么就意味着被动关闭的一方没有及时发出 FIN 包,一般来说都是被动关闭的一方应用程序有问题。

应用没有 Close

如果 CLOSE_WAIT 堆积的量特别大(比如 10w+),甚至导致文件描述符不够用了,一般就是应用没有 Close 连接导致。

当连接被关闭时,被动关闭方在代码层面没有 close 掉相应的 socket 连接,那么自然不会发出 FIN 包,从而会导致 CLOSE_WAIT 堆积。可能是代码里根本没写 Close,也可能是代码不严谨,出现死循环之类的问题,导致即便后面写了 close 也永远执行不到。

应用迟迟不 accept 连接

如果 CLOSE_WAIT 堆积的量不是很大,可能是全连接队列 (accept queue) 堆积了。我们先看下 TCP 连接建立的过程:

连接建立好之后会被放入 accept queue,等待应用 accept,如果应用迟迟没有从队列里面去 accept 连接,等到 client 超时时间,主动关闭了连接,这时连接在 server 端仍在全连接队列中,状态变为 CLOSE_WAIT

如果连接一直不被应用 accept 出来,内核也不会自动响应 ACK 去关闭连接的。不过这种情况的堆积量一般也不高,取决于 accept queue 的大小。

标签:accept,排查,关闭,CLOSE,堆积,连接,WAIT
From: https://www.cnblogs.com/cheyunhua/p/18024802

相关文章

  • k8s排查网络丢包
    网络丢包的定义与现象​网络丢包是指部分包正常,部分包被丢弃。从现象上看就不是网络一直不通,而是:偶尔不通。速度慢(丢包导致重传)。排查思路​TODO可能原因​高并发NAT导致conntrack插入冲突​如果高并发并且做了NAT,比如使用了ip-masq-agent,对集群外的网段或公......
  • C 语言实现对 Stop-and-Wait 协议的模拟
    协议设计~事件动作发送方从应用层收到数据若处于等待上层数据状态,产生一个分组并发送,启动计时器;若处于等待ACK状态,将数据存入缓冲区发送方超时重传当前未确认的数据包发送方收到ACK若对应当前数据包的ACK,停止计时器,开始发送缓冲区中的下一个数据包;若ACK不......
  • 阵列故障排查MegaCli
    阵列故障排查MegaCli8.07.10.tar.gz该压缩包包含Linux和Windows的程序,如需请下载这个(访问密码:2344)MegaRAID.zip点击下载:(访问密码:2344)unzip/opt/MegaRAID.zip-d/optln-s/opt/MegaRAID/MegaCli/MegaCli64/bin/MegaCli64chmod+x/bin/MegaCli64以上是......
  • 【性能测试】MYSQL锁和mysql事务问题排查04
    一、MYSQL锁目的:解决客户端并发访问冲突问题查看死锁showOPENTABLESwhereIn_use>0案例登录接口 #锁定表LOCKTABLESlitemall.litemall_userREAD;#睡眠160秒SELECTSLEEP(160);#解锁表UNLOCKTABLES;当用户表被锁定时,接口无法登录访问,解锁后可以正......
  • Debug: tf-distribute-strategy-worker: json.decoder.JSONDecodeError: Expecting pr
    [ERROR:json.decoder.JSONDecodeError:Expectingpropertynameenclosedindoublequotes:line1column182]#infilepipeline.yaml-name:TF_CONFIGvalue:"{\"cluster\":{\"worker\":[\"dist-s......
  • 【性能测试】MySQL连接数及连接异常排查
    一、mysql连接数1、Mysql连接数,是服务器和数据库建立连接时,使用的连接数量。利用Mysql的SQL语句监控Mysql的连接数:showvariableslike'%connections%';max_connections:所有与数据库建立连接的最大数量max_user_connections:每个用户与数据库建立连接的最大数量2、......
  • 如何利用内核跟踪点排查短时进程问题?
    在排查系统CPU使用率高的问题时,很可能遇到过这样的困惑:明明通过 top 命令发现系统的CPU使用率(特别是用户CPU使用率)特别高,但通过 ps、pidstat 等工具都找不出CPU使用率高的进程。这是什么原因导致的呢?一般情况下,这类问题很可能是以下两个原因导致的:第一,应用程序里面......
  • SPI多个从设备问题排查
    记SPI问题排查 SPI电路挂载了2个从设备,S1和S2,其中S2前加了一个隔离器g,电路结构如下图:  问题发现:其它同事已经开发了S2驱动,我在开发S1驱动时发现S1无响应。 排查是软件问题还是硬件问题:检查代码SPI初始化(时钟等)片选信号的处理(多从设备做冲突处理)没有问题后S1还是无......
  • kubernetes集群故障排查的几种方法
    1.kubectldescribe查看资源的详细信息,根据事件信息获取当前资源的状态,从而给出解决方案。[root@master231pod]#kubectlgetpodsNAMEREADYSTATUSRESTARTSAGEimage-resources-stress-040/1Pending02m13s[root@mas......
  • CF1922C Closest Cities 题解
    解题思路贪心,能走距离最短的城市就一定走。分别考虑\(x>y\)和\(x<y\)的情况,两种情况分别是从后向前转移和从前往后转移,分别预处理一个前缀和和后缀和即可。AC代码#include<stdio.h>#include<stdlib.h>#include<valarray>#defineN100005#definelllonglongintn......