forked from ERGeorgiev/windows-utilities
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPerformanceMonitor.ps1
More file actions
67 lines (59 loc) · 1.85 KB
/
PerformanceMonitor.ps1
File metadata and controls
67 lines (59 loc) · 1.85 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#Requires -Version 7
$previousProcesses = @{}
$initialized = $false
$period = 5
Write-Host "Performance Monitor" -BackgroundColor White -ForegroundColor Black
Write-Host "Every $period second(s), any started/stopped or high usage processes will be logged here."
$cpuThreads = (Get-CimInstance -ClassName Win32_Processor).NumberOfLogicalProcessors
$cpuSecondsPerDelay = $cpuThreads * $period
$cpuUsagePercentageThreshold = 5
Do
{
$date = Get-Date
$allProcesses = Get-Process
# Combine same process names into the same value
$currentProcesses = @{}
Foreach ($p in $allProcesses) {
if ($currentProcesses.Keys -contains $p.Name) {
$currentProcesses[$p.Name] += $p.CPU
}
else {
$currentProcesses[$p.Name] = $p.CPU
}
}
# Get any stopped processes
Foreach ($p in $previousProcesses.GetEnumerator()) {
$name = $p.Key
if (($currentProcesses.Keys -contains $name) -eq $false) {
Write-Host "[$date] Process Stopped: $name" -ForegroundColor Red
}
}
# Get any outliers and started processes
$spikingProcesses = @{}
Foreach ($p in $currentProcesses.GetEnumerator()) {
$name = $p.Key
$current = $currentProcesses[$name]
if ($previousProcesses.Keys -contains $name) {
$change = $current - $previousProcesses[$name]
$usage = ($change / $cpuSecondsPerDelay) * 100
if ($usage -gt $cpuUsagePercentageThreshold) {
$usage = [Math]::Min($usage, 100)
$spikingProcesses[$name] = [Int]$usage
}
}
else {
if ($initialized) {
Write-Host "[$date] Process Started: $name" -ForegroundColor Green
}
}
}
# Print outliers
Foreach ($p in $spikingProcesses.GetEnumerator()) {
$name = $p.Key
$usage = $p.Value
Write-Host "[$date] High CPU Usage: $name ($usage%)"
}
$previousProcesses = $currentProcesses
$initialized = $true
Start-Sleep $period
} While ($true)