Sql server 如何使用PowerShell监控进程的CPU利用率?

Sql server 如何使用PowerShell监控进程的CPU利用率?,sql-server,powershell,wmi,Sql Server,Powershell,Wmi,我正在尝试编写PowerShell脚本以监视SQL Server进程的%CPU利用率。我想每天记录这个数字的快照,这样我们就可以随着时间的推移监控它并观察趋势 我的在线研究表明,此WMI查询应能满足我的需求: Get-WmiObject -Query "SELECT PercentProcessorTime FROM win32_PerfFormattedData_PerfProc_Process WHERE Name='SqlServr'" 当我运行WMI查询时,我通常会得到一个介于30-5

我正在尝试编写PowerShell脚本以监视SQL Server进程的%CPU利用率。我想每天记录这个数字的快照,这样我们就可以随着时间的推移监控它并观察趋势

我的在线研究表明,此WMI查询应能满足我的需求:

Get-WmiObject -Query "SELECT PercentProcessorTime FROM win32_PerfFormattedData_PerfProc_Process WHERE Name='SqlServr'"
当我运行WMI查询时,我通常会得到一个介于30-50%之间的值

然而,当我在ResourceMonitor中查看进程时,它的平均CPU使用率通常不到1%

我知道WMI查询只是返回CPU使用情况的快照,而不是很长一段时间内的平均值,因此我知道这两种情况无法直接比较。即使如此,我认为快照通常应该小于1%,因为资源监视器的平均值小于1%


有人知道为什么会有如此大的差异吗?以及如何获得进程CPU使用率的准确测量值?

您是否尝试过
获取计数器

PS PS:\> Get-Counter "\Processus(iexplor*)\% temps processeur"

