为什么在排查高并发网络问题时,推荐用 ss 而不是 netstat,核心原因是两者的实现原理和性能差异——尤其是在遇到的大量 SYN_RECV 连接这种高并发场景下,netstat 的轮询方式会拖慢排查效率,甚至影响服务器本身的性能。
一、先讲核心差异:为什么 netstat 是“轮询统计”,而 ss 更高效?
两者本质上都是读取 Linux 内核的网络连接信息,但数据来源和读取方式完全不同:
| 特性 | netstat | ss |
|---|---|---|
| 数据来源 | 读取 /proc/net/tcp/udp 等文本文件 | 直接读取内核 netlink 套接字(内核态→用户态的高效通信方式) |
| 统计方式 | 逐行遍历文本文件,“轮询”解析每一条连接 | 直接从内核内存中获取结构化数据,无轮询解析开销 |
| 高并发场景性能 | 连接数越多越慢(比如上万连接时,可能卡几秒) | 几乎不受连接数影响(上万连接也能毫秒级返回) |
| 资源占用 | CPU/IO 占用高(读文件+文本解析) | CPU/IO 占用极低(内存直接读取) |
| 功能完整性 | 基础连接状态、统计,功能少 | 支持更多过滤(如按状态、端口、IP),输出更灵活 |
关键解释:netstat 的“轮询统计”到底是什么?
netstat 并没有主动“轮询”内核,而是它的实现方式相当于每次执行都要从头遍历 /proc 下的网络状态文件——这些文件是内核以文本形式保存的连接记录,netstat 需要逐行读取、分割、解析、统计,这个过程就是“轮询式”的遍历统计。
比如执行 netstat -ant | grep SYN_RECV 时:
netstat会打开/proc/net/tcp文件;- 逐行读取每一条 TCP 连接记录(文本格式);
- 解析每行的状态、IP、端口等字段;
- 筛选出
SYN_RECV状态的连接; - 最后输出结果。
当服务器有几万甚至几十万连接(比如遇到的 SYN 泛洪场景),这个“轮询解析文本”的过程会非常慢,甚至可能让 netstat 进程占用大量 CPU,反而加重服务器负担。
而 ss 是直接通过 netlink 套接字向内核发起请求,内核直接把结构化的连接数据(内存中的二进制数据)返回给 ss,不需要解析文本文件,所以速度极快——实测在 10 万连接的服务器上,netstat 可能要 5~10 秒,而 ss 只需要 0.1 秒左右。
二、实战对比:排查 SYN_RECV 时,ss 比 netstat 好用在哪?
1. 更快的查询速度(核心优势)
# netstat 统计 SYN_RECV 数量(慢)
time netstat -ant | awk '$6 == "SYN_RECV" {count++} END {print count}'
# ss 统计 SYN_RECV 数量(快)
time ss -tan state syn-recv | wc -l
在高并发场景下,两者的 time 输出差异会非常明显:netstat 可能耗时几秒,ss 几乎是瞬时完成。
2. 更灵活的过滤语法
排查 SYN 泛洪时,可能需要定位攻击源 IP,ss 可以直接过滤:
# 列出所有 SYN_RECV 状态的连接,显示源 IP 和端口(按源 IP 统计)
ss -tan state syn-recv | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
# 只看某个端口的 SYN_RECV 连接
ss -tan state syn-recv dport = :8080
而 netstat 要实现同样的过滤,需要更复杂的管道命令,且效率更低。
3. 更少的系统资源占用
netstat 读取 /proc 文本文件时,会产生大量的 IO 操作;而 ss 直接和内核通信,几乎没有 IO 开销。在服务器已经因 SYN 泛洪压力较大时,用 ss 不会雪上加霜,而 netstat 可能让服务器更卡。
三、netstat 不是不能用,而是场景不同
netstat 并非完全没用,它的优势是:
- 兼容性更好(老系统可能没有
ss); - 输出格式更符合老运维的使用习惯;
- 基础的
netstat -s统计(比如 SYN cookies 发送次数)依然常用。
但在高并发、大流量、需要快速排查网络问题的场景(比如遇到的 SYN_RECV 暴增),ss 是绝对的首选——它快、轻量、功能强,不会因为排查操作本身影响服务器。
总结
netstat的“轮询统计”本质是遍历解析/proc下的文本连接文件,高并发下慢且耗资源;ss直接通过netlink读取内核内存中的结构化连接数据,无文本解析开销,速度和资源占用远优于netstat;- 排查 SYN_RECV 暴增、连接超时等高并发网络问题时,优先用
ss,避免netstat拖慢排查效率或加重服务器负担。
注意:本文归作者所有,未经作者允许,不得转载