我怀疑我的一个应用程序占用的 CPU 周期比我想要的要多。问题是 - 它会突然发生,仅仅查看任务管理器对我没有帮助,因为它只显示即时使用。
有没有办法(在 Windows 上)跟踪某些进程的 CPU 和内存使用历史记录。例如,我将开始跟踪“firefox”,大约一个小时后将看到该小时内其 CPU 和内存使用情况的图表。
我正在寻找现成的工具或编程方式来实现这一目标。
我怀疑我的一个应用程序占用的 CPU 周期比我想要的要多。问题是 - 它会突然发生,仅仅查看任务管理器对我没有帮助,因为它只显示即时使用。
有没有办法(在 Windows 上)跟踪某些进程的 CPU 和内存使用历史记录。例如,我将开始跟踪“firefox”,大约一个小时后将看到该小时内其 CPU 和内存使用情况的图表。
我正在寻找现成的工具或编程方式来实现这一目标。
只需输入perfmon
并按Start > Run
回车键。当 Performance 窗口打开时,单击 + 号以将新计数器添加到图表中。计数器是您的 PC 工作方式的不同方面,并按相似性分组到称为“性能对象”的组中。
对于您的问题,您可以选择“进程”、“内存”和“处理器”性能对象。然后您可以实时查看这些计数器
您还可以指定实用程序来保存性能数据以供以后检查。为此,请在左侧面板中选择“性能日志和警报”。(它就在为我们提供上述计数器的系统监视器控制台下方。如果没有,请单击“文件”>“添加/删除管理单元”,单击“添加”并在列表中选择“性能日志和警报” ".) 从“Performance Logs and Alerts”中,在“Counter Logs”下创建一个新的监控配置。然后您可以添加计数器、指定采样率、日志格式(二进制或纯文本)和日志位置。
Process Explorer可以显示一个进程占用的总 CPU 时间,以及每个进程的历史图表。
使用 perfmon.exe,我尝试使用“进程”计数器下的“私有字节”计数器来跟踪内存使用情况,并且效果很好。
也许你可以使用这个。它应该适合您,并将报告指定进程的处理器时间。
@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 前端,可以监视进程,将信息写入日志,并允许您在事后分析日志。它不是世界上最优雅的程序,但它确实完成了工作。
Process Lasso 更多地是为流程自动化和优先级优化而设计的,而不是图表。也就是说,它确实提供了每个进程的 CPU 使用历史记录(在图表上绘制为白线),但它不提供每个进程的内存使用历史记录。
免责声明:我是 Process Lasso 的作者,但实际上并没有在这里认可它——因为有更好的解决方案(perfmon 是最好的)。
有史以来最好的东西是 Windows Vista+ 资源和性能监视器。它可以随时间跟踪进程对 CPU、内存、网络和磁盘访问的使用情况。它是一个伟大的整体系统信息实用程序,早就应该创建。除非我弄错了,否则它可以随时间跟踪每个进程的 CPU 和内存利用率(在列出的其他内容中)。
虽然我还没有尝试过,但 ProcDump似乎是一个更好的解决方案。
来自网站的描述:
ProcDump 是一个命令行实用程序,其主要目的是监视应用程序的 CPU 峰值并在峰值期间生成崩溃转储,管理员或开发人员可以使用这些转储来确定峰值的原因。ProcDump 还包括挂起的窗口监控(使用与 Windows 和任务管理器相同的窗口挂起定义)、未处理的异常监控,并且可以根据系统性能计数器的值生成转储。它还可以用作通用的进程转储实用程序,您可以将其嵌入到其他脚本中。
您也可以尝试使用 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。
此逻辑适用于所有支持 WMI 查询的编程语言
需要获取某些特定 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
}
嗯,我看到Process Explorer可以做到,虽然它的图表不太方便。仍在寻找替代/更好的方法来做到这一点。
Perfmon.exe 内置在 Windows 中。
您可能想看看Process Lasso。
我使用 taskinfo 作为 CPU/RAM/IO 速度的历史图表。 http://www.iarsn.com/taskinfo.html
但是突发的无响应,听起来更像是由于 HD/SS 驱动器故障造成的中断时间。
下载过程监视器
启动进程监视器
如果需要,设置过滤器
进入菜单选项 > 分析事件
单击“生成线程分析事件”,选择频率,然后单击确定。
要随时查看收集的历史数据,请进入菜单工具 > 流程活动摘要