Timestamp                 CounterSamples
---------                 --------------
17/07/2012 22:39:25       \\jpbhpp2\processus(iexplore#8)\% temps processeur :
                          1,5568026751287

                          \\jpbhpp2\processus(iexplore#7)\% temps processeur :
                          4,6704080253861

                          \\jpbhpp2\processus(iexplore#6)\% temps processeur :
                          0

                          \\jpbhpp2\processus(iexplore#5)\% temps processeur :
                          4,6704080253861

                          \\jpbhpp2\processus(iexplore#4)\% temps processeur :
                          0

                          \\jpbhpp2\processus(iexplore#3)\% temps processeur :
                          0

                          \\jpbhpp2\processus(iexplore#2)\% temps processeur :
                          0

                          \\jpbhpp2\processus(iexplore#1)\% temps processeur :
                          1,5568026751287

                          \\jpbhpp2\processus(iexplore)\% temps processeur :
                          0
请注意,这取决于您的区域设置测试:

PS PS:\> Get-Counter -ListSet * | where {$_.CounterSetName -contains "processus"}

你的假设几乎是正确的。单个线程(并且一个进程始终至少有一个线程)最多可以有100%的时间用于
PercentProcessorTime
,但是:

  • 一个进程可以有多个线程
  • 一个系统可以有多个(逻辑)CPU核
因此,在这里(启用超线程的Intel i7 CPU),我有8个逻辑核,前20个线程(过滤掉总数)显示(稍微整理一下以使其可读):

PS>gwmi Win32_performatteddata_PerfProc_Thread| ?{$\名称-不匹配'\总计'}} 排序百分比处理时间-描述| 选择-前20 | ft-自动名称、IDProcess、IDThread、PercentProcessorTime 名称IDProcess IDThread PercentProcessorTime ---- --------- -------- -------------------- 空闲/6 0 100 空转/30100 空闲/5 0 100 空闲/1 0 100 空转/7096 怠速/4 0 96 空闲/0 86 空转/2068 WmiPrvSE/7#1 7420 6548 43 dwm/4 2260 6776 7 mstsc/2#13444 2416 3 powershell/7#2 6352 6552 0 conhost/0#2 6360 6368 0 powershell/5#2 6352 6416 0 powershell/6#2 6352 6420 0 iexplore/7#14560 3300 Foxit阅读器/1736 5304 0 Foxit阅读器/2 736 6252 0 conhost/1#2 6360 1508 0 Foxit阅读器/0 736 6164 0 在最后一列中,所有这些加起来应该是800左右

但是注意这是整数的四舍五入。在几个进程上与Process Explorer的CPU列进行比较(当选择了View | Show Fractive CPU时,CPU列不会四舍五入)。注意,与win32_PerfFormattedData_PerfProc_Process非常相似,核心计数的百分比值是标准化的(这只是显示的一部分):

许多流程使用了几十万个周期,但还不足以达到一个百分点


在过去几天中,我了解到的有关WMI和性能计数器的所有信息

WMI代表Windows Management Instrumentation。WMI是在WMI系统和Windows COM子系统中注册的类的集合。这些类称为提供程序,具有任意数量的公共属性,在查询时返回动态数据

Windows预装了大量WMI提供程序,可为您提供有关Windows环境的信息。对于这个问题,我们关心的是和基于它构建的两个包装器

如果直接查询任何Win32_PerfRawData*提供程序,您会注意到它返回的数字看起来很吓人。这是因为这些提供者提供了原始数据,您可以使用这些数据来计算所需的任何内容

为了更方便地使用Win32_PerfRawData*提供程序,Microsoft提供了两个在查询时返回更好答案的包装器:PerfMon和Win32_PerfFormattedData*提供程序

好的,那么我们如何获得进程的%CPU利用率呢?我们有三个选择:

  • 从Win32\u PerfFormattedData\u PerfProc\u进程提供程序获取格式良好的数字
  • 从PerfMon获取格式良好的数字
  • 使用Win32_PerfRawData_PerfProc_进程计算我们的CPU利用率百分比
  • 我们将看到选项1有一个bug,因此它不能在所有情况下都工作,即使这是通常在互联网上给出的答案

    如果要从Win32_PerfFormattedData_PerfProc_进程获取此值,可以使用问题中提到的查询。这将为您提供此进程所有线程的PercentProcessorTime值之和。问题是,如果有多个核心,那么这个总和可以>100,但这个属性的最大值为100。因此,只要这个进程的线程总数小于100,就可以通过将进程的PercentProcessorTime属性除以机器的核心计数得到答案

    如果要从PowerShell中的PerfMon获取此值,可以使用
    get Counter“\Process(SqlServr)\%Processor Time”
    。这将返回一个介于0-(CoreCount*100)之间的数字

    如果要自己计算此值,Win32_PerfRawData_PerfProc_进程提供程序上的PercentProcessorTime属性将返回此进程使用的CPU时间。所以,你需要拍两张快照,我们称之为s1和s2。然后,我们将执行(s2.5%)操作- PS > gwmi Win32_PerfFormattedData_PerfProc_Thread | ?{$_.Name -notmatch '_Total'} | sort PercentProcessorTime -desc | select -first 20 | ft -auto Name,IDProcess,IDThread,PercentProcessorTime Name IDProcess IDThread PercentProcessorTime ---- --------- -------- -------------------- Idle/6 0 0 100 Idle/3 0 0 100 Idle/5 0 0 100 Idle/1 0 0 100 Idle/7 0 0 96 Idle/4 0 0 96 Idle/0 0 0 86 Idle/2 0 0 68 WmiPrvSE/7#1 7420 6548 43 dwm/4 2260 6776 7 mstsc/2#1 3444 2416 3 powershell/7#2 6352 6552 0 conhost/0#2 6360 6368 0 powershell/5#2 6352 6416 0 powershell/6#2 6352 6420 0 iexplore/7#1 4560 3300 0 Foxit Reader/1 736 5304 0 Foxit Reader/2 736 6252 0 conhost/1#2 6360 1508 0 Foxit Reader/0 736 6164 0