Linux 上排查端口占用与 TIME_WAIT 堆积的完整思路

举报
yd_274788088 发表于 2026/10/29 00:33:00 2026/10/29
【摘要】 从 ss 与 lsof 定位监听进程,到 netstat 统计连接状态分布,再到内核参数调优与复用端口,包含三次实际踩坑的完整排查路径。

端口被占用这类问题看似简单,但实际排查时经常卡在「知道端口在用,不知道怎么找出来」这一步。这篇整理一套我常用的顺序。

一、先确认是监听还是连接占用

很多人直接 lsof -i:8080,但这个命令在容器 / 无 lsof 的精简镜像里往往不可用。更可靠的是 ss:

ss -lntp | grep :8080        # 只看 LISTEN
ss -antp | grep :8080        # 所有状态
ss -antp state time-wait | wc -l   # TIME_WAIT 数量

关键区别:LISTEN 是被进程占着,TIME_WAIT 是连接关闭后的正常残留。前者要杀进程,后者只能等(或调内核参数)。

二、进程找不到时看 cgroup 与 netns

如果 ss -lntp 显示端口在监听但进程信息为空,说明那个进程不在当前网络命名空间里——典型是容器。这时要进容器的 netns 看:

ls -l /proc/<pid>/ns/net
nsenter -t <pid> -n ss -lntp

三、TIME_WAIT 堆积怎么处理

短连接高并发场景下 TIME_WAIT 上千是正常的,几万才需要处理。三个参数按需调:

sysctl -w net.ipv4.tcp_tw_reuse=1          # 允许复用 TIME_WAIT 的连接(仅出向)
sysctl -w net.ipv4.tcp_fin_timeout=30      # 缩短 FIN_WAIT2
sysctl -w net.ipv4.ip_local_port_range="10000 65000"   # 扩大可用端口范围

注意 tcp_tw_recycle 在 4.12 之后已被移除,网上老文章还在教这个参数的直接忽略,开了会破坏 NAT 后面的客户端连接。

四、根治还是靠连接复用

参数调优只是缓解。如果发现 TIME_WAIT 持续增长,真正的解法是改用长连接或连接池:HTTP 侧开 keep-alive,数据库侧用连接池,RPC 侧复用 channel。这些改动的收益远大于调内核参数。

五、一个容易忽略的点

/proc/sys/net/ipv4/tcp_max_tw_buckets 是 TIME_WAIT 的硬上限,超过会直接丢弃并打日志。如果看到 TCP: time wait bucket table overflow,说明已经撞上限了,这时候连接失败会比慢更让人困惑。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。