Linux CPU负载持续升高_Load来源分析流程

5次阅读

linux 中 cpu 负载高不等于 cpu 使用率高,需区分 load average 与 %cpu;高负载可能由 r / d 态进程增多、io 阻塞、内核锁争用或软中断堆积引起,应结合 uptime、top、sar、ps、iostat、iotop、dmesg 及 perf 等工具分层定位。

Linux CPU 负载持续升高_Load 来源分析流程

Linux 系统中 CPU 负载持续升高,不等于 CPU 使用率高,需区分load average(平均负载)和%CPU(CPU 使用率)。负载反映的是单位时间内处于 R 状态(运行中)或 D 状态(不可中断睡眠,如 IO 等待)的进程数总和。因此,高负载可能由大量可运行进程、频繁 IO 阻塞、内核锁争用或软中断堆积引起。

确认当前负载数值与趋势

执行 uptimecat /proc/loadavg查看 1 /5/15 分钟平均负载,并对比 CPU 核心数(nproc):若 1 分钟负载长期 > CPU 逻辑核数,说明系统已过载。

  • 观察 top 右上角的 load average,同时注意 %CPU 列是否同步飙升——若负载高但 %CPU 低,大概率是 IO 或不可中断任务拖累
  • sar -q 1 10 持续采样,确认负载是否稳定上升、脉冲式波动,还是突发后回落,这对定位周期性任务或定时作业很关键
  • 检查 /proc/statprocs_runningprocs_blocked 字段,实时反映 R / D 状态进程数量

定位高负载进程及其状态

ps aux –sort=-pcpu 看 CPU 占用高的进程,但更关键的是用ps -eo pid,ppid,stat,%cpu,time,args –sort=-pcpu | head -20,重点关注 STAT 列:

  • R:正在运行或就绪——可能是计算密集型任务
  • D:不可中断睡眠——常见于磁盘 IO、NFS 挂载卡顿、内核模块死锁,此时 kill 无效,需查 IO 栈
  • SI:可中断睡眠——正常等待事件,一般不直接推高 load
  • 配合 pidstat -w 1 查看每秒上下文切换(cswch/s)和任务创建(proc/s),异常增高常指向频繁 fork 或线程风暴

排查 IO 与内核路径瓶颈

top 显示 %wa(iowait)偏高,或 procs_blocked 持续非零,说明 D 态进程堆积:

  • iostat -x 1 检查%utilawaitr_await/w_await,确认是否设备响应慢或队列深度过大
  • iotop -oPa 定位具体进程的读写吞吐与 IO 等待时间
  • 检查 dmesg -T | tail -30 是否有 SCSI 超时、ext4 journal hang、NVMe reset 等内核 IO 错误日志
  • 对疑似 D 态进程,用 cat /proc//stack 获取其内核调用栈,判断卡在哪个函数(如blk_mq_wait_dispatchnfs_wait_on_request

检查软中断、定时器与内核线程异常

某些场景下,用户进程不多,但 topksoftirqdrcu_preemptkworker等内核线程 CPU 占比高,且负载居高不下:

  • cat /proc/interrupts 查看各 CPU 上中断分布,特别关注 NET_RXTIMERIPI 是否严重不均衡
  • sar -I ALL 1 监控每类中断触发频次,突增可能对应网卡收包风暴或定时器泄漏
  • perf top -g -e irq:irq_handler_entry 抓取中断处理热点;或 perf record -e ‘syscalls:sys_enter_*’ -a sleep 10 分析系统调用分布
  • 检查是否启用透明大页(THP)、ksm、或第三方内核模块(如安全审计驱动)引发额外开销
text=ZqhQzanResources