ss 是 Linux 下比 netstat 更高效的网络连接分析工具,用于查看 TCP 监听端口、accept 队列(Recv-Q/Send-Q)、ESTAB 连接缓冲区状态及性能瓶颈;-ltn 显示监听套接字队列,-tn 查看 ESTAB 连接收发缓冲,-m/-i/-p 提供内存、TCP 计数器和进程信息。

ss 是 Linux 下比 netstat 更高效、更现代的网络连接查看工具,尤其适合分析 TCP 连接状态、监听队列以及接收/发送缓冲区(Recv-Q / Send-Q)的实际含义。
用 ss 查看监听中的 TCP 端口与连接队列
执行以下命令可列出所有监听中的 TCP 端口及其关联的队列信息:
ss -ltn
其中关键列含义如下:
- State:显示为 LISTEN 表示该套接字处于监听状态
- Recv-Q:对监听套接字而言,表示 已完成三次握手但尚未被 accept() 取走的连接数(即 accept 队列长度)
- Send-Q:对监听套接字而言,表示 内核为该监听套接字所允许的最大 accept 队列长度(即 backlog 参数上限)
Recv-Q 和 Send-Q 在已建立连接中的真实含义
当连接处于 ESTAB 状态时,这两列含义发生变化:
- Recv-Q:当前接收缓冲区中尚未被应用层 read()/recv() 读取的字节数(即数据已在内核接收队列中,但用户进程还没取走)
- Send-Q:当前发送缓冲区中尚未被对端确认(ACK)的字节数(即已调用 send() 但未收到 ACK 的数据)
例如:ss -tn | grep :80 中某行显示 ESTAB 0 1280 ...,说明该连接接收端无积压,但发送端有 1280 字节还在等待 ACK。
如何判断是否存在连接堆积或性能瓶颈
关注监听套接字的 Recv-Q 是否持续接近或等于 Send-Q(backlog):
- 若 Recv-Q 长期 > 0,说明应用 accept 速度慢,新连接在内核队列中排队,可能丢连接(SYN_RECV 被丢弃或 accept 队列溢出)
- 若 ESTAB 状态下 Recv-Q 持续较大,提示应用读取数据过慢,可能导致接收窗口收缩、影响吞吐
- 若 ESTAB 状态下 Send-Q 持续较大,可能是网络延迟高、丢包、或对端处理慢,也可能是本端发得太猛而对方来不及 ACK
配合 -m 和 -i 获取更深层信息
添加额外选项可辅助定位问题:
- ss -ltnm:显示监听套接字的内存使用(如 rmem_alloc、wmem_alloc),帮助判断缓冲区是否打满
- ss -tini:显示 TCP 内部计数器(如 retrans、rto、rtt),用于分析重传、超时等异常
- 结合 ss -tulnp 可看到对应进程名和 PID,快速定位服务归属










