用 ss 替代 netstat:快速定位端口占用与 TIME_WAIT 堆积

举报
1swei 发表于 2026/11/07 07:46:42 2026/11/07
【摘要】 为什么换掉 netstat在很多发行版上,netstat 已经不在默认安装里了,需要额外装 net-tools;而 ss 来自 iproute2,随系统自带,读取的是内核直接暴露的套接字信息,输出更快、信息也更全。排查端口问题时,我现在基本只用 ss。 三个最常用的姿势 1. 端口被谁占了ss -tlnp-t 只看 TCP,-l 只看监听状态,-n 不解析域名和服务名,-p 显示占用进程。...

为什么换掉 netstat

在很多发行版上,netstat 已经不在默认安装里了,需要额外装 net-tools;而 ss 来自 iproute2,随系统自带,读取的是内核直接暴露的套接字信息,输出更快、信息也更全。排查端口问题时,我现在基本只用 ss。

三个最常用的姿势

1. 端口被谁占了

ss -tlnp

  • -t 只看 TCP,-l 只看监听状态,-n 不解析域名和服务名,-p 显示占用进程。
  • 输出里的 users:(("nginx",pid=1234,fd=6)) 直接告诉你进程名和 PID,顺手就能 kill 或者 systemctl restart 对应服务。

如果只关心某一个端口,加上过滤:

ss -tlnp 'sport = :8080'

2. 连接数异常,先看状态分布

ss -tan | awk '{print $1}' | sort | uniq -c | sort -nr

这一行能快速看到 ESTAB、TIME-WAIT、SYN-RECV 各有多少。TIME-WAIT 特别多时,往往是短连接压测或爬虫刚扫过;SYN-RECV 堆积则要警惕半连接攻击或后端 accept 队列满了。

3. 看某个进程的所有连接

ss -tp | grep 1234

把 1234 换成实际 PID,就能看到这个进程对外的全部连接,定位“服务在连谁、连不通谁”特别方便。

TIME-WAIT 堆积怎么办

TIME-WAIT 本身是 TCP 正常的状态,主动关闭方要等 2MSL 才会释放端口。短连接场景下它堆到几万很常见,不必一见就慌。先确认两点:

  1. 是不是业务真有这么多短连接——看 ss -tan state time-wait | wc -l 的数量级;
  2. 是不是端口耗尽导致新连接失败——看应用日志里有没有 Cannot assign requested address。

如果确认是端口耗尽,可以在 sysctl.conf 里调大可用端口范围:

net.ipv4.ip_local_port_range = 1024 65535

改完执行 sysctl -p 生效。注意不要动 tcp_tw_recycle,它在 NAT 环境下会丢包,早已被废弃;tcp_tw_reuse 也只建议在明确理解后果的客户端场景开启。

一个排查实例

上周一台测试机部署新服务起不来,报错端口被占用。ss -tlnp | grep 8080 一眼看到是昨天调试时手动启动的一个旧进程,kill 掉旧 PID 后服务正常启动。整个过程不到一分钟,比翻日志快得多。

小结

  • 查监听端口用 ss -tlnp,查连接状态用 ss -tan;
  • TIME-WAIT 多先看数量级和日志,再决定要不要调内核参数;
  • 把 ss 放进自己的排查手册,替代 netstat,少装一个包,少踩一个坑。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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