Linux服务器如何查看实时网络流量?常用监控命令详解

带宽跑满、流量突增、账单异常,是服务器上让人紧张的三类问题。它们都需要先回答一个基本问题:现在的实时流量是多少,是谁在占用。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//fd 建立文件描述符与 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,它们自身开销在高流量场景下不可忽略。