iftop vs nethogs 对比
两者都是基于 libpcap 的实时网络带宽监控工具,但监控粒度不同:iftop 按”主机/端口”维度,nethogs 按”进程”维度。
核心差异
| 维度 | iftop | nethogs |
|---|---|---|
| 监控粒度 | 主机 ↔ 主机、主机 ↔ 端口、端口 ↔ 端口 | 每个进程的实时带宽 |
| 回答的问题 | 哪个远端在吃我的带宽 | 本机哪个程序在吃带宽 |
| 是否显示进程 | 否 | 是(带 PID / 进程名) |
| 使用权限 | 一般需 root(抓包) | 需 root |
| 显示方向 | 三列:本机出、远端入、(差值/峰值) | 每进程 RX / TX 两列 + 累计列 |
iftop 的三种模式
iftop 启动后按不同字母切换视角:
| 按键 | 模式 | 说明 |
|---|---|---|
| 默认(无参数) | host-to-host | 列1 本机→远端,列2 远端→本机 |
n |
host-to-port | 按 远端主机:端口 聚合 |
p |
port-to-port | 按 端口:端口 聚合 |
P |
大写端口 | 显示端口号 |
t |
TCP only | 只看 TCP |
u |
UDP only | 只看 UDP |
f |
过滤表达式 | 支持 host/port/proto 过滤 |
典型输出:
TX: 1st-2nd Max
4.511 MiB 1.20 MiB 12.3 MiB
host.net > 8.2.1.10:25 4.20 MiB ...
RX: 1st-2nd Max
2.11 MiB
185.1.2.3:443 > localhost 2.01 MiB
(1st-2nd 是 1秒/2秒均值,Max 是峰值)
nethogs 的输出
按进程实时显示,并支持按列排序:
Nethogs 0.8.7
Dev: eth0 (press 'h' for help) Total: 1.22mb/s
4.712mb 1.532mb 1571 node /usr/lib/xulrunner...
0.321mb 0.000mb 902 curl
...
PID Interface TxRate RxRate Total Command
排序键:x 按 TX、r 按 RX、p 按进程名、P 按累计值。
选型决策树
带宽异常,先定位是"谁"还是"哪个程序"?
├─ 想知道哪个远端IP/端口在拉你的流量
│ → iftop(默认模式,一眼看到 top 主机)
├─ 想细分到端口/服务(DNS、HTTP、某端口)
│ → iftop 按 p / n 切换
├─ 想定位本机哪个进程在占带宽(如某个业务进程、代理、P2P)
│ → nethogs(唯一能按进程看的)
└─ 两者结合:iftop 看到 top 远端 → nethogs 看到 top 进程 → 对应起来
一句话总结
- iftop:横向视角,看”流量在和本机的哪些远端对话”,适合排查对端问题(哪个 IP 在刷量)。
- nethogs:纵向视角,看”本机哪个进程在发数据”,适合排查本端问题(哪个 app 偷跑流量)。
排查网络带宽问题时通常两者搭配:先用 iftop 锁定可疑的远端/端口,再用 nethogs 锁定本端进程,最后用 ss/lsof/ftrace 把进程和连接串起来。
补充两个常被一起提及的工具:
| 工具 | 用途 |
|---|---|
nload |
像 iftop 的”按网卡总量”版本,显示每张网卡的实时 RX/TX,适合看整机趋势 |
ss / lsof -i |
查具体连接、端口、对应的进程,常作为 nethogs 结果的”最后一公里” |
需要我给一份”带宽异常 5 分钟排查”的命令清单(含这些工具的组合用法)吗?