63 lines
1.9 KiB
PowerShell
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;
|
|
} |