《每日一命令17:ss——比netstat快10倍的新一代工具》
本期摘要
ss 是 netstat 的现代替代品,内核直接读取socket信息,比 netstat 快10倍以上,输出信息更丰富。当服务器并发连接数上万时,netstat 可能需要好几秒才能输出,而 ss 几乎是瞬间。本文从实战出发,用 ss 替代 netstat 的核心场景:查看所有监听端口、统计TCP连接状态、按IP过滤连接、找出谁的TIME_WAIT最多。还给出了 ss -t -a 与 netstat -an 的对照表,以及几个与grep、awk配合的技巧。
ss是什么?
ss = Socket Statistics,用于显示socket连接信息。它与 netstat 功能相似,但直接从内核获取数据,不读取 /proc 下的多个文件,因此在大并发场景下性能远超 netstat。
安装方法(一般已预装):
bash
# CentOS/RHEL yum install iproute # Ubuntu/Debian apt install iproute2
最常用的5种姿势
1. 列出所有监听端口(替代 netstat -tulnp)
bash
ss -tulnp
| 参数 | 含义 |
|---|---|
-t |
TCP |
-u |
UDP |
-l |
仅监听 |
-n |
不解析名字 |
-p |
显示进程 |
ss 的输出格式比 netstat 更紧凑,一眼就能看清每个端口的监听状态。
2. 查看所有TCP连接(替代 netstat -an)
bash
ss -tan
-a 表示所有连接(包含监听和非监听)。输出列含义:
| 列名 | 含义 |
|---|---|
| State | TCP状态(ESTAB、TIME-WAIT等) |
| Recv-Q | 接收队列(有数据堆积说明应用处理慢) |
| Send-Q | 发送队列(有堆积说明网络阻塞) |
| Local Address:Port | 本端 |
| Peer Address:Port | 对端 |
3. 统计各状态的连接数
bash
ss -tan | awk 'NR>1 {print $1}' | sort | uniq -c | sort -rn
或者利用 ss 内置的状态过滤:
bash
ss -tan state established | wc -l ss -tan state time-wait | wc -l ss -tan state close-wait | wc -l
4. 按 IP/端口过滤
bash
ss -tan dst 192.168.1.100 # 连接到指定IP ss -tan dport = 443 # 目标端口443 ss -tan sport = 8080 # 源端口8080
组合使用:
bash
ss -tan state established sport = 8080
5. 查看连接详情(代替 lsof -i)
bash
ss -tunip
-i 显示TCP内部信息(拥塞窗口、RTT等),对网络性能分析很有用。
ss vs netstat 对照表
| 需求 | netstat 命令 | ss 命令 |
|---|---|---|
| 监听端口 | netstat -tulnp |
ss -tulnp |
| 所有TCP连接 | netstat -an |
ss -tan |
| 统计状态 | netstat -an | awk... |
ss -tan state established |
| 按IP过滤 | netstat -an | grep 1.2.3.4 |
ss -tan dst 1.2.3.4 |
| 显示进程 | -p 参数 |
-p 参数 |
| 持续刷新 | watch -n 1 netstat ... |
watch -n 1 ss ... |
真实场景
场景1:快速确认服务端口是否监听
bash
ss -tulnp | grep :8080
比 netstat 快很多,尤其是在高负载服务器上。
场景2:排查TIME_WAIT堆积
bash
ss -tan state time-wait | wc -l
超过1万个需要优化。还可以按对端IP统计:
bash
ss -tan state time-wait | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -10
场景3:排查CLOSE_WAIT泄漏
bash
ss -tan state close-wait
CLOSE_WAIT 连接应该很少,如果数量持续增长且不降,说明程序没有正确关闭连接。
场景4:查看哪个进程占用了端口
bash
ss -tulnp | grep :3306
输出会显示PID和进程名,不需要 root 也能看到自己的进程。
性能对比实测
在一台有2万条连接的服务器上:
bash
time netstat -an > /dev/null
大约耗时 3-5 秒。
bash
time ss -tan > /dev/null
大约耗时 0.1-0.3 秒。
因为 netstat 要遍历 /proc/net/tcp 并做大量解析,而 ss 直接从内核 netlink 接口读取结构化的socket信息。
常用参数速查
| 参数 | 含义 |
|---|---|
-t |
TCP |
-u |
UDP |
-l |
监听端口 |
-a |
所有连接 |
-n |
不解析服务名 |
-p |
显示进程 |
-i |
显示内部TCP信息 |
-e |
显示扩展信息(uid等) |
state |
按状态过滤(established / time-wait / close-wait / listening / syn-recv 等) |
sport / dport |
按源/目标端口过滤 |
dst / src |
按目标/源IP过滤 |
-r |
尝试解析主机名(慎用) |
下期预告
《每日一命令18:iptables——Linux防火墙入门》
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)