cpu 等待时间久,但使用率低,怎么排查(随手记)

发布时间:2026/7/10 8:11:05
cpu 等待时间久,但使用率低,怎么排查(随手记) CPU load high但 CPU usage low说明系统“排队的人很多”但不一定都在真正吃 CPU。Linux 的 load average 统计的是可运行状态 R 的进程 不可中断睡眠状态 D 的进程所以 CPU 使用率低但 load 高最常见原因是大量进程卡在 I/O、磁盘、NFS、网络存储、锁等待、D 状态。一、先确认 load 是否真的高先看 CPU 核数nproc再看 loaduptime例如load average:20.00,18.00,15.00如果机器是nproc32那 load 20 不一定严重。但如果机器只有 4 核load 20 就说明队列严重堆积。二、先看整体 CPU 状态top重点看这一行%Cpu(s):2.0us,1.0sy,0.0ni,90.0id,7.0wa,0.0hi,0.0si,0.0st重点字段字段含义us用户态 CPUsy内核态 CPUid空闲waI/O waitst虚拟化偷走的 CPU 时间如果你看到CPU idle 很高 load 很高那重点怀疑D 状态进程 / I/O 卡住。如果看到wa 很高那基本是磁盘、文件系统、NFS、数据库 I/O 问题。如果看到st 很高说明是云主机宿主机资源争抢CPU 被 steal 了。三、找 D 状态进程这是最关键的一步。ps-eostate,pid,ppid,comm,wchan:32,cmd|awk$1D或者psaux|awk$8 ~ /D/如果有大量D状态进程说明它们卡在不可中断睡眠通常是磁盘、NFS、块设备、内核 I/O 等问题。例如输出D1234mysqld io_schedule /usr/sbin/mysqld D2345nginx nfs_wait_bit nginx: worker process看wchan很有用wchan 关键词可能原因io_schedule磁盘 I/O 等待nfs_waitNFS 卡住xfs / ext4文件系统问题jbd2journal 写入卡住blk_mq块设备层等待futex锁等待不一定是 I/O四、看哪些进程贡献了 load用top之后按Shift H显示线程。或者直接ps-eopid,ppid,state,pcpu,pmem,wchan:32,cmd--sort-pcpu|head-30再看所有 R / D 状态ps-eopid,ppid,state,pcpu,pmem,wchan:32,cmd|awk$3R || $3D如果很多是R说明确实在排 CPU。如果很多是D说明是 I/O 或内核等待。五、重点看磁盘 I/O安装有sysstat的话iostat-x1重点看字段判断%util接近 100%磁盘忙满awaitI/O 平均等待时间高说明慢r/s、w/s每秒读写次数rkB/s、wkB/s每秒读写量aqu-sz队列长度如果看到%util99% await 200ms说明磁盘 I/O 已经成为瓶颈。没有 iostat 可以用vmstat1重点看r b si so bi bo us syidwa st解释字段含义r正在等待 CPU 的进程数b不可中断睡眠进程数通常是 I/OwaI/O waitbi/bo块设备读写如果b 很高wa 高就是 I/O 卡住。六、看哪个进程在疯狂读写磁盘iotop-oPa如果没有iotoppidstat-d1关注kB_rd/s kB_wr/s iodelay例如pidstat-d1可以看出是 MySQL、Java、Nginx、备份脚本还是日志写入导致 I/O 堵塞。七、检查是否是 NFS / 网络存储卡住如果机器挂载了 NFS、Ceph、GlusterFS、云盘、NAS很容易出现 CPU 不高但 load 飙升。查看挂载mount|grep-Enfs|ceph|gluster|fuse查看磁盘df-h注意如果df -h自己都卡住基本高度怀疑某个挂载点异常。也可以看dmesg-T|tail-100常见报错nfs: server not responding I/O error blocked for more than 120 seconds task xxx blocked EXT4-fs error XFS error八、检查是否有大量 blocked taskdmesg-T|grep-iblocked for more than或者dmesg-T|grep-Eihung|blocked|I/O error|reset|timeout|nfs|ext4|xfs如果看到INFO: task mysqld:1234 blocked for more than 120 seconds说明某些进程在内核里卡死等待load 会升高但 CPU 不一定高。九、看是否内存不足导致 swap / 回收CPU 低、load 高也可能是内存压力导致大量进程等待内存回收或 swap。free-h再看vmstat1关注si so如果si/so持续不为 0说明在换入换出 swap。查看内存压力sar-B1或者cat/proc/meminfo重点看MemAvailable SwapFree Dirty Writeback如果Dirty、Writeback很高说明大量脏页在等写盘也可能导致 load 高。十、看是不是容器 / cgroup CPU 被限制如果是在 Docker / Kubernetes 里经常会出现容器内 CPU usage 不高 但是 load 高可能是 CPU quota 限制、throttling。Docker 看dockerstats容器内看cat/sys/fs/cgroup/cpu.stat2/dev/nullcat/sys/fs/cgroup/cpu/cpu.stat2/dev/null关注nr_throttled throttled_time如果一直增加说明容器被 CPU 限速。K8s 可以看kubectltoppod kubectl describe podpod十一、一个比较实用的排查顺序你可以按这个顺序来uptimenproctop然后vmstat1如果b高、wa高继续查 I/Oiostat-x1iotop-oPapidstat-d1如果wa不高但 load 还是高查 D 状态ps-eostate,pid,ppid,comm,wchan:32,cmd|awk$1D再查内核日志dmesg-T|grep-Eiblocked|hung|I/O error|timeout|reset|nfs|ext4|xfs十二、快速判断表现象可能原因load 高CPU idle 高大量 D 状态进程load 高wa 高磁盘 / 存储 I/O 慢load 高b 高进程阻塞在 I/Oload 高st 高云主机 CPU 被宿主机抢占load 高si/so 高swap 严重df -h 卡住挂载点异常常见 NFS/NASdmesg 有 blocked 120s内核等待通常是 I/O 或驱动问题容器里 load 高CPU quota / cgroup throttling最常见的结论是CPU usage low load high 不是 CPU 算力不够 而是大量进程在等 I/O、等磁盘、等网络存储、等内核资源。你重点先跑这三个命令vmstat1ps-eostate,pid,ppid,comm,wchan:32,cmd|awk$1Ddmesg-T|grep-Eiblocked|hung|I/O error|timeout|nfs|ext4|xfs基本就能判断大方向。