微调 Get-Counter 脚本以加快执行速度

Posted

技术标签:

【中文标题】微调 Get-Counter 脚本以加快执行速度【英文标题】:Fine-tuning Get-Counter script for quicker execution 【发布时间】:2014-08-18 03:22:51 【问题描述】:

下面是我获取单个 w3wp.exe 应用程序池的进程利用率的脚本,问题是每次迭代大约需要 2 秒,大约有 25 个应用程序池。您能否帮我微调以下脚本以加快执行速度。

    gwmi win32_process -filter 'name="w3wp.exe"' | % 
    $name=$_.name
    $cmd = $pattern.Match($_.commandline).Groups[1].Value
    $procid = $_.ProcessId
    $tmp = (Get-Counter "\Process(*)\ID Process").CounterSamples | Where-Object       $_.CookedValue -eq $procid | select -expand Path
    $calc = [regex]::match($tmp,'\(([^\)]+)\)').Groups[1].Value
    $cooked = (Get-Counter "\Process($calc)\% Processor Time").CounterSamples | Where-Object $_.InstanceName -notlike '_total' | select -expand CookedValue
    $cpuper = [Math]::Round( ($cooked/2), 0)
    echo $cpuper
    

【问题讨论】:

【参考方案1】:

看起来Get-Counter 的最小采样时间为 1 秒。导致每次调用的最短执行时间为 1 秒。最好的办法是把所有的计数器放在前面,然后寻找你感兴趣的计数器。

这与您正在做的事情类似。它在表格中打印进程 ID 和 % 处理器时间。

$proc = 'w3wp'
$samples = get-counter '\Process($proc*)\ID Process', '\Process($proc*)\% Processor Time' | select -expand countersamples 
$samples | group  Split-Path $_.Path  | ft @ N='ID'; E=$_.Group[0].CookedValue , @ N='% Processor'; E=[Math]::Round($_.Group[1].CookedValue/2, 0) 

【讨论】:

很棒的麦克,。非常感谢,它确实帮助我将 get-counter 的东西移出了循环,。从 58 秒到.. TotalSeconds : 2.5210095 TotalMilliseconds : 2521.0095

以上是关于微调 Get-Counter 脚本以加快执行速度的主要内容,如果未能解决你的问题,请参考以下文章

我可以告诉 Perl 一些数据是不可变的以加快速度吗?

如何加快这个 PHP 脚本的执行速度

在 Python 脚本中同时使用多处理和多线程来加快执行速度

如何修改Smith和Waterman perl脚本以加快速度?

无法使用 concurrent.futures 加速脚本的执行过程

如果有一种方法可以预先计算 SQL 视图以加快查询速度?