用 ss 替代 netstat:快速定位端口占用与 TIME_WAIT 堆积
为什么换掉 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 才会释放端口。短连接场景下它堆到几万很常见,不必一见就慌。先确认两点:
- 是不是业务真有这么多短连接——看
ss -tan state time-wait | wc -l的数量级; - 是不是端口耗尽导致新连接失败——看应用日志里有没有
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,少装一个包,少踩一个坑。
- 点赞
- 收藏
- 关注作者
评论(0)