带宽跑满、流量突增、账单异常,是服务器上让人紧张的三类问题。它们都需要先回答一个基本问题:现在的实时流量是多少,是谁在占用。Windows 上有任务管理器的网速曲线,Linux 下没有开箱即用的图形界面,但有一批各有所长的命令行工具,能按网卡、按连接、按进程三个维度把流量拆开看。
这篇文章介绍 iftop、nload、nethogs、ip -s link、sar -n DEV、ss -s、vnstat、bmon 八个工具,说明各自的安装方式和适用场景,重点讲清楚"按进程看流量"这个高频需求该怎么实现,以及它的原理和限制。同时给出流量突增时的一套排查顺序,帮你从"带宽满了"推进到"是哪个 IP、哪个连接、哪个进程在跑"。
先统一口径:单位、速率与包量
开始之前,必须先澄清几个容易混淆的概念,否则数字对不上会浪费大量时间。
第一是单位。 运营商和云厂商说的带宽,比如 5Mbps、100Mbps,小写 b 是 bit(比特)。而 Linux 里 ifconfig、ip -s link、很多监控面板显示的字节数用的是 Byte(字节),缩写为大写的 B。一字节等于八比特。所以 5Mbps 的带宽上限,理论下载速度约 625 KB/s。看到工具和带宽数字对不上,先检查是不是差了八倍。
第二是方向。 对服务器而言,出方向(TX、outgoing)通常是提供服务的下行流量,比如用户下载文件、看视频,这部分是大部分业务的主要消耗;入方向(RX、incoming)是用户上传或服务器拉取数据。计费方式各厂商不同,有的只算出方向,有的按两者较大值算,具体以服务商说明为准。
第三是速率和总量的区别。 瞬时速率回答"现在多快",累计总量回答"这个月用了多少"。前者用 iftop、nload 看,后者用 vnstat 看。用错工具会得出错误结论。
第四是包速率 pps。 小包攻击、大量短连接场景下,带宽可能不高,但每秒包数极高,照样能把网卡或 CPU 打满。sar -n DEV 和 ip -s link 都能看到包速率。经验上,千兆网卡转发几十万 pps 就开始吃力,具体取决于包大小和网卡多队列配置。
按网卡看速率:nload、bmon、ip -s link
nload 是最直观的入门工具,分屏显示实时曲线和统计,无需交互:
# RHEL、Rocky、CentOS(需 EPEL)
sudo dnf install -y epel-release
sudo dnf install -y nload
# Debian、Ubuntu
sudo apt update
sudo apt install -y nload
nload # 查看所有网卡,左右键切换
nload eth0 # 只看指定网卡
nload -u M eth0 # 以 MB/s 为单位显示
nload -t 2000 eth0 # 刷新间隔 2000 毫秒
界面上半部分是入方向,下半部分是出方向,右侧会显示当前、平均、最小、最大和累计传输量。用 -u 参数可以在比特和字节之间切换,排障时建议先用 -u m(小写 m 表示 Mbit)与带宽单位对齐。nload 的缺点是看不到对端 IP,只适合回答"网卡现在跑了多少"。
bmon 功能更全,支持多网卡同屏、多种输出格式和速率单位切换:
# RHEL、Rocky、CentOS
sudo dnf install -y epel-release
sudo dnf install -y bmon
# Debian、Ubuntu
sudo apt update
sudo apt install -y bmon
bmon
bmon -p eth0
在 bmon 里按 d 看详情,g 切换图形,i 切换显示模式。它的信息密度比 nload 高,适合有多块网卡的机器。
如果不想装任何东西,系统自带命令就够用:
ip -s link
ip -s link show eth0
cat /proc/net/dev
watch -n 1 'cat /proc/net/dev'
ip -s link 显示的是自网卡启动以来的累计值,包括接收和发送的字节数、包数、错误数和丢包数。要算速率,需要自己取两次差值:
# 一秒内采样两次,计算速率(字节每秒)
a=$(awk '/eth0:/ {print $2}' /proc/net/dev); sleep 1
b=$(awk '/eth0:/ {print $2}' /proc/net/dev)
echo "RX: $(( (b-a) )) B/s"
这里要特别关注 dropped 和 errors 两列。接收方向有丢包,常见原因是网卡缓冲区不足、软中断处理不过来或者连接数超过限制;发送方向丢包则通常意味着网卡已经打满,或者上游限速。错误帧持续增加要怀疑网线、光模块或交换机端口问题。
按连接看:iftop 定位对端 IP
iftop 是排查流量突增最常用的工具,它按连接实时排序,能直接看到是哪台远端主机在跑流量:
# RHEL、Rocky、CentOS
sudo dnf install -y epel-release
sudo dnf install -y iftop
# Debian、Ubuntu
sudo apt update
sudo apt install -y iftop
sudo iftop
sudo iftop -i eth0
sudo iftop -i eth0 -n # 不做域名解析,更快
sudo iftop -i eth0 -N # 显示端口号
sudo iftop -i eth0 -F 10.0.0.0/24 # 只统计指定网段
sudo iftop -i eth0 -P # 同时显示端口,默认关闭
界面顶部是刻度尺,中间是连接列表,每行显示源与目的之间最近两秒、十秒、四十秒的平均速率,底部是累计与峰值统计。箭头方向表示流量方向。
交互键:s 切换是否显示源主机,d 切换是否显示目的主机,t 切换显示模式(两行、单行、双向合一),p 显示端口,n 切换域名解析,P 暂停刷新,q 退出。
实战中建议这样用:先 sudo iftop -i eth0 -nNP 打开,等十几秒让统计稳定,观察排在前三的连接。如果某个 IP 长期占据榜首且速率接近带宽上限,基本就是流量主体。接下来判断这个 IP 是正常用户、爬虫、CDN 回源还是异常来源,可以通过归属地、User-Agent 和访问路径进一步确认。
注意 iftop 默认会做 DNS 反解,在流量大时会拖慢显示并产生额外 DNS 查询,生产环境建议固定加 -n。另外,iftop 在带宽很高(比如万兆)时自身的抓包开销也不小,长时间运行要谨慎。
按进程看流量:nethogs 与两种替代方案
"到底哪个进程在跑流量"是运维最常问的问题。标准答案是 nethogs,它不按连接聚合,而是直接把流量归属到进程:
# RHEL、Rocky、CentOS
sudo dnf install -y epel-release
sudo dnf install -y nethogs
# Debian、Ubuntu
sudo apt update
sudo apt install -y nethogs
sudo nethogs
sudo nethogs eth0
sudo nethogs -d 5 eth0 # 刷新间隔 5 秒
sudo nethogs -t eth0 # 追踪模式,直接输出文本,适合重定向到文件
输出每行是一个进程,包含 PID、运行用户、程序路径、网卡,以及实时的发送和接收速率。按 m 可以切换速率单位(KB/s、MB/s、KB 总量),按 r 按接收排序,s 按发送排序,q 退出。
-t 追踪模式非常适合自动化采集,比如记录三十秒的流量归属:
sudo timeout 30 nethogs -t > /tmp/nethogs-$(date +%F-%H%M).txt
nethogs 的原理是解析 /proc/net/tcp、/proc/net/udp 中的 socket inode,再遍历 /proc/ 建立文件描述符与 socket 的映射,因此它有以下限制,必须了解:
它只能统计使用 TCP 和 UDP 的流量,ICMP 等其他协议看不到;它依赖 /proc 文件系统,在容器内能看到的只是该容器命名空间内的连接;速率高时映射开销较大,可能出现短暂卡顿;内核版本过新或过旧时偶有兼容问题,表现为某些进程显示为空。
当 nethogs 不可用时,可以用两个替代办法按进程定位。
方案一:先找连接再找进程。 用 ss 找出占用大量缓冲区的连接,再反查 PID:
ss -tnp | head -n 20
ss -tnp state established '( dport = :443 or sport = :443 )'
ss -tnpm # -m 显示 socket 内存用量,间接反映活跃度
lsof -i :80
lsof -p PID -i
方案二:用 ss 结合 /proc 手动映射。 这条命令把 TCP 连接的 inode 与进程的文件描述符对应起来,可以准确找出某个连接的持有者:
# 找出与某端口建立连接最多的进程
ss -tnp | awk '{print $NF}' | grep -oP 'pid=\K[0-9]+' | sort | uniq -c | sort -nr | head
# 查看某个进程打开的 socket
ls -l /proc/PID/fd 2>/dev/null | grep socket
汇总统计:ss -s 与 sar -n DEV
想知道连接规模而不是速率,用 ss -s:
ss -s
输出会给出 TCP、UDP 等协议的总连接数,以及 TCP 各状态的分布。ss -s 很轻量,适合作为常规巡检的第一条网络命令。如果 TIME-WAIT 数量异常高,或者 ESTAB 远超平时基线,就说明有异常。
sar -n DEV 则适合留档和对比,它是 sysstat 的一部分:
# RHEL、Rocky、CentOS
sudo dnf install -y sysstat
# Debian、Ubuntu
sudo apt update
sudo apt install -y sysstat
sar -n DEV 1 5 # 每秒一次,共五次
sar -n DEV 1 # 持续输出
sar -n DEV -f /var/log/sa/sa10 # 看历史
sar -n TCP,ETCP 1 5 # TCP 层的重传、建连统计
关注这几列:rxkB/s、txkB/s 是速率,rxpck/s、txpck/s 是包速率,%ifutil 是接口利用率。用 sar -n TCP,ETCP 时,retrans/s 表示每秒重传段数,active/s、passive/s 表示主动和被动建连速率,重传率持续高于百分之一通常意味着网络质量有问题。
长期流量统计:vnstat
想知道这个月用了多少流量、每天分布如何,用 vnstat。它不抓包,只定期读取内核计数器,开销极低:
# RHEL、Rocky、CentOS
sudo dnf install -y epel-release
sudo dnf install -y vnstat
# Debian、Ubuntu
sudo apt update
sudo apt install -y vnstat
sudo systemctl enable --now vnstat
vnstat # 汇总:今天、昨天、当月
vnstat -d # 按天
vnstat -m # 按月
vnstat -h # 按小时
vnstat -l # 实时模式
vnstat --json # JSON 输出,便于脚本处理
首次安装后需要等一段时间才有数据,它默认每五分钟采集一次。vnstat 的数据存放在 /var/lib/vnstat,不会因重启丢失。如果有多块网卡,用 vnstat -i eth0 指定。要确认它确实在采集,可以先执行 vnstat --json | head 看有没有 lastupdated 字段在推进。
工具对照与选型
| 工具 | 维度 | 是否需要 EPEL/额外源 | 主要用途 | 开销 |
|---|---|---|---|---|
nload |
网卡 | RHEL 系需 EPEL | 快速看整卡速率与曲线 | 低 |
bmon |
网卡 | RHEL 系需 EPEL | 多网卡同屏、信息密度高 | 低 |
ip -s link |
网卡 | 否,自带 | 累计值、错误与丢包 | 极低 |
iftop |
连接 | RHEL 系需 EPEL | 找出对端 IP 和端口 | 中,抓包 |
nethogs |
进程 | RHEL 系需 EPEL | 找出跑流量的进程 | 中高 |
sar -n DEV |
网卡 | 需 sysstat | 速率、包量、历史留档 | 低 |
ss -s |
连接 | 否,自带 | 连接总数与状态分布 | 极低 |
vnstat |
网卡 | RHEL 系需 EPEL | 日、月累计流量统计 | 极低 |
选型建议:常规巡检用 ip -s link 和 ss -s,零成本;带宽满了用 iftop 找 IP;确定是哪个进程用 nethogs;月底对账用 vnstat;事后复盘用 sar。
流量突增的排查顺序
# 第一步:确认整体速率和网卡状态
ip -s link show eth0
sar -n DEV 1 5
# 第二步:看连接规模是否异常
ss -s
ss -tan state established | wc -l
# 第三步:按连接找主体
sudo iftop -i eth0 -nNP
# 第四步:按进程定位
sudo nethogs eth0
# 第五步:结合访问日志验证(Nginx 示例)
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -n 20
判断时要注意区分正常与异常。如果流量主体是 CDN 回源 IP 或搜索引擎爬虫,且业务指标正常,那可能只是业务增长。如果来源分散、单 IP 请求频率极高、路径集中在某个接口,更接近异常。确认后的处理手段包括限流、封禁、调整缓存策略或扩容带宽,处理前务必确认不会影响正常用户,共享出口和移动网络出口往往有大量真实用户共用同一 IP。
常见问题
为什么 iftop 显示的速度和云厂商监控面板差很多?
先确认单位:iftop 默认显示的是比特每秒还是字节每秒取决于配置,而面板通常用比特。再确认方向,出方向和入方向可能只统计了一个。最后确认统计周期,面板多为五分钟粒度,iftop 是瞬时值,尖峰会被平均掉。
nethogs 显示很多进程流量为零,是不是没在工作?
不一定。nethogs 只统计 TCP 和 UDP,且依赖 socket 与文件描述符的映射。瞬时没有数据收发的连接会显示零。建议用 -d 增大刷新间隔,或者用 -t 模式采集一段时间再看累计值。
容器里用这些工具看不到宿主机的流量怎么办?
容器有独立的网络命名空间,ip -s link 只能看到容器内的网卡。要看宿主机整体流量,需要在宿主机上执行,或者用有权限的监控组件。nethogs 在容器内也只能看到该容器的进程。
带宽没跑满但网络很卡,是什么原因?
可能是包速率过高:sar -n DEV 里看 rxpck/s、txpck/s,几十万 pps 时即使带宽不高,CPU 也会被软中断占满。也可能是重传:sar -n TCP,ETCP 看 retrans/s。还可能是延迟和丢包,用 ping 和 mtr 确认链路质量。
能不能长期开着 iftop 或 nethogs?
不建议。它们基于抓包或频繁遍历 /proc,在高流量机器上本身就有明显开销,可能反过来影响业务。需要长期数据应使用 vnstat、sar 或者监控系统的采集代理,它们只读内核计数器,开销可以忽略。
总结
- 先看单位:带宽用 bit,工具常用 Byte,两者相差八倍,对不上数字时第一个要怀疑的就是单位。
- 分三层定位:网卡层用
nload、ip -s link、sar -n DEV;连接层用iftop;进程层用nethogs。 iftop排查时固定加-n关闭反解,用-N、-P显示端口,能更快定位到具体服务。nethogs是唯一直接按进程统计的工具,但它只覆盖 TCP 和 UDP,容器内也只看得到本容器,必要时用ss -tnp加/proc/手动映射。/fd - 长期监控用
vnstat和sar,不要长时间开着iftop、nethogs,它们自身开销在高流量场景下不可忽略。
企业QQ咨询




