两种口径怎么选
定位 CPU 占用高的进程有两种口径:按累计 CPU 时间排序,找出长期消耗大户;或用两次采样做差值,算出这段时间里真正在忙的进程。累计值高不代表此刻忙,而此刻最忙的进程累计值可能很小,两种口径要配合使用。
差值法为什么更准
Get-Process 的 CPU 属性是进程自启动以来消耗的处理器时间总和,多核机器上还会超过墙钟时间。间隔若干秒取两次快照做差,再除以间隔秒数,就能估算这段时间内占用的核数,比单看累计秒数更贴近用户体感。
基本信息
| 适用平台 | Windows 8 / Server 2012 及以后(CPU 属性需较新的 .NET 环境) |
|---|---|
| 语法 | Get-Process | Sort-Object CPU -Descending | Select-Object -First 10 |
| 采样法 | 先取一次快照,等待若干秒后再取一次,对相同 PID 求差 |
| 辅助工具 | Get-Counter 采集处理器时间百分比;任务管理器与性能监视器看实时视图 |
典型使用场景
- 服务器变慢时快速找出吃 CPU 的进程
- 排查应用多开导致的整体占用偏高
- 发布前后对比 CPU 消耗,评估版本是否引入性能退化
- 定位计划任务或杀软扫描造成的周期性占用
- 判断是单进程吃满一核还是多进程均衡占用
常用示例
常用示例
Get-Process | Sort-Object CPU -Descending | Select-Object -First 10 Name, Id, CPU # 累计 CPU 秒数排行
# 采样差值:算这段时间内实际消耗
$s1 = Get-Process | Select-Object Id, CPU
Start-Sleep 10
$s2 = Get-Process | Select-Object Id, CPU
$s1 | ForEach-Object { $p1 = $_; $p2 = $s2 | Where-Object Id -eq $p1.Id; if ($p2) { [pscustomobject]@{ Id = $p1.Id; Delta = [math]::Round($p2.CPU - $p1.CPU, 1) } } } | Sort-Object Delta -Descending | Select-Object -First 10指标读法
| 指标 | 含义 | 判读 |
|---|---|---|
| CPU(列) | 进程累计处理器时间(秒) | 高值说明长期消耗,不代表此刻忙 |
| Delta | 采样区间内新增 CPU 秒数 | 除以采样秒数即近似占用的核数 |
| 处理器时间百分比 | Get-Counter 采集的整体利用率 | 判断整机是否真的吃紧 |
| 多核场景 | 累计秒数可超过墙钟时间 | 需除以逻辑处理器数理解百分比 |
| 短命进程 | 快照可能抓不到 | 需持续采样工具才能捕捉 |
图形化查看用任务管理器或性能监视器;需要脚本化与留档时,采样差值法比人工观察更可靠。
多核机器上累计秒数不能直接换算百分比:差值除以采样秒数得到占用核数,再除以逻辑处理器数才是整体利用率。