nethogs是唯一能按进程实时显示收发流量的命令行工具,需sudo运行以获取CAP_NET_RAW权限,支持指定网卡、按速率排序及单位切换,但不保存历史累计数据。

没有单命令能直接输出“某进程累计发送/接收多少MB”,必须组合工具或依赖内核接口;nethogs 是唯一接近该需求的实时工具,但默认不存历史数据。
用 nethogs 按进程维度看实时流量(最贴近“进程流量统计”)
它把每个进程的 TX/RX 流量聚合显示,单位可切为 KB/s、MB/s,支持按发送速率排序,适合快速定位刷带宽的 python、curl 或 rsync 实例。
- 必须加
sudo,否则只能看到当前用户进程,且可能报Unable to get pid of process(SELinux 或 cgroups v2 限制) - 指定网卡避免混杂模式干扰:
sudo nethogs eth0;多网卡可并列:sudo nethogs eth0 eth1 - 刷新间隔设为 2 秒更灵敏:
sudo nethogs -d 2 eth0;按s键切换为按发送速率排序 - 注意:对多线程程序(如
chrome、java),通常只显示主线程名,实际流量是整个进程组的总和
用 ss + lsof 定位高流量连接及其所属进程
ss 快速列出活跃连接,lsof 反查进程,这是无 nethogs 权限时的可靠兜底方案,但无法直接给出字节数——它靠连接特征(并发数、目标 IP 频次、端口异常性)间接判断“耗带宽”。
- 先用
sudo ss -tunap查所有 ESTABLISHED 连接,关键字段:第5列(本地地址:端口)、第6列(远端地址:端口)、第7列(PID/进程名) - 若
PID列为空(显示-),说明 socket 属于内核线程或权限不足,此时改用sudo lsof -i -P -n | grep ESTABLISHED -
ss默认不统计已收发字节数;想看累积值需手动读/proc/net/snmp或/proc/net/nf_conntrack,实操中极少这么做 - 常见误判点:未加
-a(all)和-p(process)参数,导致看不到 PID;未用sudo导致lsof查不到进程路径
用 iftop 看连接级实时排行,再人工关联进程
iftop 本质是“连接监控器”,不是进程监控器。它显示的是 源IP:端口 → 目标IP:端口 的实时速率,要确认哪个进程在用,得靠端口反查。
- 基础命令:
sudo iftop -n -P -N(-n关 DNS 解析防卡顿,-P显端口,-N不转服务名) - 若界面大量显示
unknown host或*.*.*.*,基本是漏了-n且本地 DNS 不通;若全连127.0.0.1,检查是否误选了lo接口 - 查到可疑端口后,用
sudo lsof -i :8080或sudo ss -tulpn | grep ':8080'反查进程 - 不能直接过滤进程名:
iftop -p PID是无效语法;它只支持按 IP/端口过滤(-f "port 80")
真正意义上的“进程级流量累计统计”在标准 Linux 工具链里不存在——nethogs 停止即清零,vnstat 只统计网卡层面,/proc/net/dev 也不拆解到进程。需要长期记录,得靠 eBPF 工具(如 bpftool + 自定义 tracepoint)或应用层埋点,这不是常规运维场景该碰的复杂度。


















