nethogs按进程(pid+命令名)监控带宽,需sudo但不依赖抓包;vnstat被动采样/proc/net/dev记录历史流量,需先sudo vnstat -u -i eth0初始化;iftop和pktstat基于libpcap实时分析连接,前者重ip端口维度,后者可解析http/dns等应用层协议。

直接看进程级带宽占用,用 nethogs;只关心总流量趋势或历史统计,用 vnstat;需要实时连接维度分析(比如谁连了哪个 IP、端口、协议),用 iftop 或 pktstat。别一上来就装一堆工具,先明确你要解决什么问题。
查哪个进程在吃带宽:nethogs 最靠谱
nethogs 是少数能按进程(PID + 命令名)聚合网络流量的工具,不需要 root 权限也能看到大部分用户进程,但抓包依赖 libpcap,所以启动时通常要加 sudo。
- 常见错误:运行
nethogs报错Unable to open /dev/tty: No such device or address,多数是终端不支持 curses 模式,换用nethogs -t(文本模式)即可 - 指定网卡更准:
nethogs eth0,避免混杂模式下抓到无关接口流量 - 它不记录历史,退出即丢数据;想长期跟踪某个进程,得配合
watch -n 2 'nethogs -t -c 1 eth0'这类轮询 - CentOS/RHEL 8+ 默认仓库没包,得先启用
epel:执行sudo dnf install epel-release && sudo dnf install nethogs
看历史流量和日均峰值:vnstat 不用常驻也能用
vnstat 的核心优势是「被动记录」——它靠读取 /proc/net/dev 定期采样,不依赖抓包,几乎零开销,且重启后数据不丢。但它默认不自动启动采集,首次使用必须手动初始化数据库。
- 初始化命令必须带接口:
sudo vnstat -u -i eth0,漏掉-i会写进默认接口(通常是 lo),后续所有统计都失真 - 数据库路径固定为
/var/lib/vnstat/,文件名就是接口名(如eth0),删错文件等于清空历史 - 查「今天」流量用
vnstat -d,查「上月」用vnstat -m,-h是小时粒度——但注意:小时数据默认只存最近 24 小时,超时自动滚动覆盖 - 如果系统时间跳变(比如 NTP 校时大幅回拨),
vnstat可能误判为新一天,导致日统计断层;这种情况只能手动用vnstat --importdb修复
实时看连接和协议分布:iftop 和 pktstat 各有侧重
iftop 显示的是「IP:端口 ↔ IP:端口」粒度的实时流量,排序直观,适合快速定位异常外联;pktstat 则额外解析应用层协议(HTTP 方法、DNS 查询名等),但不支持过滤、不能显示进程名。
-
iftop -P强制显示端口号(否则默认隐藏),-N防止反向 DNS 查询拖慢刷新,生产环境务必加上 -
iftop -f "port 80 or port 443"可过滤 HTTP/HTTPS 流量,但过滤语法基于 libpcap,不支持正则或域名匹配 -
pktstat -n 1表示每秒刷新一次,-a显示活跃连接数,但它无法区分同一端口下的多个进程(比如多个 nginx worker 共享 443) - 两者都依赖
libpcap,在容器或 network namespace 里可能抓不到宿主机流量,得确认cap_net_raw权限是否已授给进程
别踩这些兼容性坑
很多教程忽略发行版差异和内核行为变化,导致命令在本地跑不通。
- RHEL/CentOS 8+ 和 Rocky/AlmaLinux 默认用
dnf,但旧脚本里写yum install仍能 fallback;不过ifconfig已被移出net-tools包,得单独装或改用ip -s link -
nload和bmon依赖 ncurses 图形渲染,在纯串口终端或某些 SSH 客户端(如早期 SecureCRT)里会乱码,优先试nload -u M -U M(强制单位)+-r(禁用图表) -
iptraf-ng(新版 iptraf)已取代老版iptraf,但 CentOS 7 仓库里仍是旧版,-B后台模式日志路径是/var/log/iptraf/,而新版改到/var/log/iptraf-ng/,别混淆 - 所有基于
libpcap的工具(iftop/nethogs/pktstat)在 eBPF 普及后逐渐被bpftool+ 自定义 tracepoint 替代,但目前日常排查,它们依然最轻量、最稳











