跳过正文

Linux 性能故障诊断实战:CPU、I/O、内存与网络排查命令详解

Greatfinish
作者
Greatfinish
记录 Oracle、PostgreSQL、达梦、Linux、存储与生产环境故障处理经验。

一、快速定位总流程
#

排查目标首选命令重点看什么初步判断
系统是否整体繁忙uptimetopvmstat 1load、CPU 使用率、run queue、I/O wait判断是 CPU 忙、I/O 慢、内存紧张还是进程阻塞
CPU 是否瓶颈mpstat -P ALL 1 5pidstat -u 1 5%usr%sys%iowait%steal、单核是否打满区分应用消耗、系统调用、I/O 等待、虚拟化抢占
哪个进程吃 CPUtoppspidstatPID、线程、CPU 占比找到具体进程或线程
I/O 是否瓶颈iostat -x 1 5pidstat -d 1 5%utilawaitr_awaitw_await、队列长度判断磁盘忙还是响应慢
哪个进程读写磁盘iotoppidstat -dlsof进程读写速率、文件路径找到 I/O 来源
内存是否紧张free -hvmstat 1sar -ravailable、swap、si/so、page fault判断是否缺内存或频繁换页
哪个进程占内存pstoppmapsmemRSS、PSS、Swap找出大内存进程
网络是否异常sssar -n DEV,TCP,ETCPip -s link丢包、错误包、重传、连接状态判断带宽、丢包、重传、连接堆积
抓包定位tcpdump源/目的 IP、端口、TCP flags、重传深入分析网络链路或应用协议

二、常用工具安装
#

系统类型安装命令包含工具
RHEL / CentOS / Oracle Linuxyum install -y sysstat procps-ng iotop iftop nload tcpdump iproute net-tools lsof psmisc numactlsariostatmpstatpidstattopvmstatiotoptcpdumpsslsof
Rocky / Alma / RHEL 8+dnf install -y sysstat procps-ng iotop iftop nload tcpdump iproute net-tools lsof psmisc numactl同上
Ubuntu / Debianapt install -y sysstat procps iotop iftop nload tcpdump iproute2 net-tools lsof psmisc numactl同上
启用 sysstat 历史采集systemctl enable --now sysstat启用 sar 历史性能数据采集

三、CPU 诊断命令
#

3.1 CPU 总体诊断
#

命令用法示例参数详解重点字段判断标准
uptimeuptime查看系统运行时间、用户数、load averageload average: 1min, 5min, 15minload 持续大于 CPU 核数,说明系统有压力;如果 1 分钟高、15 分钟低,可能是短时峰值
lscpulscpu查看 CPU 架构、核数、线程数CPU(s)Core(s)Thread(s)判断 load 是否过高时,要先知道 CPU 逻辑核数
toptop实时查看 CPU、内存、进程%us%sy%wa%idload average%us 高:应用消耗;%sy 高:内核消耗;%wa 高:I/O 等待;%id 低:CPU 忙
top -Htop -H -p <PID>查看某个进程下线程 CPU 使用情况线程级 PID、%CPUJava、Oracle、MySQL 等多线程进程定位热点线程非常有用
mpstatmpstat -P ALL 1 5每 1 秒采样一次,共 5 次;-P ALL 查看所有 CPU 核%usr%sys%iowait%steal%idle单核 100% 不代表整机 CPU 满;如果某几个核长期满,可能存在单线程瓶颈
vmstatvmstat 1 10每 1 秒采样一次,共 10 次rbussyidwacsinr 长期大于 CPU 核数,CPU 排队;wa 高说明 I/O 等待;cs 很高可能上下文切换严重
sar -usar -u 1 5查看 CPU 使用率%user%system%iowait%steal%idlempstat 类似,适合当前和历史对比
sar -qsar -q 1 5查看运行队列和 loadrunq-szplist-szldavg-1runq-sz 长期高于 CPU 核数,说明 CPU 排队明显

3.2 CPU 进程级定位
#

