ss -s 可直接获取TCP/UDP/RAW/UNIX套接字总数及状态分布,输出为内核快照、毫秒级返回;Total是用户态可见连接数,kernel是内核实际维护总数(含未回收套接字),二者差值持续增大表明存在socket泄漏或回收异常。

直接看 ss -s 就能拿到各协议(TCP/UDP/RAW/UNIX)的连接总数和状态分布,比 netstat -s 更快、更轻量,且不依赖 net-tools 包。
用 ss -s 查协议级连接汇总
ss -s 输出是内核统计的快照,包含 TCP、UDP、RAW、UNIX 四类套接字的总数,以及 ESTABLISHED、LISTEN 等状态的细分。它不扫描进程或文件系统,所以毫秒级返回,适合脚本或高频检查。
- 执行
ss -s,典型输出如:Total: 1247 (kernel 1302) TCP: 1128 (estab 98, closed 965, orphaned 1, synrecv 0, timewait 965/0), ports 0 UDP: 42 (active 2, established 0, closed 40), ports 0 RAW: 0 UNIX: 77 (connected 28, unconnected 49)
- 注意 “Total” 是用户态可见连接数,“kernel” 是内核实际维护的套接字数(含未完全建立或已关闭但未回收的)
- TCP 行里括号内的
estab值就是当前 ESTABLISHED 连接数,比ss -tn state established | wc -l更快 - UDP 行的
active指有绑定端口且可能收发数据的 socket;established对 UDP 恒为 0(无连接状态)
用 netstat -s 查协议层错误与计数器
当你要查丢包、重传、连接失败等底层异常时,netstat -s 提供的是协议栈内部统计,比如 TCP 的 RetransSegs、UDP 的 InErrors,这些在 ss -s 里不体现。
-
netstat -s默认输出很长,建议加grep过滤关键指标,例如:netstat -s | grep -A 5 "Tcp:"或netstat -s | grep -E "(retransmit|drop|error)" - 常见关注项:
TcpRetransSegs(重传段数,持续上升说明网络不稳定或接收端丢 ACK);TcpExtListenOverflows(监听队列溢出,表明 SYN 队列满,可能被 SYN Flood 攻击);UdpInErrors(UDP 入包校验失败或缓冲区满丢弃) - 部分新系统(如 Ubuntu 22.04+、CentOS 8+)默认没装
net-tools,需手动安装:sudo apt install net-tools或sudo yum install net-tools
按协议 + 端口组合排查真实负载来源
光看协议总数不够,得定位到具体服务——比如是 HTTP(TCP:80/443)、MySQL(TCP:3306)还是 DNS(UDP:53)在扛压。
- TCP 服务端口:用
ss -tn sport :80查监听在 80 的连接;ss -tn state established sport :443只取已建立的 HTTPS 连接 - UDP 服务:
ss -un dport :53查连向 DNS 端口的客户端;注意 UDP 没有 ESTABLISHED 状态,ss -un列出的是已绑定端口的 socket,不是“连接数” - 避免误统计:用
ss -tn dst 10.0.1.100:3306限定目标 IP+端口,防止多网卡或多实例干扰 - 别用
netstat -nat | grep :80—— 它会把TIME_WAIT、CLOSE_WAIT全算进去,虚高;而ss支持原生状态过滤,更精准
真正要判断“哪个协议正在拖慢系统”,不能只看连接数,得结合 ss -s 的总量、netstat -s 的错误计数、以及 sar -n TCP 的重传率和连接建立速率——三者对齐才能确认是 TCP 重传风暴,还是 UDP 包洪泛,或是 UNIX socket 文件描述符耗尽。很多人只扫一眼 ss -s 就下结论,漏掉了错误率这个关键维度。


















