1. CLOSE_WAIT 长期不释放的常见原因与排查链路
CLOSE_WAIT 长期不释放的常见原因是什么?排查链路是怎样的?
- CLOSE_WAIT 由对端 FIN 触发,需要应用调用 close 释放
- 常见原因:应用未正确关闭连接、线程池/连接池泄漏、阻塞 IO
- 排查链路:ss 定位连接 → 结合进程/文件描述符 → 应用代码排查
CLOSE_WAIT 是服务端收到对端 FIN 后进入的状态,此时对端已关闭,服务端应读取到 EOF 并调用 close 才会发送 FIN 进入 LAST_ACK。长期不释放的常见原因是应用没有正确关闭连接:未在 IO 异常/EOF 时 close、连接池未正确回收、线程阻塞导致无法处理 FIN、或应用代码 bug 导致连接始终挂着。排查链路:先用 ss -tan state close-wait 定位有多少 CLOSE_WAIT,再 ss -tanp 关联到进程 PID,用 lsof -p <pid> 看文件描述符,最终回到应用代码查连接管理逻辑。CLOSE_WAIT 堆积不像 TIME_WAIT 那样会自然消失,必须靠应用修复,是典型的应用层连接泄漏。
CLOSE_WAIT 是"服务端侧未主动关闭"的泄漏,只能靠应用 close 解决,内核参数无法根治。它常与连接池/线程池不释放、IO 异常未处理有关。
ss -tan state close-wait | wc -l
ss -tanp state close-wait | grep <pid> # 关联进程
lsof -p <pid> | grep TCP # 看文件描述符