iftop 无法直接显示“每秒包数”统计图,其核心功能是字节速率监控;精确包级统计需依赖 sar -n dev、/proc/net/dev 或 /sys/class/net/*/statistics,配合脚本与绘图工具实现可视化。

用 iftop -i 指定接口并开启包级统计模式
iftop 默认显示的是字节速率(KB/s),不是包数。要看到「每秒多少个包」的实时统计图,必须配合 -P(显示端口)和 -n(禁用 DNS 解析)减少干扰,再结合界面底部的「cumulative」或「2s average」观察趋势;但它本身不直接输出「rxpck/s」「txpck/s」这类离散包计数——那是 sar 或 /proc/net/dev 的职责。
真正能画出「包过滤实时统计图」的,是把 iftop 当作流量探针 + 外部脚本做后处理。例如:
-
sudo iftop -i eth0 -P -n -t -L 100:以文本模式输出最近 100 行连接摘要,含源/目标 IP、端口、当前速率(字节) - 用
awk提取行中第五列(如1.23Kb)并转换为整数,再按秒聚合——但这只是估算,无法区分 TCP 重传包、ACK 包或 ICMP 包 - 若需精确到协议类型(如只看 TCP SYN 包),iftop 不支持;得换
tcpdump -i eth0 'tcp[tcpflags] & tcp-syn != 0' -c 10这类抓包命令
用 sar -n DEV 看真实包计数,但不是“图”
sar -n DEV 1 5 输出的 rxpck/s 和 txpck/s 是内核从驱动层上报的真实每秒收发包数,比 iftop 更权威,但它只是数字表格,不是图形界面。
常见误区是以为加个 -f 或 --graph 就能出图——sar 没这功能。想可视化,得导出数据:
- 运行
sar -n DEV 1 60 > sar-dev.log抓 60 秒数据 - 用
awk '{print $4}' sar-dev.log | grep -v "IFACE" | gnuplot -e "set terminal png; set output 'rxpck.png'; plot '-' with lines"生成 PNG 图(需装 gnuplot) - 注意:
sar默认只记录活跃接口,如果 eth0 暂时没流量,它可能不显示该行;用sar -n DEV -f /var/log/sa/sa$(date +%d)查历史文件更稳
用 nload 或 bmon 看带宽图,但看不到“包”
nload eth0 和 bmon -p eth0 都能画出漂亮的实时流量柱状图或折线图,但它们只显示字节速率(kB/s、MB/s),底层不暴露包计数逻辑。你无法从中区分「1 个 1500 字节的包」和「15 个 100 字节的小包」——而这对排查 MTU 问题或队列丢包很关键。
如果你真需要「包级实时图」,推荐组合方案:
- 用
watch -n 1 'cat /proc/net/dev | grep eth0'手动刷新看rx_packets和tx_packets累计值,再心算差值 → 粗略包速 - 写一个 Python 脚本读
/sys/class/net/eth0/statistics/下的rx_packets、tx_packets文件(Linux 3.10+ 支持),每秒采样并用matplotlib绘图 - 云环境慎用:AWS ENA、GCP vNIC 的统计路径可能不同,
/sys/class/net/eth0/statistics/在部分容器里不可见
为什么没有开箱即用的“包过滤实时统计图”工具
因为「包过滤」和「统计图」是两层需求:过滤靠 BPF(如 tcpdump、bpftrace),绘图靠前端(如 Grafana)或终端库(如 urwid)。二者不在同一抽象层。
真正生产可用的链路是:
- 用
tc qdisc或iptables -j NFLOG做包标记和导出 - 用
libpcap程序(如自研 C 工具或 Python scapy)持续收包并计数 - 把计数结果推到 Prometheus 的
counter指标,再用 Grafana 画图
临时调试时,别强求「一张图解决所有」——先用 sar -n DEV 确认包量异常,再用 tcpdump -i eth0 -c 100 抓包看具体内容,最后决定是否值得上完整监控栈。











