Performance Monitoring Windows
Outils et techniques de monitoring des performances Windows.
Outils Intégrés
OUTILS DE PERFORMANCE WINDOWS
══════════════════════════════════════════════════════════
Task Manager Monitoring temps réel rapide
Resource Monitor Détails CPU, mémoire, disque, réseau
Performance Monitor (perfmon) Compteurs détaillés, historique
Reliability Monitor Historique de stabilité système
Windows Admin Center Interface web moderne
Performance Monitor (Perfmon)
Compteurs Essentiels
# Lister les compteurs disponibles
Get-Counter -ListSet * | Select-Object CounterSetName
# Compteurs CPU
Get-Counter '\Processor(_Total)\% Processor Time'
Get-Counter '\System\Processor Queue Length'
# Compteurs Mémoire
Get-Counter '\Memory\Available MBytes'
Get-Counter '\Memory\Pages/sec'
Get-Counter '\Memory\% Committed Bytes In Use'
# Compteurs Disque
Get-Counter '\PhysicalDisk(_Total)\% Disk Time'
Get-Counter '\PhysicalDisk(_Total)\Avg. Disk Queue Length'
Get-Counter '\PhysicalDisk(_Total)\Disk Reads/sec'
Get-Counter '\PhysicalDisk(_Total)\Disk Writes/sec'
# Compteurs Réseau
Get-Counter '\Network Interface(*)\Bytes Total/sec'
Get-Counter '\TCPv4\Connections Established'
# Monitoring continu
Get-Counter -Counter "\Processor(_Total)\% Processor Time","\Memory\Available MBytes" -Continuous -SampleInterval 5
Data Collector Sets
# Créer un Data Collector Set
$name = "Server-Baseline"
logman create counter $name -c `
"\Processor(_Total)\% Processor Time" `
"\Memory\Available MBytes" `
"\PhysicalDisk(_Total)\% Disk Time" `
"\Network Interface(*)\Bytes Total/sec" `
-si 15 `
-f bincirc `
-max 500 `
-o "C:\PerfLogs\$name"
# Démarrer la collecte
logman start $name
# Arrêter
logman stop $name
# Voir les Data Collector Sets
logman query
# Supprimer
logman delete $name
Alertes Performance
# Créer une alerte (via perfmon GUI ou)
# Task Scheduler + script de monitoring
# Script d'alerte simple
$threshold = 90
$cpu = (Get-Counter '\Processor(_Total)\% Processor Time').CounterSamples.CookedValue
if ($cpu -gt $threshold) {
Send-MailMessage -To "admin@corp.local" -From "alert@corp.local" `
-Subject "CPU Alert: $([math]::Round($cpu))%" `
-Body "CPU usage exceeded $threshold% on $env:COMPUTERNAME" `
-SmtpServer "smtp.corp.local"
}
Resource Monitor
# Lancer Resource Monitor
resmon
# Informations disponibles :
# - CPU : Processus, services, handles
# - Memory : Working set, shareable, private
# - Disk : I/O par processus, temps de réponse
# - Network : Connexions TCP, ports, processus
PowerShell Monitoring
CPU et Processus
# Top processus CPU
Get-Process | Sort-Object CPU -Descending | Select-Object -First 10 Name, CPU, WorkingSet64
# Processus par utilisation mémoire
Get-Process | Sort-Object WorkingSet64 -Descending | Select-Object -First 10 Name, @{N='MemoryMB';E={[math]::Round($_.WorkingSet64/1MB)}}
# Handles et threads
Get-Process | Sort-Object Handles -Descending | Select-Object -First 10 Name, Handles, Threads
Mémoire
# Informations mémoire système
Get-CimInstance Win32_OperatingSystem | Select-Object `
@{N='TotalMemoryGB';E={[math]::Round($_.TotalVisibleMemorySize/1MB,2)}},
@{N='FreeMemoryGB';E={[math]::Round($_.FreePhysicalMemory/1MB,2)}},
@{N='UsedPercent';E={[math]::Round((($_.TotalVisibleMemorySize - $_.FreePhysicalMemory)/$_.TotalVisibleMemorySize)*100)}}
# Détail mémoire
systeminfo | findstr /i "memory"
Disque
# Espace disque
Get-PSDrive -PSProvider FileSystem | Select-Object Name, @{N='UsedGB';E={[math]::Round($_.Used/1GB)}}, @{N='FreeGB';E={[math]::Round($_.Free/1GB)}}
# Performance disque
Get-Counter '\PhysicalDisk(*)\Avg. Disk sec/Read','\PhysicalDisk(*)\Avg. Disk sec/Write'
# IOPS
Get-Counter '\PhysicalDisk(_Total)\Disk Reads/sec','\PhysicalDisk(_Total)\Disk Writes/sec' -SampleInterval 5 -MaxSamples 12 |
ForEach-Object { $_.CounterSamples | Select-Object Path, CookedValue }
Réseau
# Connexions réseau
Get-NetTCPConnection | Group-Object State | Select-Object Name, Count
# Connexions établies par processus
Get-NetTCPConnection -State Established |
Select-Object LocalAddress, LocalPort, RemoteAddress, RemotePort, OwningProcess,
@{N='Process';E={(Get-Process -Id $_.OwningProcess).Name}}
# Bande passante par interface
Get-NetAdapterStatistics | Select-Object Name, ReceivedBytes, SentBytes
Diagnostic Automatisé
Script de Health Check
function Get-SystemHealth {
$health = [PSCustomObject]@{
Timestamp = Get-Date
ComputerName = $env:COMPUTERNAME
CPU_Percent = [math]::Round((Get-Counter '\Processor(_Total)\% Processor Time').CounterSamples.CookedValue, 2)
Memory_AvailableGB = [math]::Round((Get-Counter '\Memory\Available MBytes').CounterSamples.CookedValue / 1024, 2)
Memory_UsedPercent = [math]::Round((Get-CimInstance Win32_OperatingSystem | ForEach-Object { (($_.TotalVisibleMemorySize - $_.FreePhysicalMemory) / $_.TotalVisibleMemorySize) * 100 }), 2)
Disk_C_FreeGB = [math]::Round((Get-PSDrive C).Free / 1GB, 2)
Uptime_Days = [math]::Round(((Get-Date) - (Get-CimInstance Win32_OperatingSystem).LastBootUpTime).TotalDays, 2)
}
return $health
}
# Utilisation
Get-SystemHealth | Format-List
Baseline et Alertes
# Collecter une baseline
$baseline = 1..60 | ForEach-Object {
Start-Sleep -Seconds 60
Get-SystemHealth
}
$baseline | Export-Csv "C:\Baseline\system-baseline.csv" -NoTypeInformation
# Comparer avec la baseline
$current = Get-SystemHealth
$avgBaseline = Import-Csv "C:\Baseline\system-baseline.csv" | Measure-Object CPU_Percent -Average
if ($current.CPU_Percent -gt ($avgBaseline.Average * 1.5)) {
Write-Warning "CPU 50% au-dessus de la baseline normale"
}
Windows Admin Center
# Installation (sur Windows Server)
# Télécharger depuis Microsoft, puis :
msiexec /i WindowsAdminCenter.msi /qn /L*v log.txt SME_PORT=443 SSL_CERTIFICATE_OPTION=generate
# Fonctionnalités :
# - Dashboard serveurs
# - Monitoring temps réel
# - Gestion à distance
# - Intégration Azure
Bonnes Pratiques
Checklist Monitoring:
Baseline:
- [ ] Collecter metrics normaux (1 semaine)
- [ ] Documenter les seuils acceptables
- [ ] Identifier les heures de pointe
Alertes:
- [ ] CPU > 90% pendant 5 min
- [ ] Mémoire disponible < 10%
- [ ] Disque < 20% libre
- [ ] Queue disque > 2
Collecte:
- [ ] Data Collector Set configuré
- [ ] Rétention définie
- [ ] Centralisation des données
Voir aussi :
- Event Logs - Journaux d'événements
- Disk Management - Gestion des disques
- Network Troubleshooting - Diagnostic réseau