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

nstat 不是实时抓包工具,也不是接口级流量计数器,它读取的是内核 SNMP 计数器的快照——本质是内核维护的一组累计统计值。直接运行 nstat 默认显示的是「自上次执行以来的增量」,不是绝对总数,这点容易误判。
默认输出怎么看:三列含义必须分清
典型输出如:IpInReceives 1248 0.0,这三列分别代表:
• 第一列是计数器名称(SNMP OID 名);
• 第二列是该计数器在本次采样周期内的**增量值**(不是总值);
• 第三列是速率(单位:每秒),按默认 60 秒窗口计算,若为 0.0 表示该周期内无变化。
常见误解是把第二列当成“当前总连接数”或“当前活跃连接”,其实它和连接状态无关,只反映协议栈收发行为的累计变化量。
nstat -a 和 nstat -s 的区别很关键
这两个选项控制历史数据更新逻辑,直接影响后续结果可比性:
• nstat -a 显示**绝对总值**(即从系统启动至今的累计值),适合做长期趋势基线对比;
• nstat -s 表示「不更新历史」,下次再跑 nstat 时,增量仍包含本次周期的数据——相当于冻结采样点,方便反复验证同一窗口;
• 默认行为(无任何选项)会更新历史,因此连续两次执行,第二次的增量只含第二次运行后的新变化;
• 若想重置归零重新开始计量,用 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 守护模式:它后台常驻并持续写文件,但实际日志路径未标准化,不同发行版行为不一致,易造成磁盘悄悄打满。
TcpExtTW 是 time-wait socket 数,但它不等于 netstat -ant | grep TIME_WAIT | wc -l,前者是回收计数,后者是瞬时数量。这类差异不查源码或内核文档很难厘清,别轻信网上“XX 字段代表连接数”的二手解释。


















