Mar*_*ker 10 sql-server powershell wmi
我正在尝试编写PowerShell脚本来监视SQL Server进程的%CPU利用率.我想每天记录这个号码的快照,以便随着时间的推移监控它并观察趋势.
我在网上的研究表明,这个WMI查询应该给我我想要的东西:
Get-WmiObject -Query "SELECT PercentProcessorTime FROM win32_PerfFormattedData_PerfProc_Process WHERE Name='SqlServr'"
Run Code Online (Sandbox Code Playgroud)
当我运行WMI查询时,我通常会得到介于30-50%之间的值
但是,当我在资源监视器中查看进程时,通常平均CPU使用率不到1%
我知道WMI查询只是返回CPU使用率的快照,而不是很长一段时间内的平均值,因此我知道这两者不能直接比较.即便如此,我认为快照通常应该小于1%,因为资源监视器的平均值小于1%.
有没有人对为何存在如此大的差异有任何想法?以及如何准确测量过程的CPU使用率?
Mar*_*ker 12
我在过去几天里所学到的关于WMI和性能计数器的一切.
WMI代表Windows Management Instrumentation.WMI是在WMI系统和Windows COM子系统中注册的类的集合.这些类称为提供程序,具有任意数量的公共属性,可在查询时返回动态数据.
Windows预安装了大量WMI提供程序,可为您提供有关Windows环境的信息.对于这个问题,我们关注的是Win32_PerfRawData*提供程序以及构建它的两个包装器.
如果您直接查询任何Win32_PerfRawData*提供程序,您会注意到它返回的数字是可怕的.那是因为这些提供商提供了原始数据,您可以使用它来计算您想要的任何数据.
为了更容易使用Win32_PerfRawData*提供程序,Microsoft提供了两个包装器,在查询时返回更好的答案,PerfMon和Win32_PerfFormattedData*提供程序.
好的,那么我们如何获得进程的%CPU利用率?我们有三种选择:
我们将看到选项1存在一个错误,因此它在所有情况下都不起作用,即使这是通常在互联网上给出的答案.
如果要从Win32_PerfFormattedData_PerfProc_Process获取此值,可以使用问题中提到的查询.这将为您提供所有此进程的线程的PercentProcessorTime值的总和.问题是,如果有超过1个核心,此总和可以大于100但是此属性最大值为100.因此,只要所有此进程的线程之和小于100,您就可以通过划分进程来获得答案PercentProcessorTime属性由机器的核心计数.
如果您想在PowerShell中从PerfMon获取此值,则可以使用Get-Counter "\Process(SqlServr)\% Processor Time"
.这将返回0 - (CoreCount*100)之间的数字.
如果要自己计算此值,Win32_PerfRawData_PerfProc_Process提供程序上的PercentProcessorTime属性将返回此进程使用的CPU时间.所以,你需要拍两张我们称之为s1和s2的快照.然后我们将(s2.PercentProcessorTime - s1.PercentProcessorTime)/(s2.TimeStamp_Sys100NS - s1.TimeStamp_Sys100NS).
这是最后一句话.希望它能帮到你.
你的假设几乎是正确的.单个线程(并且进程总是至少有一个线程)最多只能有100%,PercentProcessorTime
但是:
因此这里(Intel i7 CPU上有超线程)我有8个逻辑核心,前20个线程(过滤总数)显示(稍微整理一下,使其可读):
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
所有这些都应该加起来为最后一列的800.
但请注意,这四舍五入到整数.与Process Explorer的CPU列(在选择View | Show Fractional CPU时不会舍入)比较几个进程.请注意,很像win32_PerfFormattedData_PerfProc_Process
百分比值是针对核心计数标准化的(这只是显示的一部分):
很多流程都使用了几十万个周期,但还不足以将轮数提高到一个百分点.
归档时间: |
|
查看次数: |
19472 次 |
最近记录: |