命令用法示例参数详解重点字段判断标准
psps -eo pid,ppid,user,comm,pcpu,pmem,stat,wchan:32,args --sort=-pcpu 竖线 head -20按 CPU 使用率倒序查看进程PID%CPUSTATWCHANCOMMAND
pidstat -upidstat -u -p ALL 1 5查看所有进程 CPU 使用情况%usr%system%CPUCPU某进程 %CPU 长期高,需要继续分析该进程内部
pidstat -tpidstat -u -t -p <PID> 1 5-t 查看线程级 CPUTID%CPU找具体热点线程
pidstat -wpidstat -w -p ALL 1 5查看上下文切换cswch/snvcswch/s自愿/非自愿上下文切换过高,可能锁竞争或线程过多
pidstat -Rpidstat -R -p ALL 1 5查看实时优先级和调度策略priopolicy排查异常实时进程抢占 CPU
perf topperf top -p <PID>实时查看进程热点函数函数名、模块、占比适合内核/应用深度分析,生产环境慎用,注意开销

3.3 CPU 字段判断标准
#

字段含义判断标准
%usr / %user用户态 CPU 消耗长期高,通常是业务进程、SQL、应用计算消耗
%sys / %system内核态 CPU 消耗长期高,可能是系统调用、网络包处理、文件系统、内核锁、驱动问题
%iowait / %waCPU 等待 I/O 的时间长期高,通常不是 CPU 不够,而是磁盘、存储、NFS、数据库 I/O 慢
%idle空闲 CPU长期接近 0,CPU 基本打满
%steal虚拟化环境中被宿主机抢占的 CPU虚拟机中长期大于 5% 需要关注;大于 10% 往往明显影响性能
load average平均负载持续大于 CPU 逻辑核数,说明系统存在排队;但 load 包含 D 状态 I/O 等待,不等同于 CPU 使用率
r运行队列长度vmstatr 长期大于 CPU 核数,说明 CPU 排队
b不可中断睡眠进程数长期大于 0,通常有 I/O、存储或内核等待
cs上下文切换次数突然大幅升高,可能线程过多、锁竞争或频繁调度
in中断次数网络或磁盘中断异常升高时,需要结合 mpstat -Isar -n 继续看

四、I/O 诊断命令
#

4.1 磁盘整体 I/O
#

