Linux问题排查-引起服务器带宽使用率高的内鬼
Linux网络流量监控与瓶颈分析全攻略:从基础命令到进程级方案
一、网络带宽查询与实时流量监控
1. 查询主机网络带宽
-
网卡理论带宽
通过ethtool
命令查看网卡最大支持速率,例如:ethtool eth0 # 替换为实际网卡名(如ens33)
输出中的
Speed
字段显示网卡速率(如1000Mb/s
)。 -
实际可用带宽测试
使用iperf3
工具与远程服务器测试实际传输速率:iperf3 -c server_ip # 需提前安装iperf3服务端
2. 实时流量监控工具:iftop深度用法
(1)基础命令与参数
iftop -i eth0 -BnP # 监控eth0网卡,以字节为单位,不解析域名,显示端口号
iftop -f "port not 22" # 过滤规则:排除SSH端口(22)的流量
(2)界面操作与快捷键
- 方向键:
←/→
切换发送/接收流量比例条,↑/↓
滚动连接列表。 - 功能键:
P
:暂停/恢复流量更新,用于定位特定连接。s
:切换显示单位(字节/比特、速率/总量)。l
:设置过滤规则(如port 80
仅显示HTTP流量)。t
:切换界面布局(单行/双行/三行模式)。
(3)输出字段解析
Interface: eth0 # 当前监控网卡
IP address: 192.168.1.100 # 本地IP
=> 发送流量 <= 接收流量
峰值速率: TX: 50Mb/s RX: 100Mb/s # 实时峰值
连接列表:
192.168.1.2:80 <==> 192.168.1.100:58923 # 连接两端IP:端口2.3Mb/s 1.8Mb/s # 实时速率10MB 8MB # 累积流量
二、判断带宽是否为瓶颈:多维指标分析
1. 网卡利用率与流量阈值
使用dstat
或sar
监控网卡实际流量,若持续超过理论带宽的70%(如千兆网卡长期高于700Mb/s),可能存在瓶颈:
dstat -nt 5 # 每5秒刷新,观察recv/s和send/s是否接近网卡上限
sar -n DEV 1 5 # 历史流量统计,分析趋势
2. 应用层与网络层指标
- 延迟与卡顿:业务响应变慢、API超时增加,且CPU/内存正常时,可能是带宽不足。
- TCP重传率:通过
netstat -s
查看重传次数,若重传率>1%,可能因带宽拥塞导致丢包:netstat -s | egrep 'lost|retran'
三、定位高带宽进程:从IP到PID的全链路追踪
1. 传统工具:iftop + nethogs组合
- 通过iftop定位异常IP/端口:按
P
暂停更新,记录可疑连接的端口号(如远程IP:8080)。 - 用nethogs按进程显示流量:
nethogs eth0 # 直接列出各进程带宽占用,支持排序
2. 可编程方案:基于Go的进程级流量监控(go-netflow)
(1)核心原理与架构
- 数据映射:
- 通过
/proc/net/tcp
、/proc/net/udp
获取TCP/UDP连接的四元组和inode。 - 通过
/proc/{pid}/fd
建立inode与进程PID的映射关系。
- 通过
- 抓包分析:使用
gopacket
库捕获流量,解析IP/端口后,通过地址:端口→inode→PID
链路关联到进程,实现流量按PID统计。 - 缓存与性能优化:
- 三层缓存(
connInodesMap
、inodePidMap
、processMap
)动态更新。 - 异步处理流量数据,队列满时丢弃(采样模式),并通过Linux cgroups限制CPU/内存占用。
- 三层缓存(
(2)功能特性
- 进程级监控:显示PID、进程名、路径、实时收发速率(如
java
进程上传速率1.2MB/s)。 - PCAP文件输出:支持将流量数据写入文件,供Wireshark分析。
- 可编程接口:可集成到Prometheus等监控系统,实现自动化告警。
(3)使用示例
- 启动监控:
go run main.go -i eth0 -c 0.5 -m 1024 # 监控eth0,限制0.5核CPU、1GB内存
- 查询进程流量(假设HTTP接口):
返回结果:curl http://localhost:8080/process?pid=12345
{"pid": 12345,"name": "data-uploader","tx_rate": "48Mb/s","rx_rate": "2Mb/s" }
四、工具对比与组合实践
工具 | 优势场景 | 数据粒度 | 扩展性 |
---|---|---|---|
iftop | 实时网卡流量监控、IP/端口级分析 | 网卡/IP/端口 | 适合人工排查 |
nethogs | 快速定位高流量进程(命令行工具) | 进程(PID) | 轻量级即用 |
go-netflow | 可编程接口、自动化集成 | 进程(PID) | 适合DevOps |
典型排查流程
- 初步诊断:用
iftop
发现网卡流量异常(如eth0
利用率达90%),定位异常IP/端口(如192.168.1.200:443
)。 - 进程级定位:
- 若需快速查看,用
nethogs eth0
直接获取进程列表。 - 若需集成到系统,调用
go-netflow
接口查询对应端口的PID。
- 若需快速查看,用
- 优化与验证:
- 通过
tc
流量控制限制进程带宽(如tc qdisc add dev eth0 root handle 1: htb default 10
)。 - 再次用
iftop
确认网卡利用率下降至安全范围。
- 通过
五、工具安装与扩展
1. 基础工具安装
# Ubuntu/Debian
sudo apt-get install iftop nethogs dstat sysstat# CentOS/RHEL
sudo yum install iftop nethogs dstat sysstat
2. go-netflow部署
git clone https://github.com/rfyiamcool/go-netflow
cd go-netflow
go build -o netflow
./netflow -h # 查看帮助文档
通过组合使用实时监控工具与可编程方案,可构建从“流量异常发现”到“进程级定位”再到“自动化优化”的完整链路,有效解决Linux系统的网络带宽瓶颈问题。