跟踪每个进程的 CPU 和内存使用情况

我怀疑我的一个应用程序消耗的 CPU 周期比我希望的要多。问题是——这种情况会突然发生,仅仅查看任务管理器对我没有帮助,因为它只显示了即时使用。

有没有办法(在 Windows 上)跟踪某些进程的 CPU 和内存使用历史记录。例如,我将开始跟踪“ firefox”,大约一个小时后,我将看到一个图表,显示这一小时内它的 CPU 和内存使用情况。

我正在寻找一个现成的工具或程序化的方式来实现这一点。

427467 次浏览

嗯,我看到 进程资源管理器可以做到这一点,虽然它的图表不太方便。仍在寻找其他/更好的方法来做到这一点。

Perfmon.exe 是内置在窗口中的。

Process Explorer 可以显示进程占用的总 CPU 时间,以及每个进程的历史图。

我同意,Perfmon.exe 允许您为您想要监视的任何进程添加计数器(右键单击右面板)。

性能对象: 过程 选中“从列表中选择实例”并选择 firefox。

WMI 是 Windows 管理规范的,它被内置在所有最新版本的 Windows 系统中。它允许您以编程方式跟踪 CPU 使用情况、磁盘 I/O 和内存使用情况。

Exe 是这个接口的 GUI 前端,可以监视进程,将信息写入日志,并允许您在事后分析日志。这不是世界上最优雅的程序,但它确实能完成任务。

你可能想看看 处理套索

Win + R,键入 perfmon,然后按 Enter。当 Performance 窗口打开时,单击 +标志向图中添加新的计数器。计数器是计算机工作方式的不同方面,它们按照相似性分组为称为“性能对象”的组。

对于您的问题,您可以选择“进程”、“内存”和“处理器”性能对象。然后您可以实时看到这些计数器

您还可以指定实用程序来保存性能数据,以便稍后进行检查。为此,请在左侧面板中选择“ Performance Logs and Alerts”。(它就在系统监视器控制台的正下方,系统监视器控制台为我们提供了上述计数器。如果没有,单击“文件”> “添加/删除管理单元”,单击“添加”并在列表中选择“性能日志和通知”。)从“性能日志和警报”中,在“计数器日志”下创建一个新的监视配置。然后可以添加计数器、指定采样率、日志格式(二进制或纯文本)和日志位置。

过程套索是为过程自动化和优先级优化而设计的,而不是图形。也就是说,它 是的提供了每个进程的 CPU 利用历史(在图上以白线表示) ,但是它确实提供了每个进程的内存利用历史。

免责声明: 我是过程套索的作者,但实际上我并不支持它在这里-因为有更好的解决方案(permon 是最好的)。

有史以来最好的东西是 WindowsVista + 资源和性能监视器。它可以跟踪 CPU、内存、网络和磁盘访问的使用情况。它是一个伟大的整体系统信息实用程序,早就应该创建了。除非我弄错了,否则它可以跟踪每个进程的 CPU 和内存利用率随时间的变化(以及列出的其他事项)。

使用 Perfmon.exe,我尝试使用“ Process”计数器下的“ Private Bytes”计数器跟踪内存使用情况,它工作得很好。

也许你可以使用这个。它应该为你工作,并将报告处理器时间为指定的进程。

@echo off
: Rich Kreider <rjk@techish.net>
: report processor time for given process until process exits (could be expanded to use a PID to be more
: precise)
: Depends:  typeperf
: Usage:  foo.cmd <processname>


set process=%~1
echo Press CTRL-C To Stop...
:begin
for /f "tokens=2 delims=," %%c in ('typeperf "\Process(%process%)\%% Processor Time" -si 1 -sc 1 ^| find /V "\\"') do (
if %%~c==-1 (
goto :end
) else (
echo %%~c%%
goto begin
)
)


:end
echo Process seems to have terminated.

虽然我还没有尝试过,但 ProcDump似乎是一个更好的解决方案。

工地简介:

ProcDump 是一个命令行实用程序,其主要用途是监视应用程序的 CPU 峰值,并在峰值期间生成崩溃转储,管理员或开发人员可以使用这些崩溃转储来确定峰值的原因。ProcDump 还包括挂起窗口监视(使用与 Windows 和任务管理器相同的窗口挂起定义)、未处理的异常监视,并且可以根据系统性能计数器的值生成转储。它还可以作为一个通用的进程转储实用程序,您可以将其嵌入到其他脚本中。

我使用 taskinfo 作为 CPU/RAM/IO 速度的历史图。 Http://www.iarsn.com/taskinfo.html

但是一阵阵的无反应,听起来更像是由于 HD/SS 驱动器的问题造成的中断时间。

您还可以尝试使用 C #/Perl/Java 脚本使用 WMI 命令获取利用率数据,下面是步骤。

我们需要执行2个 WMI 选择查询并应用 CPU% 利用率公式

1. 检索逻辑进程的总数

select NumberOfLogicalProcessors from Win32_ComputerSystem

2.为了检索 PercentProcessorTime 的值,TimeStamp _ Sys100NS (已应用 CPU 利用率公式得到实际利用率百分比)和 WorkingSetPrivate (RAM)最小2次,休眠间隔为1秒

select * from Win32_PerfRawData_PerfProc_Process where IDProcess=1234

3. 应用 CPU% 利用率公式

CPU%= ((p2-p1)/(t2-t1)*100)/NumberOfLogicalProcessors

P2表示第二次检索到的 PercentProcessorTime,p1表示第一次检索到的 PercentProcessorTime,t2和 t1表示 TimeStamp _ Sys100NS。

这方面的示例 Perl 代码可以在链接 http://www.craftedforeveryone.com/cpu-and-ram-utilization-of-an-application-using-perl-via-wmi/中找到

此逻辑适用于所有支持 WMI 查询的编程语言

在 Windows10下,任务管理器可以显示累计 CPU 时间。只需前往“应用程序历史”标签和“删除使用历史”。现在让东西运行一两个小时:

Windows 10 Cumulative CPU time

但是这样做并不能将浏览器中的使用情况按制表符进行分类。通常不活动的标签页会做大量的工作,每个打开的标签页都会消耗能量并使你的电脑变慢。

需要获取某些特定 Windows 服务器的状态和 CPU/内存使用情况。我用了下面的脚本:

这是 Windows 搜索服务的一个示例。

  $cpu = Get-WmiObject win32_processor
$search = get-service "WSearch"
if ($search.Status -eq 'Running')
{
$searchmem = Get-WmiObject Win32_Service -Filter "Name = 'WSearch'"
$searchid = $searchmem.ProcessID
$searchcpu1 = Get-WmiObject Win32_PerfRawData_PerfProc_Process | Where {$_.IDProcess -eq $searchid}
Start-Sleep -Seconds 1
$searchcpu2 = Get-WmiObject Win32_PerfRawData_PerfProc_Process | Where {$_.IDProcess -eq $searchid}
$searchp2p1 = $searchcpu2.PercentProcessorTime - $searchcpu1.PercentProcessorTime
$searcht2t1 = $searchcpu2.Timestamp_Sys100NS - $searchcpu1.Timestamp_Sys100NS
$searchcpu = [Math]::Round(($searchp2p1 / $searcht2t1 * 100) /$cpu.NumberOfLogicalProcessors, 1)
$searchmem = [Math]::Round($searchcpu1.WorkingSetPrivate / 1mb,1)
Write-Host 'Service is' $search.Status', Memory consumed: '$searchmem' MB, CPU Usage: '$searchcpu' %'
}


else
{
Write-Host Service is $search.Status -BackgroundColor Red
}

下载 过程监察器

  1. 启动过程监视器

  2. 如果需要,设置一个过滤器

  3. 输入菜单选项 > 分析事件

  4. 单击“生成线程命名事件”,选择频率,然后单击“确定”。

  5. 要随时查看收集的历史数据,请输入菜单 Tools > Process Activity Summary