命令用法示例参数详解重点字段判断标准
iostatiostat -x 1 5-x 扩展指标;每 1 秒采样一次,共 5 次%utilawaitr_awaitw_awaitaqu-szr/sw/s判断磁盘是否忙、响应是否慢
iostat -kiostat -xk 1 5以 KB 为单位显示吞吐rkB/swkB/s判断读写吞吐是否接近磁盘或存储上限
iostat -miostat -xm 1 5以 MB 为单位显示吞吐rMB/swMB/s大吞吐场景更直观
sar -dsar -d 1 5查看块设备 I/O 当前或历史数据tpsrd_sec/swr_sec/sawait%util适合看历史 I/O 趋势
vmstatvmstat 1 10查看系统级 I/O 和等待bibowabwa 高、b 高,常见于磁盘或存储慢
lsblklsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT,MODEL查看块设备、挂载点、磁盘型号设备名、挂载点、类型确认业务目录对应哪个磁盘
dfdf -hT查看文件系统使用率和类型Use%TypeMounted on文件系统使用率超过 85% 需要关注,超过 90% 风险较高
dudu -sh /path/* 竖线 sort -h统计目录大小目录容量

4.2 进程级 I/O 定位
#

命令用法示例参数详解重点字段判断标准
pidstat -dpidstat -d -p ALL 1 5查看所有进程磁盘读写kB_rd/skB_wr/skB_ccwr/s找出读写最重的进程
pidstat -d -ppidstat -d -p <PID> 1 5查看指定进程 I/O读写速率判断某进程是否正在大量读写
iotopiotop -oPa-o 只显示有 I/O 的进程;-P 进程级;-a 累计值DISK READDISK WRITEIO%直接找 I/O 消耗进程
lsoflsof -p <PID>查看进程打开的文件文件路径、FD 类型找到进程正在访问哪些文件
lsof +Dlsof +D /data查看某目录被哪些进程打开PID、文件目录无法卸载、文件被占用时使用
fuserfuser -vm /data查看访问挂载点的进程PID、用户、访问类型判断文件系统被哪些进程占用
dmesgdmesg -Tegrep -i “errorfailreset

4.3 iostat 关键字段判断
#

字段含义判断标准
r/s每秒读请求数请求数高说明读 IOPS 压力大
w/s每秒写请求数请求数高说明写 IOPS 压力大
rkB/s / rMB/s每秒读取吞吐接近磁盘/存储带宽上限时,说明吞吐型瓶颈
wkB/s / wMB/s每秒写入吞吐大量写入时关注日志盘、归档盘、数据盘
awaitI/O 平均等待时间,包括排队和服务时间SSD 通常持续超过 10~20ms 要关注;HDD 持续超过 50ms 要关注;数据库核心盘越低越好
r_await读 I/O 平均等待时间高说明读延迟大
w_await写 I/O 平均等待时间高说明写延迟大,数据库 redo/归档/数据文件要重点看
aqu-sz平均 I/O 队列长度长期偏高说明请求排队严重
%util设备繁忙度单盘长期超过 80% 需要关注;长期接近 100% 基本表示设备饱和。但多队列 SSD、SAN、虚拟盘上 %util 不能单独作为唯一判断
svctm平均服务时间新版本已不推荐依赖,主要看 awaitr_awaitw_await、队列和吞吐

五、内存诊断命令
#

5.1 内存整体诊断
#

命令用法示例参数详解重点字段判断标准
freefree -h人类可读方式显示内存totalusedfreebuff/cacheavailableswap重点看 available,不是单纯看 free
free -mfree -mMB 单位显示同上脚本采集更方便
vmstatvmstat 1 10查看内存、swap、I/O、CPUfreebuffcachesisosi/so 持续大于 0,说明发生 swap 换入换出
sar -rsar -r 1 5查看内存使用情况%memusedkbmemfreekbbufferskbcachedkbcommit适合看历史内存趋势
sar -Wsar -W 1 5查看 swap 换页pswpin/spswpout/s持续有值说明系统正在换页,可能影响性能
sar -Bsar -B 1 5查看分页情况pgpgin/spgpgout/spgfault/spgmajfault/spgmajfault/s 高说明大量主缺页,性能风险较高
/proc/meminfocat /proc/meminfo查看详细内存状态MemAvailableDirtyWritebackSlabSReclaimableSUnreclaim深入判断 cache、slab、脏页
toptop 后按 M按内存使用排序RESVIRTSHR%MEM找出大内存进程
dmesgdmesg -T 竖线 egrep -i "out of memory 竖线 oom 竖线 killed process"

5.2 进程级内存定位
#

命令用法示例参数详解重点字段判断标准
psps -eo pid,ppid,user,comm,rss,vsz,pmem,args --sort=-rss 竖线 head -20按 RSS 倒序查看进程RSSVSZ%MEM
toptop 后按 M按内存排序RESVIRTSHR找出占内存最高的进程
pmappmap -x <PID> 竖线 tail -20查看进程内存映射KbytesRSSDirty
smemsmem -tk 竖线 sort -nr -k 5 竖线 head查看 PSS,更适合共享内存场景
numastatnumastat -p <PID>查看进程 NUMA 内存分布Node0、Node1 分布NUMA 不均衡可能导致性能下降
slabtopslabtop查看内核 slab 使用cache name、object 数量、sizeslab 异常大可能是 inode/dentry/socket 等内核对象堆积

5.3 内存字段判断标准
#

字段含义判断标准
MemAvailable / available系统估算可用内存free 更重要;低于总内存 10% 要关注,低于 5% 风险较高
free完全空闲内存Linux 会用空闲内存做 cache,所以 free 低不一定是问题
buff/cache文件缓存、块缓存高通常正常,除非伴随 available 很低和 swap 活跃
Swap used已使用 swap使用了 swap 不一定有问题,关键看是否持续 si/so
siswap in,每秒从 swap 读入内存持续大于 0,说明内存压力明显
soswap out,每秒从内存写入 swap持续大于 0,说明内存不足或回收压力大
pgmajfault/s主缺页,需要磁盘 I/O持续高说明内存或文件缓存不足,性能会明显下降
Dirty脏页,等待写回磁盘长期很高可能导致写回阻塞
Writeback正在写回磁盘的内存页长期高说明磁盘写入压力大
Slab内核对象缓存异常高要进一步用 slabtop
SUnreclaim不可回收 slab持续增长可能存在内核对象泄漏或连接/文件句柄堆积
RSS进程实际驻留物理内存判断进程真实内存占用的常用指标
VSZ / VIRT进程虚拟地址空间很大不一定代表真实占用大
PSS按比例分摊共享内存后的占用多进程共享内存场景更准确

六、网络诊断命令
#

6.1 网络接口与流量
#

命令用法示例参数详解重点字段判断标准
ip addrip addr show查看 IP 地址IP、网卡状态确认 IP 是否正确
ip linkip link show查看网卡链路状态UPLOWER_UP没有 LOWER_UP 可能物理链路异常
ip -s linkip -s link show eth0查看网卡收发包统计RX errorsdroppedoverrunsTX errorserror/drop 持续增长,说明网卡、驱动、队列或链路异常
ethtoolethtool eth0查看网卡速率、双工、链路SpeedDuplexLink detected速率不对、半双工、Link down 都是异常
ethtool -Sethtool -S eth0查看网卡详细统计driver counters丢包、重传、队列错误等需要关注
sar -n DEVsar -n DEV 1 5查看网卡吞吐rxkB/stxkB/srxpck/stxpck/s%ifutil%ifutil 高说明带宽接近瓶颈
nloadnload eth0实时查看网卡流量Incoming、Outgoing直观看带宽使用
iftopiftop -i eth0查看主机之间实时流量源 IP、目的 IP、速率找出哪个 IP 占用带宽
nethogsnethogs eth0按进程查看网络流量PID、进程、流量找出哪个进程占用网络

6.2 TCP 连接诊断
#

命令用法示例参数详解重点字段判断标准
ss -sss -s查看 socket 汇总established、timewait、orphaned连接数异常增长要关注
ss -antss -ant查看所有 TCP 连接StateRecv-QSend-Q、本地/远端地址Recv-QSend-Q 长期堆积说明应用处理慢或网络发送慢
ss -lntpss -lntp查看监听端口和进程LISTEN、端口、PID确认服务是否监听
ss -ant state establishedss -ant state established 竖线 wc -l统计 ESTABLISHED 连接数连接数量
ss -ant state time-waitss -ant state time-wait 竖线 wc -l统计 TIME_WAITTIME_WAIT 数量
ss -antpss -antp 竖线 grep :1521查看指定端口连接PID、连接状态
netstat -s`netstat -segrep -i “retransresetlisten
nstat`nstat -azegrep -i “RetransResetTimeout

6.3 网络连通性和链路质量
#

命令用法示例参数详解重点字段判断标准
pingping -c 10 <IP>发送 10 个 ICMP 包packet loss、rtt min/avg/max丢包大于 1% 要关注;延迟抖动大说明链路不稳定
ping -sping -s 1472 -M do <IP>测试 MTU;-M do 禁止分片是否能 ping 通用于排查 MTU 问题
traceroutetraceroute <IP>查看路由路径每跳延迟定位中间链路问题
mtrmtr -rwzc 100 <IP>连续探测路由质量Loss%、Avg、Best、Wrst、StDev哪一跳开始丢包或延迟升高,可能是问题位置
curlcurl -v http://<host>:<port>/测试 HTTP 服务连接、TLS、响应码、耗时应用层访问验证
telnettelnet <IP> <PORT>测试 TCP 端口连通性是否 connected端口不通可能是防火墙、监听、路由问题
ncnc -vz <IP> <PORT>测试 TCP 端口succeeded / failed比 telnet 更适合脚本化

6.4 抓包分析
#

命令用法示例参数详解适用场景判断标准
tcpdumptcpdump -i eth0 host 10.1.1.10抓取与某 IP 相关的数据包看某主机通信判断是否有请求、是否有响应
tcpdumptcpdump -i eth0 port 1521抓取指定端口Oracle/MySQL/PostgreSQL 等端口排查确认连接是否到达服务器
tcpdumptcpdump -i eth0 -nn host 10.1.1.10 and port 1521-nn 不解析域名和端口名精准抓包避免 DNS 解析影响
tcpdumptcpdump -i eth0 -nn -s 0 -w /tmp/net.pcap host 10.1.1.10-s 0 抓完整包;-w 写入文件后续用 Wireshark 分析适合复杂网络问题
tcpdumptcpdump -i eth0 -nn 'tcp[tcpflags] & tcp-syn != 0'抓 SYN 包判断连接发起情况只有 SYN 无 SYN/ACK,服务端或链路可能异常
tcpdumptcpdump -i eth0 -nn 'tcp[tcpflags] & tcp-rst != 0'抓 RST 包排查连接被重置大量 RST 说明连接被主动断开

6.5 网络判断标准
#

指标含义判断标准
RX errors / TX errors收发错误包正常应接近 0;持续增长要查网卡、交换机、线缆、驱动
RX dropped / TX dropped丢包持续增长说明网卡队列、内核缓冲、应用处理或链路异常
rxkB/s / txkB/s网卡吞吐接近网卡带宽上限时说明带宽瓶颈
%ifutil网卡利用率持续超过 70% 要关注,超过 90% 容易出现排队和丢包
RetransSegsTCP 重传持续增长说明网络丢包、拥塞或对端处理慢
ListenOverflows监听队列溢出有增长说明服务端 accept 慢或 backlog 太小
ListenDrops监听队列丢弃有增长说明连接可能被内核丢弃
Recv-Q接收队列长期不为 0,说明应用读取慢
Send-Q发送队列长期不为 0,说明对端接收慢或网络发送阻塞
TIME_WAIT主动关闭连接后的等待状态数量很大通常说明短连接多,不一定是故障,要结合端口耗尽、连接失败判断
CLOSE_WAIT本端未关闭连接大量 CLOSE_WAIT 通常是应用没有正确关闭 socket
SYN-SENT已发起连接等待响应大量 SYN-SENT 可能是目标不可达、防火墙丢弃或对端未响应
SYN-RECV服务端收到 SYN,等待握手完成大量 SYN-RECV 可能是半连接堆积、攻击或客户端异常

七、常见故障场景与命令组合
#

故障现象诊断命令组合分析逻辑
系统卡顿但 CPU 不高vmstat 1iostat -x 1free -hdmesg -T看是否 I/O wait 高、swap 活跃、磁盘 timeout
CPU 使用率很高topmpstat -P ALL 1 5pidstat -u -p ALL 1 5ps --sort=-pcpu先看是用户态、系统态还是单进程打满
load 很高但 CPU idle 也高vmstat 1、`ps -eo pid,stat,wchan,argsgrep " D “iostat -x 1`
磁盘响应慢iostat -x 1 10pidstat -d 1 10iotop -oPadmesg -T先看哪个盘慢,再看哪个进程产生 I/O
内存不足free -hvmstat 1sar -W 1 5ps --sort=-rssdmesg -T 竖线 grep -i oom
网络连接慢pingmtrss -antpsar -n TCP,ETCP 1 5tcpdump看延迟、丢包、重传、连接队列
端口不通ss -lntpnc -vz IP PORTiptables -L -nfirewall-cmd --list-alltcpdump看服务是否监听、防火墙是否拦截、包是否到达
网络丢包ip -s linkethtool -S eth0sar -n DEV,EDEV 1 5mtr看本机网卡错误、驱动统计和链路丢包
数据库连接堆积`ss -antpgrep :1521ss -ssar -n TCP,ETCP 1 5`

八、一套生产环境快速巡检命令
#

echo "===== basic ====="
date
hostname
uptime
lscpu | egrep 'CPU\(s\)|Core|Thread|Socket|Model name'

echo "===== cpu ====="
top -b -n 1 | head -30
mpstat -P ALL 1 3
vmstat 1 5
pidstat -u -p ALL 1 3

echo "===== memory ====="
free -h
vmstat 1 5
cat /proc/meminfo | egrep 'MemTotal|MemFree|MemAvailable|Buffers|Cached|SwapTotal|SwapFree|Dirty|Writeback|Slab|SReclaimable|SUnreclaim'
ps -eo pid,ppid,user,comm,rss,vsz,pmem,args --sort=-rss | head -20

echo "===== io ====="
df -hT
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT,MODEL
iostat -x 1 5
pidstat -d -p ALL 1 3
dmesg -T | egrep -i 'error|fail|reset|timeout|blk|scsi|nvme|oom|killed process' | tail -100

echo "===== network ====="
ip addr show
ip -s link
ss -s
ss -antp | head -50
sar -n DEV,TCP,ETCP 1 3

九、推荐排查顺序
#

步骤操作目的
1uptimetopvmstat 1先判断整体瓶颈方向
2CPU 高时用 mpstatpidstatps找 CPU 类型和具体进程
3I/O 高时用 iostatpidstat -diotop找慢盘和 I/O 来源
4内存紧张时用 freevmstatpspmap判断是否内存不足、是否换页
5网络异常时用 sssar -nip -s linktcpdump判断连接、丢包、重传、端口问题
6最后结合 dmesg、系统日志、业务日志判断是否存在硬件、驱动、内核或应用异常

这份表可以作为 Linux OS 层排障手册的主体框架。