nstat 命令详解
更新时间:2026-09-17。「一个命令一个文档」系列,
nstat(network statistics)读的是内核协议栈计数器,属于网络进阶命令族。它与连接视图的 ss 互补:ss 看"当前有哪些连接",nstat 看"协议栈累计发生了什么"。
nstat 把 /proc/net/netstat、/proc/net/snmp 里一堆 TcpExt/Ip 计数器解析成人名,并默认给出距离上次运行的增量,这是它比 netstat -s 好用的关键。
一、常用法
bash
nstat # 自上次以来有变化的计数器增量(最常用)
nstat -a # 显示全部计数器,包括增量为 0 的
nstat -z # 连同值为 0 的也显示
nstat -az # 全量 + 零值(排障时常先看快照)
nstat -d 5 # 守护采样,每 5 秒一次
nstat TcpRetrans* # 只看名字匹配的计数器
nstat -r 1 5 # 每 1 秒一次,刷新 5 次(动态观察)不带参数时 nstat 维护一个历史快照(
/tmp/.nstat.*),输出的是增量而非累计值。换账号、清 /tmp 后第一次跑会显示从开机累计的大值,属正常,再跑一次即为差值。
二、排障最该盯的计数器
| 计数器 | 含义 | 异常信号 |
|---|---|---|
TcpRetransSegs | TCP 重传段数 | 增量高 = 丢包/拥塞,见重传与 RTO |
TcpExtListenOverflows | 全连接队列溢出次数 | 持续增长 = accept 跟不上,见三次握手队列 |
TcpExtListenDrops | 监听队列丢连接 | 与 Overflows 一起涨说明 backlog 太小 |
TcpActiveOpens / TcpPassiveOpens | 主动/被动建连次数 | 判断本机角色与连接 churn |
TcpExtTCPSynRetrans | SYN 重传 | 握手 RTT 高或对端丢 SYN |
TcpExtTCPTimeouts | 重传超时次数 | 网络质量差或对端不可达 |
IpInReceives / IpInDiscards | IP 收包/丢弃 | Discards 涨查缓冲与 conntrack |
bash
# 典型用法:先清零基准,压测 30 秒后看增量
nstat -az >/dev/null; sleep 30; nstat | grep -Ei 'retrans|overflow|drop|timeout'三、和 netstat -s / ss -s / sar 的区别
netstat -s:同样的数据源(net-tools),但只给累计值、字段堆叠,需自己做差;nstat默认做差更顺手。ss -s:连接状态汇总(established/time-wait 各多少),是当前快照,不含历史重传统计。sar -n TCP,ETCP(见 sar):定时落盘、可回看历史窗口,适合事后;nstat 适合现场快速取增量。
重传率估算:
TcpRetransSegs 增量 / TcpOutSegs 增量,健康数据中心通常 <0.1%~1%;公网略高。持续 >1% 优先查物理丢包、交换机缓冲、跨运营商链路,而不是先改应用。
相关命令
连接与队列用 ss,网卡错误用 ethtool/
ip -s link,连接跟踪用 conntrack,抓包用 tcpdump,历史趋势用 sar。
总结
nstat = 解析 /proc/net/netstat 等协议栈计数器、默认输出相对上次增量:排障重点看 TcpRetransSegs(重传/丢包)、ListenOverflows/ListenDrops(全连接队列溢出)、TCPTimeouts,用 nstat -az 取基准、-r 周期采样;它比 netstat -s 的累计值更适合现场做差,与 ss 的连接快照、sar 的历史趋势互补。