nethogs是唯一能直接按进程维度实时显示网络流量的命令行工具,它通过监听/proc/PID/fd下的socket文件描述符并关联/proc/net/{tcp,udp}连接条目,结合libpcap抓包估算速率,从而精准归因流量到具体PID和命令路径。

nethogs 是唯一能直接按进程维度实时显示网络流量的命令行工具,它不依赖 DNS 解析、不混淆连接归属,且输出里带 PID 和完整命令路径。其他工具如 iftop 或 iptraf-ng 只能看到 IP+端口对,无法归因到具体进程;top 和 htop 根本不提供网络 IO 统计。
为什么 nethogs 能准确定位进程流量
nethogs 通过监听 socket 文件描述符(/proc/PID/fd/)并反向关联到 /proc/net/{tcp,udp} 中的连接条目,再结合 libpcap 抓包做实时速率估算。它不是靠采样 /proc/net/dev 的累计值,所以能区分“谁在发”而不是“总共发了多少”。
- 必须用
sudo运行,否则看不到其他用户或系统进程的 socket - 默认只显示活跃连接(即当前有数据收发的进程),刚启动但未建连的进程不会出现
- 容器内运行时,若使用 host 网络模式,
nethogs能看到宿主机视角的 PID;若用 bridge 模式,PID 属于容器内部命名空间,宿主机上可能显示为?或无法解析 - 多线程程序(如 Java 应用)通常只显示主线程的 PID,子线程流量会被合并计入该 PID,不会单独列出
nethogs 常见误用与绕过方法
直接执行 sudo nethogs 很容易踩坑:没指定网卡时它会随机选一个(比如 loopback),导致看不到真实外网流量;刷新太快会让终端卡顿;小流量进程被默认阈值过滤掉。
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- 始终指定接口:
sudo nethogs eth0(替换为你的实际网卡名,可用ip -br a查) - 调低刷新间隔避免卡顿:
sudo nethogs -d 2 eth0(每 2 秒刷新一次) - 显示低流量进程:
sudo nethogs -m 1 eth0(只隐藏低于 1 KB/s 的进程) - 按发送量排序定位“上传大户”:
sudo nethogs -s eth0 - 按接收量排序找“下载源”:
sudo nethogs -r eth0
当 nethogs 不可用时的替代方案
某些最小化系统(如 Alpine 容器、CoreOS)缺 libpcap 或根本没装 nethogs,又不能临时编译,这时得换思路:
- 用
ss -tunp查当前连接和 PID(需 root):sudo ss -tunp | grep ':80\|:443'快速定位 HTTP(S) 流量归属 - 结合
/proc/net/dev和进程启动时间粗筛:cat /proc/net/dev看总流量增长,再用ps -eo pid,etime,comm --sort=-etime | head -10找最近启动的大龄进程 - 用
vnstat -l开实时模式(需已初始化数据库),虽然不按进程分,但能确认某段时间是否有异常毛刺,再回头查nethogs日志或重放 - 真要深挖,用
bpftrace脚本(如tcpconnect工具)抓新建连接 + PID,但开销高,仅限诊断阶段
最常被忽略的一点是:nethogs 默认不记录历史,退出就丢数据。如果想回溯“刚才那个进程到底跑了多久、用了多少”,得配合 script 命令录屏:script -c "sudo nethogs -d 5 eth0" /tmp/nethogs.log,不然只能靠肉眼盯屏。

















