首页/系统/Windows 运维速查/场景:CPU 跑满怎么排查

场景:CPU 跑满怎么排查

从整体到个体的顺序:先区分用户态/内核态,再锁定进程与线程,最后判断业务高峰还是异常。

Windows 运维速查系统更新于 2026-10-13

CPU 跑满怎么查

CPU 占用高要按从整体到个体的顺序查:先看总体占用以及用户态与内核态的分布,再锁定具体进程与线程,最后判断是业务高峰还是异常。系统进程与业务进程的占用成因差别很大,先分辨再动手。

基本信息

适用平台Windows
整体查看任务管理器或性能监视器,观察用户态与内核态占比
进程定位按 CPU 排序,或两次采样求差得到该时段的真实占用
系统进程空闲进程数值含义特殊,需正确理解不能当成占用
辅助手段进程内线程占用、句柄数与 IO 等待情况
常见非业务成因杀毒扫描、索引、备份与系统更新任务

排查步骤

  • 1. 看总体占用与用户态、内核态比例,判断瓶颈类型
  • 2. 用两次采样对比,锁定这段时间内占用最高的进程
  • 3. 系统与空闲进程数值高时,查驱动、杀毒软件与磁盘等待
  • 4. 业务进程高时,结合应用日志与线程数分析
  • 5. 核对计划任务与备份窗口,排除周期性任务占用

常用示例

常用示例
# 总体 CPU 占用百分比
Get-CimInstance Win32_Processor | Select-Object LoadPercentage
# 按累计 CPU 时间排序,先找出长期占用大户
Get-Process | Sort-Object CPU -Descending | Select-Object -First 8 Name, Id, CPU, Handles
# 两次采样求差,得到这段时间内的真实占用
$a = Get-Process
Start-Sleep -Seconds 10
$b = Get-Process
$b | ForEach-Object { $old = $a | Where-Object Id -eq $_.Id; if ($old) { [pscustomobject]@{Name=$_.Name; Id=$_.Id; Delta=[math]::Round($_.CPU - $old.CPU,1)} } } | Sort-Object Delta -Descending | Select-Object -First 5
# 查看实例数与线程数
Get-Process -Name w3wp | Select-Object Id, CPU, Threads, StartTime

观察项与含义

观察项含义判断要点
总体占用全部逻辑处理器的平均使用率单核跑满与多核均匀负载要区分
用户态占比应用程序消耗的部分偏高多为业务逻辑或循环
内核态占比驱动、中断与 IO 消耗偏高要查驱动、杀毒与磁盘
进程累计 CPU自启动以来的累计处理器秒数需采样求差才是当前占用
线程数进程内部线程数量异常增长常伴随阻塞或泄漏
空闲进程数值高表示系统正在空闲,并不是被占用;系统进程本身占用偏高,则多与驱动、杀毒软件或大量 IO 等待有关,不能直接归因到业务。
持续跑满而业务量没有增长时,优先怀疑死循环、频繁重试或垃圾回收压力。盲目扩容或重启只能短暂缓解,还会掩盖真实原因。

易错点

  • 把空闲进程的数值当成占用,得出系统繁忙的错误结论
  • 用进程累计 CPU 时间直接横向比较,忽略了各进程启动时间不同带来的偏差
  • 只看单次快照,无法区分周期性任务造成的短时占用与持续异常
  • 业务量没增长却持续跑满时不怀疑死循环与重试逻辑,直接重启掩盖了根因
  • 杀毒扫描、索引与备份常在后台吃掉大量 CPU,未核对计划任务就归因到业务代码

数据来源与参考

  • Microsoft Learn:Get-Process
  • Microsoft Learn:性能监视器概述

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