当前位置:首页>Linux>Linux监控实战:磁盘IO与网络深度解析

Linux监控实战:磁盘IO与网络深度解析

  • 2026-10-11 07:50:18
Linux监控实战:磁盘IO与网络深度解析

在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[选项] [时间间隔] [次数]

常用参数

参数
说明
-c
仅显示CPU使用情况
-d
仅显示磁盘使用情况
-x
显示扩展统计信息(关键参数)
-k
以KB为单位显示
-m
以MB为单位显示
-N
显示LVM信息
-p
显示磁盘和分区信息
-t
显示时间戳

CPU指标说明

指标
含义
%user
用户态CPU占比
%nice
低优先级用户态CPU占比
%system
内核态CPU占比
%iowait
CPU等待I/O完成的时间占比
%steal
虚拟化环境被宿主机偷走的CPU时间占比
%idle
CPU空闲时间占比

磁盘扩展指标说明(iostat -x)

指标
含义
r/s, w/s
每秒完成的读/写I/O次数
rkB/s, wkB/s
每秒读/写的KB数
rrqm/s, wrqm/s
每秒合并的读/写请求数
avgrq-sz
平均每次I/O的数据大小(扇区)
avgqu-sz
平均I/O队列长度
r_await, w_await
读/写操作平均等待时间(含队列等待)
await
平均每次I/O等待时间(ms)
svctm
平均每次I/O服务时间(ms)
%util
磁盘I/O繁忙度百分比

性能判断要点

  • %iowait 过高
     → 硬盘存在I/O瓶颈
  • %idle 高但系统响应慢
     → 可能是内存不足导致CPU等待分配内存
  • %idle 持续低于10%
     → CPU资源紧张
  • await 远大于 svctm
     → I/O队列过长,需要优化
  • %util 接近100%
     → 磁盘I/O满负荷(但不等于带宽用满)
  • avgrq-sz
     越大越可能是顺序IO,越小越可能是随机IO

补充说明

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
只显示正在产生I/O的进程
-P
仅显示进程(默认显示线程)
-a
显示累计I/O量而非实时带宽
-b
非交互模式(适合写日志)
-n NUM
设置监测次数
-d SEC
刷新间隔(秒)
-p PID
监控指定进程
-u USER
监控指定用户的I/O
-k
使用KB单位
-t
显示时间戳

交互快捷键

按键
功能
o
切换只显示活跃进程
p
切换进程/线程视图
a
切换累积/实时模式
r
反向排序
左/右
切换排序列
q
退出

实战命令

# 只显示正在产生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
每秒I/O传输总量
rd_sec/s
每秒读取扇区数
wr_sec/s
每秒写入扇区数
avgrq-sz
平均请求扇区数
avgqu-sz
平均请求队列长度
await
平均I/O等待时间(ms)
svctm
平均I/O服务时间(ms)
%util
设备带宽利用率

sar 磁盘分析要点

  • avgqu-sz
     越低,设备利用率越好
  • svctm
     应小于 await,否则说明队列排队严重
  • %util
     接近 100% 说明磁盘已满负荷
  • 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 速度更快,尤其在连接数较多的服务器上优势明显。

常用参数

参数
说明
-a
显示所有连接(含监听)
-t
显示TCP连接
-u
显示UDP连接
-n
以数字形式显示地址和端口
-l
仅显示监听状态的Socket
-p
显示进程PID和名称
-s
显示各协议的统计信息
-r
显示路由表
-i
显示网络接口信息
-c
持续输出

输出结构说明

netstat 输出分为两部分:

Active Internet connections(有源TCP连接):

字段
含义
Proto
协议类型(tcp/udp)
Recv-Q
接收队列(非0说明数据堆积)
Send-Q
发送队列(非0说明数据堆积)
Local Address
本地地址和端口
Foreign Address
远端地址和端口
State
连接状态

TCP连接状态速查

状态
含义
关注点
LISTEN
监听中
正常
ESTABLISHED
已建立连接
正常
SYN_SENT
发送连接请求后等待
大量出现可能遭受攻击
SYN_RECEIVED
收到SYN后等待确认
大量出现=SYN Flood攻击
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
指定网络接口(如 eth0、ens160)
-c count
抓取指定数量的包后停止
-s len
设置抓取长度(默认65535字节)
-n
不解析主机名,直接显示IP
-nn
不解析主机名和端口名
-P in/out/inout
指定抓取方向
-w file
将抓包数据写入文件(pcap格式)
-r file
从文件读取数据包
输出选项
-e
显示数据链路层头部(MAC地址)
-q
精简输出
-X
同时以16进制和ASCII显示包内容
-v/-vv/-vvv
逐级增加输出详细程度
-D
列出可用的网络接口

输出格式

tcpdump 的基本输出格式为:

时间戳  源地址.端口 > 目标地址.端口  标志  数据信息

TCP标志含义:

标志
含义
S
SYN(发起连接)
.
ACK(确认)
F
FIN(关闭连接)
P
PUSH(推送数据)
R
RST(重置连接)

过滤表达式

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 写文件,避免输出刷屏
  • 抓取长度 -s 越小性能越好,按需设置即可
  • 过滤表达式中含 & 等特殊字符时,用单引号包裹
  • 复杂分析建议用 -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
监视指定接口的IP流量(all=所有接口)
-g
生成网络接口概要信息
-d iface
监视指定接口的详细流量
-s iface
监视TCP和UDP流量
-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
每秒接收的KB数
txkB/s
每秒发送的KB数
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

四工具速查总结

场景
推荐工具
命令示例
系统级磁盘IO概览
iostat
iostat -dxk 1 5
定位IO高的进程
iotop
iotop -oP
回溯历史磁盘数据
sar -d
sar -d -f /var/log/sa/sa10
查看TCP连接状态
ss / netstat
ss -tnlp
网络抓包分析
tcpdump
tcpdump -i eth0 -nn port 80
实时流量监控
iptraf-ng
iptraf-ng -i eth0
网络流量统计
sar -n
sar -n DEV 2 5
进程级带宽定位
nethogs
nethogs eth0
全局资源概览
dstat
dstat -cdnm

排障思路总结

  1. 磁盘IO排障
    :iostat 看整体 → %util/%iowait 确认瓶颈 → iotop 定位进程 → 优化或迁移
  2. 网络排障
    :sar -n DEV 看流量 → ss/netstat 看连接状态 → iftop/nethogs 定位连接/进程 → tcpdump 深度抓包分析

Linux运维磁盘IO网络监控性能优化tcpdumpiostat

如果你觉得有用?点赞 + 在看 + 收藏,方便以后查阅

最新文章

随机文章