返回

持续监控CPU使用率:快速定位性能瓶颈

windows

持续监控 CPU 使用率:揪出资源占用大户

开发者经常需要监控系统中 CPU 使用率最高的进程,以便识别性能瓶颈或资源滥用。 想要持续监控 CPU 使用情况,尤其是排名前 X 的高资源消耗进程?这里有一些实用技巧分享给你。

问题获取 CPU 占用大户信息

我们需要一个方法,可以每隔一段时间(例如 5 秒)就记录 CPU 占用率最高的几个进程的信息到日志文件中。这有助于我们分析测试过程中 CPU 的使用情况,快速定位资源瓶颈。

PowerShell 方案改进:精准获取进程信息

有人提出使用 PowerShell 的 Get-Counter 命令来实现。虽然这个思路不错,但原始方案存在一些问题,比如偶尔出现的无效数据错误,以及无法获取完整的进程名称。 让我们来改进一下!

# 设置要监控的进程数量
$TopX = 5
# 设置刷新间隔(秒)
$Interval = 5

while ($true) {
    try {
        $cpu = Get-Counter -ComputerName localhost '\Process(*)\% Processor Time' `
            | Select-Object -ExpandProperty countersamples `
            | Where-Object {$_.InstanceName -notlike '_total' -and $_.InstanceName -notlike 'idle' } `
            | Select-Object -Property InstanceName, CookedValue `
            | Sort-Object -Property CookedValue -Descending `
            | Select-Object -First $TopX


        # 获取完整的进程名称和路径
        $fullProcessInfo = foreach ($process in $cpu) {
            try {
                $processObject = Get-Process -Name $process.InstanceName | Select-Object -First 1  # 选择第一个匹配的进程
                if ($processObject) {
                    [PSCustomObject]@{
                        Date = Get-Date
                        ProcessName = $processObject.Path
                        CPU = (($process.CookedValue / 100) / (Get-WmiObject Win32_ComputerSystem).NumberOfLogicalProcessors).ToString('P')
                    }
                }
            }
            catch {
                Write-Warning "无法获取进程 '$($process.instancename)' 的完整信息。"
            }
        }

        $fullProcessInfo | Format-Table -AutoSize | Out-File -Append -FilePath "cpu_log.txt"


        Start-Sleep -Seconds $Interval
    }
    catch {
        Write-Warning "获取 CPU 数据时出错:$($_.Exception.Message)"
        Start-Sleep -Seconds $Interval  # 即使出错也继续循环,避免脚本终止
    }
}


操作步骤:

  1. 将代码保存为 .ps1 文件(例如 monitor_cpu.ps1)。
  2. 以管理员权限运行 PowerShell。
  3. 导航到脚本所在的目录,执行 .\monitor_cpu.ps1

改进说明:

  • 使用 try...catch 块来处理潜在的错误,例如 Get-Counter 返回无效数据或 Get-Process 找不到进程。即使出现错误,脚本也能继续运行。
  • 使用 Get-Process 获取完整的进程路径,避免只显示进程名缩写带来的困扰。
  • 通过 Format-Table -AutoSize 使输出更美观。
  • 使用 Out-File -Append 将结果追加到日志文件 cpu_log.txt 中。
  • 可自定义 $TopX$Interval 变量来调整监控的进程数量和刷新间隔。

跨平台方案:top 命令及其变种

如果你需要一个更通用的跨平台解决方案,top 命令是一个不错的选择。它在 Linux、macOS 和 Windows(通过 WSL 或 Cygwin)上都可用。

Linux/macOS:

while true; do
    top -bn1 -o '%Cpu' | head -n 11 | tail -n +8 >> cpu_log.txt # 获取前5个进程(包含标题行)
    sleep 5
done

Windows (WSL/Cygwin):

在 WSL 或 Cygwin 环境下,可以使用类似 Linux/macOS 的命令。

操作步骤:

  1. 打开终端或命令行窗口。
  2. 执行上述命令。 该命令会每 5 秒将 CPU 占用率最高进程的信息追加到 cpu_log.txt 文件中。

命令解释:

  • top -bn1: 以批处理模式运行 top,只输出一次结果。
  • -o '%Cpu': 按 CPU 使用率排序。
  • head -n 11: 获取前 11 行(包括标题和其他信息)。
  • tail -n +8: 从第 8 行开始显示,去除标题行等无关信息,只保留前 5 个进程信息。
  • >> cpu_log.txt: 将结果追加到日志文件。
  • sleep 5: 暂停 5 秒。

安全性建议

  • 运行这些脚本需要一定的权限,请谨慎操作。
  • 注意日志文件的大小,定期清理,避免磁盘空间被占满。

其他监控工具

市面上有很多专业的监控工具,例如 Prometheus、Grafana、Datadog 等,它们提供了更丰富的功能和可视化界面,可以更全面地监控系统性能。

总结

以上方法可以帮助你有效监控 CPU 使用率。你还有其他更好的建议吗? 这个方法对你有帮助吗? 希望这些技巧可以提升你的工作效率。

相关资源