当前位置:首页>Linux>ss比netstat更好的Linux网络排障工具

ss比netstat更好的Linux网络排障工具

  • 2026-09-29 19:12:34
ss比netstat更好的Linux网络排障工具

很多Linux工程师第一次接触网络排查时,用的都是netstat

但当服务器连接数达到 几万甚至几十万 时,你会发现:

  • netstat 执行非常慢

  • CPU 占用飙升

  • 有时甚至卡住

于是 Linux 内核团队提供了一个现代工具:ss

ss 可以:

  • 直接读取 内核 socket 结构

  • 无需遍历 /proc

  • 查询速度 比 netstat 快 10~100 倍

它属于 iproute2 工具集。

这篇文章会带你从 基础 → 原理 → 实战 → 性能排障 全面掌握 ss。


一、为什么 ss 比 netstat 快?

传统 netstat 的工作方式:

/proc/net/tcp/proc/net/udp/proc/net/unix
每次执行:
  1. 读取 /proc

  2. 解析文本

  3. 格式化输出

当连接数很大时:

10万 socket= 10万行文本= 解析巨大字符串
而ss直接通过 netlink 向内核请求数据:
ss -> netlink -> kernel socket table

优点:

  • 无需文本解析

  • 二进制数据

  • 直接读取内核 socket

因此性能极高。


二、5分钟上手 ss

安装(一般系统自带):

apt install iproute2yum install iproute
核心命令:
ss [options]
最常用的 5 个命令:
ss -lntss -antss -sss -pantss -o state established
含义:
参数
含义
-l
listening
-t
TCP
-u
UDP
-n
不解析域名
-p
显示进程
-a
所有连接

三、最常用的 ss 命令

1 查看所有 TCP 连接

ss -ant
输出:
State  Recv-Q Send-Q Local Address:Port Peer Address:PortLISTEN  0     4096      0.0.0.0:9964       0.0.0.0:*
含义:
字段
含义
State
连接状态
Recv-Q
接收队列
Send-Q
发送队列

Local Address:Port

本地地址和端口

Peer Address:Port

对端地址和端口

2 查看监听端口

ss -lnt
输出示例:
State  Recv-Q Send-Q Local Address:Port Peer Address:PortLISTEN  0     4096      0.0.0.0:9964       0.0.0.0:*
快速查看服务器监听:
ss -lntp

结果:

LISTEN  0  4096   0.0.0.0:996  0.0.0.0:*  users:(("cilium-envoy",pid=2879,fd=35))
可以看到进程。

3 查看某个端口连接数

例如 nginx:

ss -Hant state established '( sport = :80 )' | wc -l

统计:

当前连接数

四、ss 最强大的功能:状态过滤

TCP 状态:

ESTABLISHEDSYN-SENTSYN-RECVFIN-WAIT-1FIN-WAIT-2TIME-WAITCLOSE-WAIT

查看 已建立连接

ss -o state established

查看 TIME_WAIT

ss -o state time-wait

查看 SYN 攻击

ss -o state syn-recv

如果 SYN-RECV 非常多:

说明可能:

  • SYN flood

  • backlog 不够


五、查看每个连接的详细信息

ss -ti
示例输出:
cubic wscale:7,7 rto:204 rtt:12.3/2.1

含义:

字段
含义
rtt
往返延迟
rto
重传时间
cwnd
拥塞窗口

这是 TCP 内核信息。

对于性能调优非常重要。


六、查看 socket 内存使用

ss -m
示例:
skmem:(r0,rb131072,t0,tb16384)
含义:
字段
含义
rb
接收 buffer
tb
发送 buffer

排查:

TCP buffer 不够


七、查看连接对应进程

ss -pant
示例:
ESTAB 0 0 10.0.0.1:443 10.0.0.2:50234 users:(("nginx",pid=123))
查看某进程连接:
ss -pant | grep nginx

八、服务器性能排障实战

场景 1:服务器连接数爆炸

查看总连接:

ss -s
输出:
TCP: 120000

查看状态分布:

ss -antH | awk '{print $1}' | sort | uniq -c | sort -r

示例:

221 ESTAB120 TIME-WAIT29 LISTEN3 SYN-SENT

判断:

状态
可能问题
SYN-RECV
SYN flood
TIME-WAIT
短连接过多
CLOSE-WAIT
程序未关闭连接

场景 2:CLOSE_WAIT 堆积

查看:

ss -ant state close-wait
如果很多:

说明

应用没有关闭 socket

代码 bug。


场景 3:端口是否被占用

替代:

lsof -i

更快方法:

ss -lntp | grep 8080

场景 4:服务器卡顿

查看发送队列:

ss -ant

如果:

Send-Q 很大

说明:

客户端接收慢

九、百万连接服务器分析技巧

统计连接数:

ss -antH state established | wc -l

统计 IP TOP10:

ss -antH state established | tail -n +2 | awk '{ip=$NF; sub(/.*\[/,"",ip); sub(/\].*/,"",ip); sub(/:[0-9]+$/,"",ip); print ip}' | sort | uniq -c | sort -nr | head -10

示例:

12000 192.168.1.108000 10.0.0.2

识别:

  • 攻击 IP

  • 爬虫

  • 异常客户端


十、ss + eBPF 深度分析

在现代 Linux 排障中:ss 只负责 socket 状态

如果要深入:需要 eBPF

例如:

配合 bcc

可以分析:

  • TCP 重传

  • RTT

  • accept 延迟

例如:

tcpconnecttcpaccepttcpretrans

组合分析:

ss + eBPF
就是现代 Linux 网络排障标准方案。

十一、ss 与 netstat 对比

功能
ss
netstat
性能
极快
慢
数据来源
内核 netlink
/proc
连接数
支持百万
困难
未来支持
持续更新
逐渐淘汰

总结:

生产环境必须使用 ss。


十二、工程师最常用的 10 个 ss 命令

ss -sss -lntss -pantss -antss -o state establishedss -o state syn-recvss -o state time-waitss -ant '( sport = :80 )'ss -tiss -m

十三、记住 ss 的核心哲学

Linux 网络排障三板斧:

sstcpdumpeBPF

分别解决:

工具
解决问题
ss
连接状态
tcpdump
数据包
eBPF
内核行为

这是现代 Linux 调试体系。


结语

如果你只记住一句话:

ss 是现代 Linux 网络排障的第一入口。

相比老工具 netstat,ss 已经成为事实标准。

参考链接:https://man7.org/linux/man-pages/man8/ss.8.html

推荐文章

从应用到网卡:Linux网络栈7层排查全景图

curl -w:一条命令看透HTTP请求全过程

socat:Linux网络世界的“万物互联”工具

最新文章

随机文章