尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Linux服务器网络流量监控全攻略:从基础命令到实战排查

Linux服务器网络流量监控全攻略:从基础命令到实战排查 1. 从“流量去哪儿了”说起一个运维的日常困惑“服务器带宽怎么又跑满了” “这个服务到底吃了多少流量” “刚才的突发流量是哪个进程搞的鬼”如果你也经常被这些问题困扰那说明你已经进入了服务器运维的深水区。在Linux世界里网卡流量不像Windows任务管理器那样有个直观的图形界面点一下就能看到实时曲线。它更像一个隐藏在命令行背后的精密仪表盘数据都在但你需要知道正确的“仪表盘”和“读数”方法。今天我们不谈那些高深的网络协议分析就聚焦在最实际、最接地气的一点怎么把网卡流量的“账”算清楚、看明白。网上教程很多但往往只给命令不讲场景只列参数不说原理。结果就是你背了一堆ifconfig、ip、sar、nload真到用的时候还是不知道该选哪个或者看不懂输出结果里那一串数字到底意味着什么。这篇文章的目的就是帮你彻底理清思路。我会从实时监控、历史统计、进程级追踪三个核心需求维度出发拆解每一种工具的使用场景、命令详解、输出解读以及我最常踩的那些坑。无论你是刚接手服务器的萌新还是需要快速定位线上问题的老手这里总有一种方式适合你。2. 基础三板斧ifconfig, ip, cat /proc/net/dev当我们想快速看一眼网卡的基本状态和累计流量时这三个命令是最直接的选择。它们提供的是自系统启动以来的累计数据适合做粗略的容量规划和异常初判。2.1 ifconfig经典但正在“退役”的老兵ifconfig是绝大多数人接触的第一个网络配置命令它来自net-tools软件包。虽然在新版系统中逐渐被功能更强大的ip命令取代但在很多场景下依然可用且直观。执行ifconfig或ifconfig 网卡名如ifconfig eth0你会看到类似下面的输出我们重点关注流量相关的几行eth0: flags4163UP,BROADCAST,RUNNING,MULTICAST mtu 1500 inet 192.168.1.100 netmask 255.255.255.0 broadcast 192.168.1.255 inet6 fe80::20c:29ff:fea4:8b1c prefixlen 64 scopeid 0x20link ether 00:0c:29:a4:8b:1c txqueuelen 1000 (Ethernet) RX packets 24567890 bytes 18446744073709551615 (16.0 EiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 12345678 bytes 9223372036854775807 (8.0 EiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0关键字段解读RX packets / TX packets: 接收/发送的数据包总数。数字巨大是正常的因为系统运行了很长时间。RX bytes / TX bytes:这是我们要看的累计流量单位是字节Bytes。上面例子中RX bytes显示了一个异常巨大的值16 EiB这通常是因为计数器溢出32位系统或某些驱动问题实际中你应该看到一个合理的数值。errors, dropped, overruns: 这些是错误和丢包统计。在排查网络质量问题时这里的非零值比流量大小更重要。dropped丢包可能由于缓冲区满、应用处理不过来errors是硬件或驱动问题。实操心得与避坑单位换算要小心bytes是字节我们常说的带宽单位Mbps是“兆比特每秒”。1 Byte 8 bits。所以如果你看到RX bytes在10秒内增加了 104,857,600 字节那么平均接收速率大约是(104857600 * 8) / 10 / 1024 / 1024 ≈ 80 Mbps。ifconfig可能不准正如上面例子所示字节计数器有可能溢出回绕。对于需要精确、长期统计的场景不要依赖ifconfig。它不显示速率ifconfig只给总量你想知道“当前网速”需要自己计算(当前bytes - 之前bytes) / 时间间隔。2.2 ip -s link新一代的“瑞士军刀”ip命令来自iproute2套件是现在官方推荐的工具。查看统计信息的命令是ip -s link show 网卡名。$ ip -s link show eth0 2: eth0: BROADCAST,MULTICAST,UP,LOWER_UP mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000 link/ether 00:0c:29:a4:8b:1c brd ff:ff:ff:ff:ff:ff RX: bytes packets errors dropped overrun mcast 18446744073709551615 24567890 0 0 0 0 TX: bytes packets errors dropped carrier collsns 9223372036854775807 12345678 0 0 0 0输出更规整信息与ifconfig类似。ip命令的统计信息通常更可靠溢出问题较少见。我的习惯是在不确定ifconfig是否可用或准确时优先使用ip -s link。2.3 cat /proc/net/dev一切统计数据的源头/proc/net/dev是一个内核暴露的伪文件它提供了最底层、最详细的网络接口统计数据。上面两个命令的数据源头基本都是这里。$ cat /proc/net/dev Inter-| Receive | Transmit face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed eth0: 18446744073709551615 24567890 0 0 0 0 0 0 9223372036854775807 12345678 0 0 0 0 0 0 lo: 1234567 78901 0 0 0 0 0 0 1234567 78901 0 0 0 0 0 0为什么需要看这个文件脚本化处理友好它是纯文本格式固定非常适合用awk、grep等工具进行解析在自动化监控脚本中出场率极高。信息最全包含了compressed压缩数据包等更细节的字段。一个简单的实时流量计算脚本示例#!/bin/bash # 计算eth0网卡每秒的流量速率单位KB/s INTERFACEeth0 RX_OLD$(cat /proc/net/dev | grep $INTERFACE | awk {print $2}) TX_OLD$(cat /proc/net/dev | grep $INTERFACE | awk {print $10}) sleep 1 RX_NEW$(cat /proc/net/dev | grep $INTERFACE | awk {print $2}) TX_NEW$(cat /proc/net/dev | grep $INTERFACE | awk {print $10}) RX_RATE$(( ($RX_NEW - $RX_OLD) / 1024 )) TX_RATE$(( ($TX_NEW - $TX_OLD) / 1024 )) echo 接收速率: $RX_RATE KB/s echo 发送速率: $TX_RATE KB/s注意直接从/proc/net/dev取数做差值计算时一定要考虑计数器溢出的问题虽然概率低。在生产环境编写严谨的监控脚本时需要处理回绕情况即当新值小于旧值时应加上计数器的最大值对于64位计数器是2^64。3. 实时监控利器动态查看网络吞吐当服务器突然变慢你需要立刻知道“是不是网络堵了”以及“谁在堵”时实时监控工具就派上用场了。它们能动态刷新直观展示速率。3.1 nload简洁直观的“仪表盘”nload是一个小巧的终端工具默认情况下它会分上下两部分显示所有网卡的实时进出流量曲线图。安装很简单CentOS/RHEL:yum install nloadUbuntu/Debian:apt install nload。直接运行nload即可。它的优点非常突出一目了然图形化柱状条和数字结合一眼就能看出哪块网卡流量高。信息集中同时显示当前速率Curr、平均速率Avg、峰值Peak以及累计流量Total不用自己算。交互简单按左右方向键可以在不同网卡间切换按F2可以进入设置界面调整刷新间隔、单位等。使用场景快速登录一台服务器直观感受其网络负载情况。当你怀疑带宽被打满时第一个就可以敲nload看看。避坑点nload默认可能不会显示虚拟网卡如Docker创建的veth*、docker0或者某些绑定网卡。你需要用nload -m来显示所有设备或者用nload eth0指定查看特定网卡。3.2 iftop揪出流量对话的“侦探”如果说nload是看总水表的那iftop就是看每家每户用水明细的。它能监听指定网卡并显示当前有哪些网络连接IP对在通信以及它们各自的实时速率。安装yum install iftop或apt install iftop。常用命令iftop -i eth0 -n-n禁止主机名解析加快显示。iftop界面解读界面分为三大部分顶部刻度条显示流量比例尺。中部连接列表每一行代表一个活跃的网络连接。最关键的两列是中间的两个箭头分别代表该连接在最近2秒、10秒、40秒内的平均接收RX和发送TX速率。底部统计行显示监听网卡的总接收、发送速率和累计流量。iftop的核心操作在运行界面中按相应键h显示帮助。P暂停刷新。n开关DNS解析。s/d只显示指定源IP或目标IP的流量。t切换显示模式单行/两行/合并发送接收。j/k或方向键上下移动选择连接选中后按l可以过滤只显示该连接的流量类似“聚焦”再按一次取消。使用场景这是排查“异常流量”或“带宽被谁占用”问题的神器。比如网站突然变慢nload看到出口带宽跑满马上用iftop -i eth0一看发现是某个外网IP在以极高的速度从你服务器拉数据你就能迅速定位到可能遭受的攻击或异常爬虫。实操心得注意方向iftop默认显示的是监听网卡上的流量。对于服务器出口TX跑满通常影响更大。结合端口iftop默认只显示IP。如果需要看端口启动时加-p参数或者在运行界面按p键切换显示端口。知道端口号就能很容易地关联到进程用下一节会讲的nethogs或ss -p。权限问题iftop需要root权限来捕获网络数据包。3.3 nethogs按进程归类的“流量审计员”iftop看IP对nethogs看进程。它直接告诉你是哪个进程PID、程序名在消耗网络带宽。安装yum install nethogs或apt install nethogs。运行nethogs eth0。输出示例PID USER PROGRAM DEV SENT RECEIVED 1234 www-data /usr/bin/php-fpm eth0 0.200 12.554 KB/sec 5678 mysql /usr/sbin/mysqld eth0 5.123 0.098 KB/sec ... ... ... ... ... ...为什么它重要在复杂的服务器上一个IP背后可能对应多个服务一个服务可能有很多连接。nethogs直接定位到进程让你能立刻做出反应是Web服务php/java异常还是数据库mysql在同步或者是某个备份脚本rsync/cron在跑使用技巧与局限刷新频率可以用-d参数指定刷新间隔如nethogs -d 5 eth0每5秒刷新一次。交互命令运行时按m可以在KB/s、KB、B等不同单位间切换。局限它主要基于/proc/net/tcp等文件关联进程对于短连接或非常快速的连接可能捕捉不到或归类不准。对于内核线程或某些网络栈绕过了标准套接字的流量也可能无法统计。我的排查组合拳当发现带宽异常时我通常的步骤是1)nload看整体是否真高了 - 2)iftop看是跟哪个IP在大量通信 - 3)nethogs看是哪个进程在作怪 - 4) 根据进程再去查日志、配置。4. 历史与趋势分析sar与vnStat实时监控用于“救火”但运维更需要“防火”和“溯源”。我们需要知道流量在一天、一周内的分布找出规律和峰值这就需要历史统计数据。4.1 sar -n DEV系统活动报告的“多面手”sar是sysstat工具包里的王牌它默认会定时通常每10分钟收集一次系统性能数据包括CPU、内存、IO和网络。查看历史网络流量就用sar -n DEV。查看历史记录$ sar -n DEV -f /var/log/sa/sa15 # 查看本月15号的历史数据 Linux 5.4.0-xx-generic (hostname) 03/15/2024 _x86_64_ (2 CPU) 12:00:01 AM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s 12:10:01 AM eth0 1.02 0.98 0.08 0.05 0.00 0.00 0.00 12:20:01 AM eth0 5.67 10.23 0.45 1.02 0.00 0.00 0.00 ... ... ... ... ... ... ... ... ...关键字段rxkB/s和txkB/s就是我们要的每秒接收/发送的千字节数。直接乘以8就是大概的Kbps带宽。查看实时流量指定间隔和次数$ sar -n DEV 1 5 # 每隔1秒采样一次共采样5次为什么sar不可或缺自带历史无需额外配置只要sysstat服务在运行你就拥有了一份默认保存一个月取决于配置的流量趋势数据。这是事后排查的黄金依据。数据精准采样由系统守护进程完成数据可靠。全局视图可以一次性看到所有网卡的历史情况方便对比。配置与避坑确保服务运行systemctl enable sysstat systemctl start sysstat。调整收集频率编辑/etc/sysstat/sysstat或/etc/sysstat/sa相关的配置文件不同发行版位置可能不同可以修改SADC_OPTIONS-S XALL中的采样间隔默认10分钟。数据文件历史数据存放在/var/log/sa/目录下saDD是二进制数据sar -f读取sarDD是文本格式需配置生成。4.2 vnStat轻量级专属流量记录器如果觉得sar太庞大或者你只想专注监控流量vnStat是个绝佳选择。它是一个后台守护进程专门记录网卡流量并生成易于阅读的日报、月报。安装与初始化# Ubuntu/Debian apt install vnstat vnstati # CentOS/RHEL (需要EPEL) yum install epel-release yum install vnstat vnstati # 初始化数据库指定要监控的网卡 vnstat -i eth0 --create systemctl enable vnstat systemctl start vnstat常用查看命令vnstat查看概要。vnstat -d查看日报。vnstat -m查看月报。vnstat -h查看小时统计。vnstat -l查看实时流量类似nload的简约版。vnstat -i eth1如果有多块网卡指定查看。输出示例vnstat -deth0 / daily day rx | tx | total | avg. rate ----------------------------------------------------------------- 03/15/2024 1.23 GiB | 102.43 MiB | 1.33 GiB | 128.12 kbit/s 03/14/2024 2.45 GiB | 456.78 MiB | 2.91 GiB | 288.01 kbit/s它的优势数据持久化使用自己的数据库即使重启也不会丢失历史。报表直观直接给出每天、每月的总流量和平均速率单位自动换算KiB/MiB/GiB对人类非常友好。生成图片配合vnstati命令可以生成PNG图片格式的流量图方便嵌入报告或仪表盘。选择sar还是vnStat如果你需要全面的系统性能历史CPU、内存、IO、网络用sar。如果你只关心网络流量想要更直观、更持久的报表或者需要在资源受限的设备上运行用vnStat。5. 进阶与组合精准定位与脚本化监控掌握了基础工具后我们可以玩一些更花的解决更具体的问题。5.1 查看特定端口的流量有时候我们需要知道某个服务比如运行在8080端口的Web应用消耗了多少流量。iftop和nethogs可以看个大概但不够精确。我们可以用tcpdump这个抓包神器来统计。使用tcpdump统计特定端口流量# 统计eth0网卡上目标端口为8080的流量总大小持续10秒 timeout 10 tcpdump -i eth0 -nn dst port 8080 -w /tmp/port8080.pcap # 分析抓包文件的总字节数 tcpdump -nn -r /tmp/port8080.pcap | awk {sum$NF} END {print 总字节数:, sum}这个方法比较重适合短期、精细的分析。对于长期监控更好的办法是使用iptables或nftables的计数器。使用iptables计数器# 添加一条规则匹配目标端口8080的流量并计数 iptables -A INPUT -i eth0 -p tcp --dport 8080 # 查看计数器包数和字节数 iptables -L INPUT -v -n | grep dpt:8080计数器会累加匹配到的流量。这是一个轻量级、开销极低的监控方法。5.2 脚本化监控与告警在生产环境中我们通常需要将流量监控自动化并设置告警。一个经典的思路是定期采样/proc/net/dev计算速率与阈值比较。一个简单的带宽使用率告警脚本框架#!/bin/bash # 监控eth0带宽使用率超过阈值告警 INTERFACEeth0 MAX_BW1000000 # 假设网卡最大带宽为1Gbps单位Kbit/s THRESHOLD80 # 告警阈值80% # 获取接收和发送字节数 get_bytes() { local rx$(cat /proc/net/dev | awk -v intf$INTERFACE $0 ~ intf {print $2}) local tx$(cat /proc/net/dev | awk -v intf$INTERFACE $0 ~ intf {print $10}) echo $rx $tx } # 第一次采样 read RX_OLD TX_OLD (get_bytes) sleep 1 # 第二次采样 read RX_NEW TX_NEW (get_bytes) # 计算速率 (Bytes/s to Kbit/s) RX_RATE_Kbps$(( (($RX_NEW - $RX_OLD) * 8) / 1024 )) TX_RATE_Kbps$(( (($TX_NEW - $TX_OLD) * 8) / 1024 )) # 计算使用率 RX_UTIL$(( RX_RATE_Kbps * 100 / MAX_BW )) TX_UTIL$(( TX_RATE_Kbps * 100 / MAX_BW )) echo 接收速率: ${RX_RATE_Kbps} Kbps, 使用率: ${RX_UTIL}% echo 发送速率: ${TX_RATE_Kbps} Kbps, 使用率: ${TX_UTIL}% # 告警逻辑 if [[ $RX_UTIL -gt $THRESHOLD ]] || [[ $TX_UTIL -gt $THRESHOLD ]]; then # 这里可以发送邮件、短信、调用告警接口等 echo 警告: $INTERFACE 带宽使用率超过 ${THRESHOLD}%! 2 # 可以附加iftop或nethogs的快照信息帮助定位 fi将这个脚本放入cron定时任务就可以实现基本的带宽监控告警。更复杂的生产环境会使用Zabbix、Prometheus配合node_exporter等专业监控系统其原理也是通过读取/proc/net/dev或使用snmp等协议来采集网络指标。5.3 容器时代的流量监控在Docker/Kubernetes环境中网卡情况变得更复杂。除了物理网卡eth0你还会看到docker0、cni0以及一堆vethxxxx虚拟网卡。查看宿主机整体流量上述所有命令依然适用nload -m可以看到所有虚拟网卡。查看单个容器的流量Dockerdocker stats 容器名命令的输出中包含NET I/O列可以看容器实时的网络流量。但它是总计不区分进出方向。更精细的做法是进入容器网络命名空间查看。可以先找到容器的PIDdocker inspect -f {{.State.Pid}} 容器名然后通过nsenter进入其网络命名空间使用ip -s link等命令nsenter -t PID -n ip -s link show eth0容器内网卡通常是eth0。Kubernetes更依赖于集群层面的监控方案如Prometheus cAdvisor/ kubelet metrics或者使用kubectl top pod如果Metrics Server已部署来查看Pod的资源使用其中包含网络流量但可能需要特定配置。在容器环境下nethogs可能无法正确识别容器内进程的流量因为它依赖于宿主机的/proc视图。此时结合iftop查看veth网卡流量再通过docker ps或kubectl命令关联容器是常用的手动排查方法。6. 工具选型速查与心法总结面对这么多工具到底该怎么选我根据自己的经验画了一个简单的决策流程图问题“我想看一眼网卡现在忙不忙大概多少流量。”动作打开终端输入nload。3秒内获得直观感受。问题“带宽突然跑满了我想知道是跟哪个IP在疯狂通信”动作sudo iftop -i eth0 -n。聚焦源/目标IP按速率排序。问题“不知道是服务器上哪个程序在吃带宽”动作sudo nethogs eth0。按进程排序一目了然。问题“我想看看昨天下午3点服务器的网络负载怎么样”动作sar -n DEV -f /var/log/sa/sa15 | grep -E \03:00|03:10|...\假设日期是15号。查询历史记录。问题“我需要生成一张上个月服务器出口流量的日报表。”动作vnstat -m查看月报或者用vnstati -s -i eth0 -o /tmp/monthly.png生成图片。问题“写一个监控脚本带宽超过80%就发告警。”动作定时读取/proc/net/dev中对应网卡的bytes字段计算差值得到速率。最后几个掏心窝子的建议理解“速率”与“总量”ifconfig/ip看的是自开机以来的总量用于算总账。nload/iftop/sar的rxkB/s看的是瞬时或周期平均速率用于看当前压力。千万别搞混。单位换算要清醒工具显示的单位可能是B/s, KB/s, Kb/s。1 Byte 8 bits。带宽供应商说的100M是100 Mbps (兆比特每秒)。vnStat默认用的GiB是二进制单位1024进制而网络带宽通常用十进制1000进制的Gbps做容量规划时心里要有数。结合上下文判断单独看流量数字没有意义。一个数据库从库在同步期间出口TX流量持续很高是正常的。一个视频流媒体服务器入口RX流量高也可能是正常的。关键是要建立基线——知道你的服务器在正常业务时段的流量范围是多少。任何偏离基线的大幅波动都值得警惕。从宏观到微观排查网络流量问题我个人的黄金步骤是nload(看整体) -iftop(看IP对) -nethogs(看进程) -ss -p/lsof -i(看进程具体连接) - 查日志/配置。这套组合拳下来绝大多数“流量异常”问题都能找到源头。工具是死的思路是活的。希望这篇超详细的梳理能让你下次再面对Linux网卡流量时不再感到迷茫而是能从容地拿起合适的“工具”精准地找到问题的关键。
返回列表