nload最接近网卡实时吞吐流量本质,因其只读/proc/net/dev内核计数器,不抓包、不解析连接,单位准(默认kb/s)、延迟低、零干扰;而iftop基于抓包,受协议头、短连接、硬件卸载等影响,数值易失真且默认单位为bit/s,易误判。

直接看 nload,它最接近“网卡实时吞吐流量”这个需求的本质——不拆连接、不查进程、只读内核计数器,单位准、延迟低、无干扰。
为什么不用 iftop 查吞吐量
iftop 本质是抓包统计,它显示的是「当前活跃连接的瞬时速率」,不是网卡物理层的真实吞吐。常见偏差包括:
- 重传包、TCP 头/IP 头/以太网帧头都被算进去了,数值比应用层 payload 高 5–10%
- 短连接(如 HTTP/1.1 每次请求建连)会导致流量毛刺,
iftop的 2s/10s 平均值容易失真 - 若网卡启用了 GSO/GRO 或硬件 offload,
iftop可能漏计部分帧,而nload读/proc/net/dev是内核最终提交值,不会丢 - 默认单位是 bit/s,不加
-B容易误判为“带宽没跑满”,实际是单位看错了
nload 启动后必须确认的三件事
很多人运行 nload 后发现数值“不对”,其实是没调对上下文:
- 按
←/→键确认当前监控的是目标网卡(如ens33而非lo);lo流量再高也不占外网带宽 - 按
m键切换单位,推荐用M(兆比特每秒)或m(兆字节每秒),避免混淆k/K(小写 k 是 kbit,大写 K 是 Kbyte) - 观察右上角的
Cur:值——这是当前瞬时速率;Avg:是自启动以来的平均值,不能反映此刻压力;真正要看的是柱状图顶部跳动的数字
要精确到小数点后一位?用 watch + /proc/net/dev 手动算
当 nload 默认刷新间隔(500ms)不够细,或你需要写入日志做后续分析时,绕过工具直读内核更可控:
- 执行
watch -n 0.5 'cat /proc/net/dev | grep ens33',看到类似ens33: 123456789 12345 0 0 0 0 0 0 987654321 98765 0 0 0 0 0 0 - 第一组数字(第2列)是接收字节数,第二组(第10列)是发送字节数;两次读取差值 ÷ 时间间隔 ÷ 1024² = MiB/s
- 注意:该文件中所有值都是累加值,重启清零;且
rx_bytes和tx_bytes是驱动层上报值,含校验失败但已交付上层的包
真正难的不是读哪个数,而是理解「吞吐量」在不同层级的含义:网卡驱动上报的、协议栈处理的、应用 write() 写出的,三者永远不等。选工具前先想清楚——你要的是物理带宽占用率,还是服务响应瓶颈?











