nethogs是唯一能按pid精确监控进程实时收发速率的命令行工具,支持sudo nethogs -p pid直接聚焦目标进程,界面显示sent/received瞬时速率,默认kb/s,按m键可切换单位。

要精准定位某个进程当前正在消耗多少网络带宽,不能依赖全局网卡统计或连接级工具,必须直接绑定该进程的实时收发速率——nethogs 是唯一能原生支持按 PID 精确聚焦的命令行工具,其他方案如 pidstat 在旧内核或低版本 sysstat 中可能根本不出网络 IO 字段。
用 nethogs 实时监控指定进程的带宽
这一步操作起来很简单,直接把进程 PID 传给 nethogs 就行。
第一步:确认目标进程 PID,例如查 nginx 主进程:【ps -eo pid,comm | grep nginx | head -1】,输出类似 1234 nginx,记住 PID(这里是 1234)。
第二步:用 sudo 运行 nethogs 并限定只监控该 PID:【sudo nethogs -p 1234】。注意:-p 参数必须紧跟在 nethogs 后面,不能写成 nethogs -p=1234 或放在网卡名之后,否则会静默失败且无报错。
第三步:观察界面中唯一显示的一行数据——SENT 和 RECEIVED 列就是该进程当前瞬时发送与接收速率,单位默认为 KB/s;按 m 键可循环切换为 MB/s 或 B/s,小流量建议切到 B/s 避免四舍五入归零。
当 nethogs -p 不可用时的替代方案
某些系统(如容器环境、旧版 nethogs<0.8.6)不支持 -p 参数,此时需用组合命令间接实现。
方法一:用 watch + ss + awk 动态抓取该进程的 socket 流量计数器
执行:【watch -n 1 'sudo ss -i "sport = :$(pgrep -f "nginx" | head -1) or dport = :$(pgrep -f "nginx" | head -1)" | awk '''NR>1 {sum_send+=$8; sum_recv+=$9} END{printf "SEND: %.1f KB/s\nRECV: %.1f KB/s\n", sum_send/1024, sum_recv/1024}'''。注意:此命令依赖 ss 的 -i 输出中第 8/9 列为 snd_cwnd 和 rcv_wnd,仅作粗略参考,实际吞吐需结合包数与大小估算。
方法二:用 pidstat 按秒轮询(需内核 ≥4.16 + sysstat ≥12.0.0)
先验证是否支持:【pidstat -n 1 1】,若输出头含 Recv_KB/s 和 Send_KB/s 才有效;确认后运行:【sudo pidstat -n -p 1234 1】,每秒刷新一次该 PID 的收发速率,数值为滚动平均值,对突发流量不敏感。
快速确认进程是否真在发包
nethogs 只显示正在活跃收发的进程,静默监听状态(如刚启动的 httpd)不会出现,容易误判为“没流量”。
用 tcpdump 抓包验证:【sudo tcpdump -i any -q -c 3 "host $(ps -o pid,cmd -p 1234 | tail -1 | awk '{print $2}' | grep -oE '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}') and port 80"】,若能捕获到包,说明该进程确有网络行为,只是当前未被 nethogs 捕获到瞬时流量。
如果输出为空但你知道它应该通信,检查是否用了 localhost 或 127.0.0.1 ——nethogs 默认不监控 lo 接口,需显式加 【-d lo】 参数。











