netstat 在大量连接时性能差,应改用 ss、加 -n 参数、缩小查询范围、读取 /proc 接口替代。ss 基于 netlink,响应更快、CPU 占用更低;-n 避免 DNS 解析;过滤状态或端口减少数据量;/proc/net/snmp 等接口适合监控。

netstat 在大量网络连接场景下会产生明显性能开销,主要源于其读取 /proc/net/ 文件系统的机制——每次执行都要遍历全部连接条目、做字符串解析和状态映射,连接数过万时可能卡顿数秒甚至拖慢系统响应。优化核心不是“怎么用 netstat”,而是“少用它、换更快的、只取必要信息”。
优先用 ss 替代 netstat
ss 是 netstat 的现代替代工具,直接通过 netlink 与内核通信,避免了反复读取 /proc 的开销。实测在 2 万个连接的服务器上:
- 响应时间:ss 平均 15–30ms,netstat 常达 1.2–2.5s
- CPU 占用:ss 几乎不触发上下文切换,netstat 可能拉高 CPU 5–10%
-
常用等效命令:
- 查监听端口:
ss -tunlp(≈netstat -tunlp) - 查 ESTABLISHED 连接:
ss -t state established - 查特定端口:
ss -tun sport = :80或ss -tun dport = :3306
- 查监听端口:
禁用 DNS 和服务名解析
netstat 默认尝试反向解析 IP 和端口号(如把 80 映射为 http),在高并发或 DNS 不稳定时会显著阻塞。加 -n 参数强制数字输出,可提速 10 倍以上:
- ✅ 正确:
netstat -tn、netstat -tunlp - ❌ 避免:
netstat -t(无 -n)、netstat -tup(含 -p 但没 -n)
缩小查询范围,避免全量扫描
不加过滤地跑 netstat -an 会加载所有连接(包括 TIME_WAIT、CLOSED 等无效状态),浪费资源。应按需聚焦:
- 只看监听端口 →
netstat -tlnp(去掉 -a) - 只查某状态 →
netstat -tn | grep 'ESTABLISHED'或用 awk 统计:netstat -tn | awk '$6 ~ /^ESTABLISHED$/ {++c} END{print c+0}' - 只盯某 IP 或端口 →
netstat -tn | grep ':8080'或netstat -tn | grep '192.168.1.100'
用内核统计替代轮询式 netstat
对长期监控场景(如脚本定时检查),频繁调用 netstat/ss 属于低效做法。更轻量的方式是直接读取内核接口:
- 查看当前 TCP 连接总数:
cat /proc/net/snmp | grep Tcp | awk '{print $2}' - 统计各状态数量:
awk '{++S[$NF]} END{for(x in S) print x, S[x]}' /proc/net/netstat | grep TcpExt - 观察 TIME_WAIT 实时水位:
cat /proc/net/netstat | grep -i tw(字段 TcpExtTW
不复杂但容易忽略:真正影响性能的往往不是单次命令,而是高频、全量、带解析的 netstat 调用。换 ss、加 -n、限范围、读 proc,四步做完,90% 的开销问题就解掉了。


















