核心概念:流量如何与进程关联?
在 Linux 中,网络流量最终是由进程产生的,操作系统内核通过套接字来管理网络连接,每个套接字都关联着一个进程,监控工具正是通过读取内核中的网络信息(如 /proc 文件系统、netlink 套接字等)来将流量与进程对应起来的。

实时监控工具 (推荐)
这些工具非常适合在服务器上实时查看哪个进程占用了大量网络带宽。
nethogs - 按进程/程序显示网络流量
nethogs 是一个非常流行的工具,它能实时显示每个进程的网络带宽使用情况(上传和下载),界面清晰,易于使用。
安装:
# Debian / Ubuntu sudo apt-get install nethogs # CentOS / RHEL / Fedora sudo yum install nethogs # 或者 (对于较新版本) sudo dnf install nethogs
使用方法:
直接在命令行运行 sudo nethogs。

sudo nethogs
输出示例:
PID User Program Version Dev Send KByte/s Recv KByte/s
12345 root nginx 1.18.0 eth0 1.50 25.30
67890 nobody java 11.0.11 eth0 150.20 5.10
54321 myuser chrome 91.0.4472 lo 0.50 0.80
- PID: 进程 ID
- User: 运行该进程的用户
- Program: 进程名
- Send/Recv KByte/s: 该进程的实时上传和下载速度。
常用参数:
-d: 刷新间隔(秒),默认为1。- `-t**: 按设备(网卡)排序。
-c: 刷新次数后退出。
iftop - 按连接/IP显示网络流量
iftop 主要显示网络接口的实时流量,但它也能显示哪些 IP 地址和端口在进行通信,并通过反向 DNS 查询(可能会很慢)或 /etc/hosts 来关联到进程。
安装:

# Debian / Ubuntu sudo apt-get install iftop # CentOS / RHEL / Fedora sudo yum install iftop
使用方法:
直接运行 sudo iftop。
sudo iftop -i eth0
-i: 指定要监控的网卡接口。
输出解读:
- 顶部显示网卡总带宽和峰值。
- 中间部分是实时的流量条形图,
=>和<=分别代表上传和下载。 - 底部显示连接的详细信息,包括源/目标 IP、端口和流量占比。
- 在
iftop的界面中,按n可以切换显示 IP 或主机名,按P可以按端口排序,按S可以按源 IP 排序。
iptraf-ng - 全功能的网络监控器
这是一个基于文本的、功能非常强大的网络监控工具,它可以监控接口、TCP/UDP 连接、网络统计等。
安装:
# Debian / Ubuntu sudo apt-get install iptraf-ng # CentOS / RHEL / Fedora sudo yum install iptraf-ng
使用方法:
sudo iptraf-ng
它会提供一个交互式菜单,你可以选择:
- IP traffic monitor: 监控 IP 流量,可以按源/目标地址和端口查看。
- General interface statistics: 查看网卡的总体统计信息。
- Detailed interface statistics: 查看网卡的详细统计,包括 TCP/UDP/ICMP 分组。
- Log / Display activity options: 记录日志。
内核工具 (ss, netstat)
这些工具本身不直接显示流量,但它们可以列出当前所有活跃的网络连接(套接字),如果你发现某个进程的连接数异常多,或者连接到了不该连接的地址,就可以推断它在产生网络流量。
ss - 新一代套接字统计工具
ss 是 netstat 的现代替代品,速度更快,信息更全,推荐优先使用。
列出所有 TCP 连接:
sudo ss -tulpn
-t: TCP-u: UDP-l: 只显示监听端口-p: 显示进程 ID (PID) 和名称-n: 以数字形式显示地址和端口(不进行 DNS 解析,速度更快)
找出某个进程的网络连接:
如果你用 nethogs 发现 java 进程流量异常,可以用 ss 来看它具体在连接哪里。
# -a 显示所有连接, -p 显示进程信息, 'grep java' 过滤 sudo ss -ap | grep java
输出会显示该 Java 进程的所有网络连接,包括本地和远程的 IP 和端口。
netstat - 传统工具
netstat 功能与 ss 类似,但已被 ss 取代,在旧系统上可能会用到。
sudo netstat -tulpn
系统级和网络级统计工具
这些工具查看的是整个系统或网卡的总体流量,不直接关联到进程,但它们是诊断网络问题的第一步。
sar - 系统活动报告器
sar 可以记录和报告系统的各种活动,包括网络流量,它非常适合查看历史流量数据。
安装:
# Debian / Ubuntu sudo apt-get install sysstat # CentOS / RHEL / Fedora sudo yum install sysstat
查看当前网络流量:
sar -n DEV 1 5
-n DEV: 显示网络设备统计。1: 每秒刷新一次。5: 刷新5次后退出。
查看历史网络流量:
sar 的数据通常存储在 /var/log/sysstat/ 目录下。
# 查看今天的网络流量历史 sar -n DEV -f /var/log/sysstat/sa$(date +%d) # 查看昨天的网络流量历史 sar -n DEV -f /var/log/sysstat/sa$(date +%d --date=yesterday)
nload - 简单的带宽监控器
nload 以图形化的方式显示网卡的实时流入和流出带宽,非常直观。
安装:
# Debian / Ubuntu sudo apt-get install nload # CentOS / RHEL / Fedora sudo yum install nload
使用方法:
nload # 或者指定网卡 nload eth0
总结与工作流程
要高效地监控 Linux 网络流量并定位问题进程,可以遵循以下流程:
-
初步诊断:使用
nload或sar快速判断当前或历史网络流量是否异常,以及哪个网卡是瓶颈。 -
定位进程:如果流量异常,使用
nethogs直接定位到是哪个进程(如nginx,java,python)在消耗带宽,这是最快、最直接的方法。 -
深入分析连接:使用
ss -ap | grep <进程名>或netstat -tulpn | grep <进程名>来查看该进程的具体网络连接情况,它连接了哪些 IP?开了多少端口?是 TCP 还是 UDP?这有助于判断是正常业务流量还是异常行为(如挖矿、DDoS 攻击、数据泄露)。 -
持续监控:对于需要长期观察的服务器,可以将
nethogs或iftop的输出通过script命令记录下来,或者配置sysstat进行周期性数据采集,以便事后分析。
| 工具名 | 主要用途 | 优点 | 缺点 |
|---|---|---|---|
nethogs |
按进程显示实时流量 | 最直接,目标明确 | 需要 root 权限,显示信息相对简单 |
iftop |
按连接/IP显示实时流量 | 直观显示流量流向和占比 | 不直接显示进程名,需要反向查询 |
ss/netstat |
列出所有网络连接 | 速度快,信息全,能定位到进程 | 不显示流量大小,需结合其他工具分析 |
sar |
查看历史网络统计 | 适合长期趋势分析和历史回溯 | 不关联到具体进程 |
nload |
显示网卡总带宽 | 界面简洁直观,一看就懂 | 只显示总量,不区分进程 |
对于绝大多数场景,nethogs + ss 的组合已经足够强大和高效,先用 nethogs 找到“罪魁祸首”,再用 ss 查看它的“犯罪证据”(网络连接),是排查网络流量问题的黄金搭档。
