【问题标题】:Tracking CPU and Memory usage per process跟踪每个进程的 CPU 和内存使用情况
【发布时间】:2008-09-16 04:13:53
【问题描述】:

我怀疑我的某个应用程序占用的 CPU 周期超出了我的预期。问题是 - 它是突然发生的,仅仅查看任务管理器对我没有帮助,因为它只显示即时使用情况。

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

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

【问题讨论】:

    标签: windows sysadmin process-management


    【解决方案1】:

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

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

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

    【讨论】:

    • 在计数器日志中抓取数据样本的理想间隔是多少?
    • 自从您编写此代码后,MS 显然已将 UI 更改为 PerformanceMonitor。知道如何在 Windows 2008 R2 中执行此操作吗?
    • @MartinBrown - 找到this。太棒了。
    • 有人知道如何在 vista 上保存日志的第二部分吗?任何地方似乎都没有“性能日志和警报”
    • 右键单击数据收集器集->用户定义。选择新建->数据收集器集。为其命名并选择手动创建。点击下一步。选择性能计数器。点击下一步。添加性能计数器并输入采样间隔。然后在 Data Collector Sets 下,右键单击您的集合并单击“开始”。一段时间后,您右键单击您的设置并单击“停止”。然后您可以在 Reports->User Defined->Your set 下找到该报告。右键单击图表并选择将数据另存为。
    【解决方案2】:

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

    【讨论】:

    • 那么你将如何使用它来找到一个在短时间内随机开始使用更多内存或处理器能力的进程。你能详细说明一下吗?
    • 右击列标题,选择Select Columns,然后勾选“Process Performance”下的“CPU History”
    • 你能把它重置为零吗?
    • 我可以用给定 PID 的内存消耗登录到文件吗?
    • 只是想为其他用户指出:每个进程的CPU图只有在你第一次打开后才开始记录,即使进程资源管理器是打开的,所以这种方法实际上对捕获没有用一个零星的事件,并试图将其隔离到一个进程中。我要指出的是,如果您单击全局系统 CPU 图(在打开进程资源管理器时开始记录)并将鼠标悬停在任意点上,它将显示当时使用 CPU 最多的进程。
    【解决方案3】:

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

    【讨论】:

    • 这是正确答案。您还可以在 Process 下获取 CPU 信息。单击 Process,然后在所选对象的实例下选择您的应用程序(在您的示例中为 Firefox)。
    【解决方案4】:

    也许你可以使用它。它应该适合您,并且会报告指定进程的处理器时间。

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

      • 谢谢。如何查看预定义时间(例如一小时)内的 cpu 使用历史记录?
      【解决方案6】:

      WMI 是 Windows Management Instrumentation,它内置于所有最新版本的 Windows 中。它允许您以编程方式跟踪 CPU 使用情况、磁盘 I/O 和内存使用情况。

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

      【讨论】:

      • 从技术上讲,perfmon 是底层 Windows 性能计数器 API 的接口,它早于 WMI 多年。 WMI 还在其命名空间中公开了性能计数器 API。
      • 但是 perfmon 需要运行吗?还是 WMI 会在后台记录信息?
      【解决方案7】:

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

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

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

      【讨论】:

        【解决方案8】:

        您也可以尝试使用 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。

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

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

        【讨论】:

        • WMI 和 Powershell ?
        【解决方案9】:

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

        来自网站的描述:

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

        【讨论】:

          【解决方案10】:

          需要获取某些特定 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
            }
          

          【讨论】:

            【解决方案11】:

            嗯,我看到Process Explorer 可以做到,虽然它的图表不太方便。仍在寻找替代/更好的方法。

            【讨论】:

              【解决方案12】:

              Perfmon.exe 内置在 windows 中。

              【讨论】:

                【解决方案13】:

                您可能想看看Process Lasso

                【讨论】:

                  【解决方案14】:

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

                  但突发的无响应听起来更像是由于 HD/SS 驱动器故障造成的中断时间。

                  【讨论】:

                    【解决方案15】:

                    在 Windows 10 下,任务管理器可以显示累计 CPU 小时数。只需前往“应用历史记录”选项卡和“删除使用历史记录”即可。现在让事情运行一两个小时:

                    这不会按标签分解浏览器中的使用情况。通常不活动的标签会做大量的工作,每个打开的标签都会消耗能量并降低您的电脑速度。

                    【讨论】:

                      【解决方案16】:

                      下载process monitor

                      1. 启动进程监视器

                      2. 根据需要设置过滤器

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

                      4. 点击“生成线程分析事件”,选择频率,然后点击确定。

                      5. 要随时查看收集的历史数据,进入菜单工具>流程活动摘要

                      【讨论】:

                        猜你喜欢
                        • 2011-03-25
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2011-05-16
                        • 2013-01-14
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多