在Linux服务器运维中,磁盘IO和网络是最容易成为性能瓶颈的两大子系统。一次线上故障,可能就是因为某个进程疯狂写磁盘,或者某个异常连接耗尽了带宽。本文系统梳理 Linux 下磁盘IO与网络监控的核心工具与实战技巧,帮助你在故障发生时快速定位问题根因。
一磁盘IO监控
1. iostat - 系统级IO全景监控
iostat(I/O Statistics)是 sysstat 软件包中的核心工具,用于监视系统磁盘I/O活动并汇报CPU使用情况。它适合从宏观层面判断系统是否存在I/O瓶颈。
# 安装
yum install -y sysstat # CentOS/RHEL
apt install -y sysstat # Debian/Ubuntu
命令格式
iostat[选项] [时间间隔] [次数]
常用参数
CPU指标说明
| |
|---|
%user | |
%nice | |
%system | |
%iowait | |
%steal | |
%idle | |
磁盘扩展指标说明(iostat -x)
| |
|---|
r/s, w/s | |
rkB/s, wkB/s | |
rrqm/s, wrqm/s | |
avgrq-sz | |
avgqu-sz | |
r_await, w_await | |
await | |
svctm | |
%util | |
性能判断要点
- %iowait 过高
- %idle 高但系统响应慢
- %idle 持续低于10%
- await 远大于 svctm
- %util 接近100%
- avgrq-sz
补充说明
svctm 指标在较新版本的 sysstat 中已被标记为不可靠(deprecated),因为现代存储设备可以并行处理I/O,svctm 的计算方式不再准确。建议重点关注 await 和 %util。
实战命令
# 每1秒采样,共5次,查看所有设备负载
iostat 1 5
# 每2秒显示磁盘统计,共3次
iostat -d 2 3
# 查看指定设备的扩展统计
iostat -x sda sdb 2 3
# 查看TPS和吞吐量(KB单位)
iostat -d -k 1 1
# 查看设备利用率和响应时间(最常用)
iostat -d -x -k 1 1
# 以MB为单位显示所有信息
iostat -m
2. iotop - 进程级IO监控
iostat 只能看到系统整体的I/O情况,如果需要定位哪个进程在疯狂读写磁盘,就需要 iotop。它类似 top 命令,但专注于磁盘I/O维度。
# 安装
yum install -y iotop # CentOS/RHEL
apt install -y iotop # Debian/Ubuntu
iostat vs iotop
iostat = 系统级IO监控(看设备整体)iotop = 进程级IO监控(看具体进程)排查问题时通常先用 iostat 确认瓶颈,再用 iotop 定位进程。
常用参数
| |
|---|
-o | |
-P | |
-a | |
-b | |
-n NUM | |
-d SEC | |
-p PID | |
-u USER | |
-k | |
-t | |
交互快捷键
实战命令
# 只显示正在产生I/O的进程(最常用)
iotop -oP
# 每2秒刷新,共输出5次
iotop -d 2 -n 5
# 非交互模式写日志(后台运行)
nohup iotop -b -o -n 10 -d 5 -t > /tmp/iotop.log &
# 监控指定PID的IO
iotop -botq -p 8382
# 过滤IO大于0.2%的进程并记录时间
iotop -b | awk -F'%' '{if($(NF-1) > 0.2 && $(NF-1) ~ /[0-9]/ && $0 !~ /DISK/) print strftime("%Y-%m-%d %H:%M:%S"),$0}'
3. sar -d 磁盘活动监控
sar(System Activity Reporter)是 sysstat 套件的核心命令,可以收集、报告和保存系统活动数据。使用 -d 参数可监控磁盘IO,功能类似 iostat,但 sar 的优势在于可以查看历史数据。
# 命令格式sar [options] [-A] [-o file] t [n]# t=采样间隔 n=采样次数
磁盘监控输出字段
| |
|---|
DEV | |
tps | |
rd_sec/s | |
wr_sec/s | |
avgrq-sz | |
avgqu-sz | |
await | |
svctm | |
%util | |
sar 磁盘分析要点
avgqu-szsvctm%util- sar 的数据保存在
/var/log/sa/saDD,可回溯历史
# 每3秒采样,共5次,监控磁盘IO
sar -d 3 5
# 查看昨天的磁盘IO数据
sar -d -f /var/log/sa/sa$(date -d yesterday +%d)
二网络监控
1. netstat / ss - 网络连接状态监控
netstat 用于显示IP、TCP、UDP、ICMP协议相关的统计数据,是检查本机网络连接状态的经典工具。
重要提醒:netstat 已被 ss 取代
在较新的Linux发行版(如 CentOS 8+、Ubuntu 18.04+)中,netstat 属于 net-tools 包,已不再默认安装。推荐使用 ss(来自 iproute2 包)作为替代,ss 速度更快,尤其在连接数较多的服务器上优势明显。
常用参数
输出结构说明
netstat 输出分为两部分:
Active Internet connections(有源TCP连接):
| |
|---|
Proto | |
Recv-Q | |
Send-Q | |
Local Address | |
Foreign Address | |
State | |
TCP连接状态速查
| | |
|---|
LISTEN | | |
ESTABLISHED | | |
SYN_SENT | | |
SYN_RECEIVED | | |
TIME_WAIT | | |
CLOSE_WAIT | | |
FIN_WAIT_1/2 | | |
实战命令
# 查看所有TCP连接
netstat -atnp
# 查看所有UDP连接
netstat -aunp
# 各协议统计信息
netstat -s
# 显示网卡列表
netstat -i
# 显示路由表
netstat -r
# 统计各TCP状态的连接数(排障必备)
netstat -n | awk '/^tcp/ {++S[$NF]}; END {for(a in S) print a, S[a]}'
# 查找TIME_WAIT最多的前20个IP
netstat -n | grep TIME_WAIT | awk '{print $5}' | sort | uniq -c | sort -rn | head -20
# 统计每个IP到本机的连接数
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
# 查看80端口的所有连接IP及数量
netstat -plan | grep :80 | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nk1
# 检查ESTABLISHED连接数量
netstat -ntu | grep ESTABLISHED | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn
补充:ss 替代命令对照
# ss 等价命令(更快更高效)
ss -tnlp
# 等价于 netstat -tnlp
ss -s
# 等价于 netstat -s(汇总统计)
ss -tn state established
#筛选ESTABLISHED状态
ss -tn state time-wait
# 筛选TIME_WAIT状态
ss -tn sport = :80
# 查看80端口连接
2. tcpdump - 网络抓包分析利器
tcpdump 是 Linux 下最强大的命令行抓包工具,可以捕获并分析网络上的数据包。它支持基于协议、主机、端口等多种过滤条件,是网络故障排查和安全分析的首选工具。
命令格式
tcpdump[选项] [过滤表达式]
核心参数
|
|---|
-i interface | |
-c count | |
-s len | |
-n | |
-nn | |
-P in/out/inout | |
-w file | |
-r file | |
|
|---|
-e | |
-q | |
-X | |
-v/-vv/-vvv | |
-D | |
输出格式
tcpdump 的基本输出格式为:
时间戳 源地址.端口 > 目标地址.端口 标志 数据信息
TCP标志含义:
过滤表达式
tcpdump 的过滤表达式非常灵活,支持 and、or、not 逻辑组合:
# 按主机过滤
host 192.168.1.1
src host 192.168.1.1
dst host 192.168.1.1
# 按端口过滤
port 80
portrange 1-1024
# 按协议过滤
tcp / udp / icmp / arp
# 按网段过滤
net 192.168
# 组合过滤
host 192.168.1.1 and port 80
host A and not host B
实战命令
# 监听指定接口
tcpdump -i ens160
# 监听指定主机的所有流量
tcpdump -i ens160 host 172.26.150.134
# 抓取两主机之间的通信(排除第三方)
tcpdump -i ens160 host node1 and \(node2 or node3\)
# 抓取指定主机和端口
tcpdump -i ens160 port 8080 and host node1
# 只抓取10个包,按网段过滤
tcpdump -i ens160 -c 10 net 192.168
# 抓取ping包(ICMP协议)
tcpdump -c 5 -nn -i ens160 icmp
# 抓取到本机22端口的TCP包
tcpdump -c 10 -nn -i ens160 tcp dst port 22
# 抓取HTTP GET/响应(通过TCP头部字节匹配)
tcpdump -XvvennSs 0 -i ens160 'tcp[20:2]=0x4745 or tcp[20:2]=0x4854'
# 只抓SYN包(TCP三次握手第一步)
tcpdump -i ens160 'tcp[13] & 2 = 2'
# 抓包保存到文件,后续用Wireshark分析
tcpdump -i ens160 -w /tmp/capture.pcap
tcpdump -r /tmp/capture.pcap
tcpdump 使用技巧
- 生产环境抓包务必加
-c 限制数量或 -w 写文件,避免输出刷屏 - 复杂分析建议用
-w 保存 pcap 文件,再用 Wireshark 图形化分析
补充:TCP头部字节级过滤原理
TCP头部第13字节包含控制标志位
(CWR|ECE|URG|ACK|PSH|RST|SYN|FIN。tcp[13] & 2 = 2 表示对第13字节与 00000010(SYN位)做AND操作,结果为2则匹配。这种方式可以精确捕获带有特定标志的TCP包,例如:• tcp[13] = 2 → 仅SYN包• tcp[13] = 18 → SYN+ACK包• tcp[13] & 2 = 2 → 包含SYN的所有包
3. IPTraf - 实时流量监控
IPTraf(iptraf-ng)是一个基于 ncurses 的交互式IP局域网监控工具,提供 TCP 连接信息、UDP 计数、ICMP/OSPF 信息、以太网负载、节点状态等实时统计数据,适合在终端中直观查看网络流量。
# 安装
yum install -y iptraf-ng# CentOS/RHEL
apt install -y iptraf-ng# Debian/Ubuntu
常用参数
| |
|---|
-i iface | |
-g | |
-d iface | |
-s iface | |
-z iface | |
-l iface | |
-t timeout | |
-B | |
-L logfile | |
实战命令
# 实时监控指定接口的IP流量(交互式界面)
iptraf-ng -i ens160
# 查看接口详细统计
iptraf-ng -d ens160
# 监控所有接口流量
iptraf-ng -i all
4. sar -n 网络流量监控
sar 通过 -n 参数可以汇报网络相关信息,支持 DEV(设备流量)、EDEV(错误统计)、SOCK(套接字)等多种子选项。
sar -n DEV 数据传输指标
| |
|---|
IFACE | |
rxpck/s | |
txpck/s | |
rxkB/s | |
txkB/s | |
rxcmp/s | |
txcmp/s | |
rxmcst/s | |
实战命令
# 每2秒采样,共5次,监控网络流量
sar -n DEV 2 5
# 监控网络错误/丢包情况
sar -n EDEV 2 5
# 查看套接字使用情况
sar -n SOCK 2 5
# 查看TCP连接统计
sar -n TCP 2 5
# 查看历史网络数据(回溯排障)
sar -n DEV -f /var/log/sa/sa$(date -d yesterday +%d)
三补充:实用工具
1. dstat - 全能型资源监控
dstat 可以同时显示CPU、磁盘IO、网络、内存等多维度数据,一条命令看全局。
# 安装
yum install -y dstat
# 同时查看CPU、磁盘IO、网络、内存
dstat -cdnm
# 查看最消耗IO的进程
dstat --top-io
# 查看最消耗带宽的进程
dstat --top-io --top-bio --top-latency
2. nload - 实时带宽可视化
nload 以图形化方式在终端实时展示网卡的入站/出站流量。
yum install -y nload
nload ens160
3. iftop - 连接级带宽监控
iftop 类似 top 命令,但展示的是网络连接的实时带宽占用,可以快速定位哪个连接在消耗带宽。
yum install -y iftop
iftop -i ens160 -nNP
4. nethogs - 进程级流量监控
nethogs 按进程分组显示网络流量,是定位"哪个进程在吃带宽"的最直接工具。
yum install -y nethogs
nethogs ens160
四工具速查总结
| | |
|---|
| | iostat -dxk 1 5 |
| | iotop -oP |
| | sar -d -f /var/log/sa/sa10 |
| | ss -tnlp |
| | tcpdump -i eth0 -nn port 80 |
| | iptraf-ng -i eth0 |
| | sar -n DEV 2 5 |
| | nethogs eth0 |
| | dstat -cdnm |
排障思路总结
- 磁盘IO排障:iostat 看整体 → %util/%iowait 确认瓶颈 → iotop 定位进程 → 优化或迁移
- 网络排障:sar -n DEV 看流量 → ss/netstat 看连接状态 → iftop/nethogs 定位连接/进程 → tcpdump 深度抓包分析
Linux运维磁盘IO网络监控性能优化tcpdumpiostat
如果你觉得有用?点赞 + 在看 + 收藏,方便以后查阅