在 CentOS 7 上定位占用网卡带宽的进程,最推荐直接使用 nethogs 工具按进程展示实时流量。适用场景为生产环境突发流量告警或日常排查,操作需要 root 权限,风险在于工具本身会消耗少量系统资源。
先说结论:使用 nethogs 可直接看到每个进程的网络吞吐量,配合 ss 命令可进一步确认连接详情。
- 先确认:使用 ip addr 确认当前主网卡名称,排除 loopback 接口干扰。
- 先处理:安装并运行 nethogs 定位 PID,结合 ps 命令确认进程身份。
- 再验证:停止可疑进程或限流后,观察网卡流量是否回落至正常水位。
命令速用版
以下命令需 root 权限执行,直接复制即可使用:
yum install -y nethogs
nethogs <网卡名>
ss -antp | grep <端口或进程名>
为什么会这样
Linux 标准 top 命令默认不显示网络 IO 数据,导致无法直接看出哪个进程占用带宽。内核网络统计基于 socket 连接,需专用工具将 socket 映射到进程 PID 才能直观展示。
分步处理
第一步,确认网卡名称。执行 ip addr 查看流量跑满的网卡接口,通常是 eth0 或 ens33。
第二步,安装监控工具。执行 yum install -y nethogs 安装,若源不可用可尝试编译安装。
第三步,定位进程。运行 nethogs <网卡名>,界面会列出 PID 和程序名,按 Shift+T 可切换排序方式。
第四步,确认进程详情。记下高流量 PID,执行 ps -fp <PID> 查看启动命令和所属用户。
第五步,处置进程。根据业务重要性选择 kill 停止、nice 降权或使用 tc 命令限流。
怎么验证是否生效
保持 nethogs 运行,观察目标进程流量是否归零。同时新开终端执行 sar -n DEV 1 查看网卡整体吞吐率是否下降。
常见坑
第一,Docker 容器网络。容器内进程在宿主机 nethogs 中可能显示为 docker-proxy 或 veth 接口,需进入容器内部排查。
第二,短连接进程。若进程频繁启停,nethogs 可能抓不到 PID,需结合 tcpdump 抓包分析。
第三,权限不足。未使用 root 运行 nethogs 会报错无法读取网络数据,必须加 sudo 或切换用户。
常见问题
不安装工具怎么临时查看?
可使用 ss -antp 查看连接对应的 PID,再结合 /proc/<PID>/fd 查看文件描述符推测,但无法看到实时带宽数值。
Docker 容器占用带宽怎么查?
在宿主机执行 docker stats 查看容器网络 IO,或进入容器内部安装 nethogs 排查具体进程。
为什么 nethogs 显示 PID 为 0?
通常代表内核线程或无法关联到用户态进程的网络流量,如 NAT 转发或部分驱动层数据,需结合 dmesg 排查。