本期摘要

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防火墙入门》

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