Linux nstat命令查看网络统计数据
nstat读取内核SNMP快照,默认显示增量,-a显示绝对总值,-s冻结历史,-r重置;支持关键词过滤(如TcpRetransSegs),-j与-z配合输出JSON结构。
nstat读取内核SNMP累计计数器快照,默认显示自上次执行以来的增量而非总数;-a显示绝对总值,-s冻结历史,-r可重置;过滤用关键词如TcpRetransSegs,非-p选项;-j配合-z支持JSON结构化导出。

在Linux网络统计场景中,nstat命令通过读取内核SNMP计数器快照,获取内核维护的累计统计值,与抓包工具或接口流量计数器不同。直接执行nstat默认显示自上次执行以来的增量而非绝对总数,这一点决定了后续数据解读的正确性。
默认输出怎么看:三列含义必须分清
典型输出如IpInReceives 1248 0.0,三列依次为:计数器名称(SNMP OID名)、本次采样周期内的增量值(非总值)、速率(每秒,按默认60秒窗口计算,0.0表示周期内无变化)。常见误解是将第二列当作当前总连接数或活跃连接,实际上其仅反映协议栈收发行为的累计变化量。
nstat -a 和 nstat -s 的区别很关键
这两个选项控制历史数据更新逻辑,影响结果的可比性:
nstat -a 显示从系统启动至今的绝对总值,适合长期趋势基线对比;
nstat -s 不更新历史,下次增量仍包含本次周期数据——相当于冻结采样点,便于反复验证同一窗口;
默认行为(不带选项)会更新历史,连续执行两次时第二次增量只含新变化;
nstat -r 可重置归零重新计量,但该操作影响所有计数器且不可逆。
过滤特定协议或错误项:用 PATTERN 而不是 -p
部分文档提及的-p tcp属于过时用法或混淆了其他工具(如ss)。nstat 正确过滤方式为直接跟关键词作为参数:
查TCP重传:nstat TcpRetransSegs
查UDP端口不可达:nstat UdpNoPorts
查ICMP错误:nstat IcmpOutErrors
支持通配符:nstat TcpExt* 匹配所有以TcpExt开头的扩展计数器
多个关键词用空格分隔:nstat TcpInSegs UdpInDatagrams
注意:不加-z时零值计数器不显示,可能遗漏关键静默指标——例如TcpRetransSegs长期为0才表示网络健康,这种“看不见”的数据最有价值。
导出与自动化:-j 和 -n 是实用组合
监控脚本中建议使用-j(JSON)加-n(不输出)配合定时任务:
nstat -j -n:安静更新历史不打印,适合 cron 每分钟执行积累数据;
nstat -j TcpRetransSegs UdpNoPorts:按需提取结构化字段,便于 jq 解析;
nstat -j -z | jq '.kernel.TcpRetransSegs' 可稳定取值(-z 防止字段缺失);
尽量避免使用 -d 守护模式:后台常驻持续写文件,但日志路径未标准化,不同发行版行为不一致,存在磁盘撑满风险。
实际上,nstat 真正困难之处并非记忆选项,而是理解每个计数器对应内核的哪条路径以及自增条件。例如 TcpExtTW 是 time-wait socket 的回收计数,而非 netstat -ant | grep TIME_WAIT | wc -l 的瞬时数量。这类差异需查阅内核源码或官方文档才能厘清,不应轻信网上“XX字段代表连接数”的二手解释。
