ps/Modules/Alkami.PowerShell.Common/Public/Get-CPUUsage.ps1
2023-05-30 22:51:22 -07:00

63 lines
1.9 KiB
PowerShell

function Get-CPUUsage {
<#
.SYNOPSIS
Returns the current CPU utilization of the CPU, or of individual services.
.PARAMETER serviceName
A string array of service names to query for CPU utilization.
Pass in service names, or "*" for the total CPU usage.
Results are returned in the same order that they are passed in.
.PARAMETER numSamples
The number of CPU samples to query for.
.PARAMETER interval
The time interval between CPU samples in seconds.
#>
[CmdletBinding()]
param(
[Parameter(Mandatory = $false)]
[string[]]$serviceName = @("*"),
[Parameter(Mandatory = $false)]
[int]$numSamples = 1,
[Parameter(Mandatory = $false)]
[int]$interval = 1
)
$queries = @();
foreach($name in $serviceName) {
if($name -eq "*") {
$queries += "\Processor(_Total)\% Processor Time";
} else {
$queries += "\Process($name)\% Processor Time";
}
}
$samples = Get-Counter -Counter $queries -MaxSamples $numSamples -SampleInterval $interval;
# Set all counter sums to 0.
$sums = New-Object int[] $queries.Count;
for($i = 0; $i -lt $queries.Count; $i++) {
$sums[$i] = 0;
}
# Sum all of the CPU usage values, for each counter query.
foreach($sample in $samples) {
for($i = 0; $i -lt $queries.Count; $i++) {
$sums[$i] += $sample.CounterSamples[$i].CookedValue;
}
}
# Divide usage by number of samples to get average.
for($i = 0; $i -lt $queries.Count; $i++) {
$average = $sums[$i] / $numSamples;
# Clamp the CPU usage between 0-100 just in case.
$average = [Math]::Min(100, $average);
$average = [Math]::Max(0, $average);
# Store the average back out to sums in the name of re-use.
$sums[$i] = $average
}
return $sums;
}