关于Windows:跟踪每个进程的CPU和内存使用情况

Tracking CPU and Memory usage per process

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

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

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


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

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

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


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


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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@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.

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

绩效对象:过程
选中"从列表中选择实例",然后选择Firefox。


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

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


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

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

1.检索逻辑进程总数

1
select NumberOfLogicalProcessors from Win32_ComputerSystem

2.要检索PercentProcessorTime的值,请使用至少2次TimeStamp_Sys100NS(已应用CPU利用率公式来获取实际利用率百分比)和WorkingSetPrivate(RAM)(睡眠间隔为1秒)

1
select * from Win32_PerfRawData_PerfProc_Process where IDProcess=1234

3.应用CPU%利用率公式

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

p2指示第二次检索到的PercentProcessorTime,p1指示第一次检索到的PercentProcessorTime,t2和t1用于TimeStamp_Sys100NS。

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

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


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

网站说明:

ProcDump is a command-line utility whose primary purpose is monitoring an application for CPU spikes and generating crash dumps during a spike that an administrator or developer can use to determine the cause of the spike. ProcDump also includes hung window monitoring (using the same definition of a window hang that Windows and Task Manager use), unhandled exception monitoring and can generate dumps based on the values of system performance counters. It also can serve as a general process dump utility that you can embed in other scripts.


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

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

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


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

这是Windows Search Service的示例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  $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
  }

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

Windows 10 Cumulative CPU time

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


您可能想看看Process Lasso。


Perfmon.exe内置在Windows中。


嗯,尽管它的图形不太方便,但我看到Process Explorer可以做到。仍在寻找替代/更好的方法来做到这一点。


我将taskinfo用于CPU / RAM / IO速度的历史记录图。
http://www.iarsn.com/taskinfo.html

但由于HD / SS驱动器故障,听起来一阵无反应,听起来更像是中断时间。


推荐阅读

    查询linux内存命令?

    查询linux内存命令?,系统,情况,信息,工具,电脑,状态,命令,内存,发行,总量,查

    linux命令进程状态?

    linux命令进程状态?,系统,状态,进程,命令,数据,管理,软件,名称,信息,参数,Lin

    linux查看命令行进程?

    linux查看命令行进程?,系统,软件,信息,状态,进程,名称,实时,命令,数据,电脑,

    监视进程命令linux?

    监视进程命令linux?,系统,状态,工作,地址,信息,进程,软件,命令,数据,实时,如

    linux结束进程命令?

    linux结束进程命令?,系统,软件,管理,进程,名称,数据,单位,状态,数字,代码,Lin

    linux修改内存命令?

    linux修改内存命令?,系统,信息,标准,工具,数据,在线,内存,命令,分区,大小,Lin

    linux杀进程命令图片?

    linux杀进程命令图片?,系统,工具,图片,进程,管理,名称,传播,工作,命令,后台,L

    linux历史命令内存?

    linux历史命令内存?,系统,情况,信息,数据,命令,内存,文件,磁盘,历史,内容,Lin

    linux怎么看内存命令?

    linux怎么看内存命令?,系统,情况,信息,命令,内存,工具,发行,数据,表示,内容,l

    linux历史命令内存?

    linux历史命令内存?,系统,情况,信息,数据,命令,内存,文件,磁盘,历史,内容,Lin

    linux查内存空间命令?

    linux查内存空间命令?,系统,情况,信息,数据,内存,工具,命令,表示,方法,内容,L

    linux命令查找进程?

    linux命令查找进程?,系统,名称,软件,状态,进程,电脑,信息,命令,材料,数据,怎

    linux命令校验进程?

    linux命令校验进程?,服务,系统,情况,状态,异常,进程,命令,管理,检测,平台,Lin

    linux中看栈内存命令?

    linux中看栈内存命令?,系统,情况,信息,地址,数据,分析,命令,内存,工具,环境,l

    linux周期执行命令?

    linux周期执行命令?,工作,系统,周期,地址,命令,工具,信息,时间,任务,目录,lin

    linux中终止进程命令?

    linux中终止进程命令?,系统,进程,信息,管理,命令,代码,传播,状态,名称,数字,l

    linux关闭子进程命令?

    linux关闭子进程命令?,系统,进程,名称,软件,管理,传播,命令,信息,状态,数字,l

    linux进程运行命令?

    linux进程运行命令?,系统,工作,状态,地址,信息,进程,基础,命令,管理,软件,lin

    进程管理linux命令?

    进程管理linux命令?,系统,管理,地址,状态,情况,简介,工具,网络,分析,软件,lin

    linux活动内存命令?

    linux活动内存命令?,系统,情况,信息,命令,地方,地址,电脑,工具,位置,单位,详