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


163

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

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

我正在寻找现成的工具或编程方式来实现这一目标。

Answers:


167

只需要输入perfmonStart > Run,然后按回车。当“性能”窗口打开时,单击“ +”号将新的计数器添加到图形中。计数器是PC工作方式的不同方面,并按相似性分为称为“性能对象”的组。

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

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


1
在计数器日志中获取数据样本的理想间隔是多少?
Steph Rose

8
自您编写此代码以来,MS显然已将UI更改为PerformanceMonitor。您知道如何在Windows 2008 R2中执行此操作吗?
马丁·布朗

5
@MartinBrown-找到了这个。太好了
JNF 2012年

2
有谁知道该怎么做保存Vista的日志的第二部分?似乎在任何地方都没有“性能日志和警报”
Xitcod13

11
右键单击“数据收集器集”->“用户定义”。选择“新建”->“数据收集器集”。给它起一个名字,然后选择“手动创建”。点击下一步。选择性能计数器。点击下一步。添加性能计数器并输入采样间隔。然后,在“数据收集器集”下,右键单击您的集,然后单击“开始”。一段时间后,右键单击您的设置,然后单击“停止”。然后,您可以在报告->用户定义->您的设置下找到报告。右键单击图形,然后选择“将数据另存为”。
2013年

43

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


3
因此,您将如何使用它来查找一个进程,该进程在短时间内突然开始使用更多的内存或处理器功能。你能详细说明吗?
Xitcod13

右键单击列标题,选择“选择列”,然后在“过程性能”下检查“ CPU历史记录”
Laurent

您可以将其重置为零吗?
Simon_Weaver

我可以登录给定PID的内存消耗文件吗?
罗伊

只是想向其他用户指出:每个进程的CPU图形仅在您第一次打开它之后才开始记录,即使Process Explorer是打开的,因此该方法对于捕获偶发事件并尝试隔离它几乎没有用。到一个过程。我要指出的是,如果您单击全局系统CPU图(在打开Process Explorer时开始记录),并将鼠标悬停在任何点上,它将显示该点上使用CPU最多的进程。
SUM1

19

使用perfmon.exe,我尝试使用“进程”计数器下的“专用字节”计数器来跟踪内存使用情况,并且效果很好。


1
这是正确的答案。您还可以在“进程”下获取CPU信息。单击“处理”,然后在所选对象的实例下选择您的应用程序(在示例中为Firefox)。
克里斯·麦考文

11

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

@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.

7

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

性能对象:处理选中“从列表中选择实例”,然后选择Firefox。


1
谢谢。如何查看预定义时间(例如一个小时)内的CPU使用历史?
Eli Bendersky

6

WMI是Windows Management Instrumentation,它内置于Windows的所有最新版本中。它允许您以编程方式跟踪诸如CPU使用率,磁盘I / O和内存使用率之类的信息。

Perfmon.exe是此接口的GUI前端,可以监视进程,将信息写入日志,并允许您在事后分析日志。它不是世界上最优雅的程序,但确实可以完成工作。


5
从技术上讲,perfmon是基础Windows Performance Counter API的接口,该接口比WMI早了很多年。WMI还在其名称空间内公开了性能计数器API。
Rob Walker

2

Process Lasso的设计更多地用于过程自动化和优先级优化,而不是图形。这就是说,它确实提供每个进程的CPU占用率的历史(画成白线图),但它确实提供每个进程的内存使用率的历史。

免责声明:我是Process Lasso的作者,但实际上并没有在这里认可它-因为有更好的解决方案(perfmon是最好的)。

最好的东西是Windows Vista +资源和性能监视器。它可以跟踪进程随时间推移对CPU,内存,网络和磁盘访问的使用情况。它是一个很不错的总体系统信息实用程序,应该早就创建了。除非我没有记错,否则它可以随时间跟踪每个进程的CPU和内存使用率(以及列出的其他内容)。


2

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

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

1.检索逻辑进程总数

select NumberOfLogicalProcessors from Win32_ComputerSystem

2.要检索PercentProcessorTime的值,请使用至少2次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查询的编程语言


WMI和Powershell?
PreguntonCojoneroCabrón

2

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

网站说明:

ProcDump是一个命令行实用程序,其主要目的是监视应用程序中的CPU尖峰并在尖峰期间生成崩溃转储,管理员或开发人员可以使用它来确定尖峰原因。ProcDump还包括挂起的窗口监视(使用Windows和Task Manager使用的相同的窗口挂起定义),未处理的异常监视,并且可以基于系统性能计数器的值生成转储。它也可以用作常规流程转储实用程序,您可以将其嵌入其他脚本中。





1

在Windows 10下,任务管理器可以为您显示累计CPU小时。只需转到“应用程序历史记录”标签和“删除使用情况历史记录”即可。现在,让程序运行一两个小时:

Windows 10累积CPU时间

这不做的是按选项卡细分浏览器中的使用情况。通常,不活动的选项卡会做大量的工作,每个打开的选项卡都会消耗能量并降低PC的速度。


1

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

这是Windows Search Service的示例。

  $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
  }

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.