← Guia Completo: Diagnóstico de Desempenho em VMs Windows

🔬 Ferramentas Avançadas. Quando as ferramentas básicas não chegam para identificar a causa de um problema, é preciso capturar dados com maior granularidade. Este artigo cobre o Windows Performance Recorder/Analyzer, um script PowerShell de diagnóstico automático pronto a usar, e a tabela completa de ferramentas Sysinternals com os seus casos de uso.

1. Windows Performance Recorder (WPR) e Analyzer (WPA)

O Windows Performance Toolkit — incluído no Windows ADK — permite captura detalhada de CPU, memória, disco e rede através de ETW (Event Tracing for Windows), com overhead mínimo no sistema.

Captura de trace de performance

:: Iniciar captura de CPU, Disco e Rede (executar como Administrador)
wpr -start CPU -start DiskIO -start Network -filemode
:: Reproduzir o problema durante 30–60 segundos, depois parar
wpr -stop C:\Traces\captura.etl
:: Abrir para análise no Windows Performance Analyzer
wpa.exe C:\Traces\captura.etl

No WPA, as vistas mais úteis são:

  • CPU Usage (Sampled): tempo de CPU por processo e função
  • Disk I/O: throughput e latência por processo e ficheiro
  • Generic Events: eventos ETW de qualquer subsistema
💡 Quando usar WPR/WPA: Problemas que o PerfMon não consegue localizar com precisão — como intermitências de microsegundos, contention de locks, ou identificação de funções específicas de uma DLL que causam latência.

2. Script PowerShell de Diagnóstico Automático

Guardar como DiagnosticoVM.ps1 e executar com Run as Administrator. Gera um relatório de texto com o estado completo da VM no momento da execução:

# === SCRIPT DE DIAGNÓSTICO RÁPIDO — kbase.pt ===
# Executar no PowerShell como Administrador

$Report = "C:\DiagnosticoVM_$(hostname)_$(Get-Date -Format 'yyyyMMdd_HHmm').txt"

"=== DIAGNÓSTICO VM ===" | Out-File $Report
(Get-Date).ToString()   | Out-File $Report -Append
""                       | Out-File $Report -Append

"--- SISTEMA ---" | Out-File $Report -Append
Get-ComputerInfo | Select-Object CsName, OsName, CsTotalPhysicalMemory |
    Out-File $Report -Append

"--- UPTIME ---" | Out-File $Report -Append
((Get-Date) - (gcim Win32_OperatingSystem).LastBootUpTime).ToString() |
    Out-File $Report -Append

"--- TOP CPU (15 processos) ---" | Out-File $Report -Append
Get-Process | Sort-Object CPU -Descending | Select-Object -First 15 Name, CPU, Id |
    Out-File $Report -Append

"--- MEMÓRIA ---" | Out-File $Report -Append
Get-WmiObject Win32_OperatingSystem |
    Select-Object @{N='TotalRAM_GB';E={[math]::Round($_.TotalVisibleMemorySize/1MB,2)}},
                  @{N='FreeRAM_GB'; E={[math]::Round($_.FreePhysicalMemory/1MB,2)}} |
    Out-File $Report -Append

"--- TOP MEMÓRIA (10 processos) ---" | Out-File $Report -Append
Get-Process | Sort-Object WorkingSet64 -Descending | Select-Object -First 10 `
    Name, @{N='RAM_MB';E={[math]::Round($_.WorkingSet64/1MB,1)}} |
    Out-File $Report -Append

"--- DISCO (volumes locais) ---" | Out-File $Report -Append
Get-WmiObject Win32_LogicalDisk | Where-Object {$_.DriveType -eq 3} |
    Select-Object DeviceID,
        @{N='Total_GB';E={[math]::Round($_.Size/1GB,2)}},
        @{N='Free_GB'; E={[math]::Round($_.FreeSpace/1GB,2)}},
        @{N='Free%';   E={[math]::Round($_.FreeSpace/$_.Size*100,1)}} |
    Out-File $Report -Append

"--- REDE (adaptadores) ---" | Out-File $Report -Append
Get-NetAdapter | Select-Object Name, Status, LinkSpeed | Out-File $Report -Append

"--- ERROS DO SISTEMA (últimas 4h) ---" | Out-File $Report -Append
Get-WinEvent -FilterHashtable @{
    LogName='System'; Level=1,2; StartTime=(Get-Date).AddHours(-4)
} -EA SilentlyContinue | Select-Object TimeCreated, Id, Message |
    Out-File $Report -Append

"--- SERVIÇOS AUTOMÁTICOS PARADOS ---" | Out-File $Report -Append
Get-Service | Where-Object {$_.StartType -eq 'Automatic' -and $_.Status -eq 'Stopped'} |
    Select-Object DisplayName, Name | Out-File $Report -Append

Write-Host "Relatório guardado em: $Report" -ForegroundColor Green
Invoke-Item (Split-Path $Report)

3. Sysinternals — Tabela Completa

As Sysinternals são um conjunto de ferramentas gratuitas da Microsoft que complementam as ferramentas nativas do Windows para diagnóstico avançado.

Ferramenta Uso principal Quando usar
Process Explorer Árvore de processos, CPU, RAM, handles, DLLs Substituto do Task Manager — usar sempre
Process Monitor Rastreio de filesystem, registo e rede por processo Lentidão aplicacional, erros de permissão, ficheiros locked
TCPView Conexões TCP/UDP em tempo real por processo Diagnóstico de rede, processos com muitas conexões abertas
Autoruns Tudo o que inicia com o Windows (startup, serviços, drivers) Boot lento, identificar malware, limpar startup
RAMMap Análise detalhada do uso de memória física por categoria Pressão de memória, perceber o que está em standby/cache
VMMap Mapa de memória virtual de um processo específico Análise de leaks de memória em aplicações
Handle Lista de handles abertos por processo ou por ficheiro Identificar qual processo tem um ficheiro locked
PsExec Execução remota de comandos Diagnóstico remoto sem RDP, executar comandos como SYSTEM
PsList / PsKill Listar e terminar processos locais ou remotos Gestão de processos em servidores sem interface gráfica
WinObj Namespace de objetos do kernel Windows Diagnóstico avançado de kernel e drivers

4. Referência Rápida — Limiares de Contadores

Contador PerfMon ✅ Normal ⚠️ Atenção 🔴 Crítico
\Processor(_Total)\% Processor Time < 70% 70 – 90% > 90% sustentado
\System\Processor Queue Length (por core) 0 – 2 2 – 4 > 4
\Processor(_Total)\% Interrupt Time < 5% 5 – 15% > 15%
\Memory\Available MBytes (VM 4 GB) > 500 MB 200 – 500 MB < 200 MB
\Memory\Pages/sec < 5 5 – 20 > 20 sustentado
\PhysicalDisk\Avg. Disk sec/Read < 10 ms 10 – 25 ms > 25 ms
\PhysicalDisk\Avg. Disk Queue Length < 1 1 – 2 > 2
\LogicalDisk\% Free Space > 20% 10 – 20% < 10%
\TCPv4\Segments Retransmitted/sec 0 < 5 > 5

5. Comandos Rápidos por Sintoma

Sintoma Primeiro Comando
CPU a 100% Get-Process | Sort CPU -Desc | Select -First 10 Name,CPU
RAM esgotada / paging Get-WmiObject Win32_OS | Select FreePhysicalMemory + PerfMon Pages/sec
Disco lento / I/O alto PerfMon: Avg. Disk Queue Length + Avg. Disk sec/Read
Rede lenta pathping -n <destino> + netstat -s -p tcp
App a não responder Process Explorer → processo → Properties → Threads
BSOD / crash Event Viewer ID 41 + WinDbg !analyze -v
Boot lento Task Manager → Startup + Reliability Monitor
Disco cheio Get-WmiObject Win32_LogicalDisk | Select DeviceID,FreeSpace
Serviço em falha Get-Service | Where {$_.StartType -eq 'Automatic' -and $_.Status -eq 'Stopped'}
Ficheiro locked Process Explorer: Find → Find Handle or DLL

6. Checklist Final Completa — 7 Fases

Para uso em qualquer sessão de diagnóstico:

  1. Recolha inicial: confirmar sintomas, verificar alterações recentes, executar systeminfo, abrir Task Manager → Performance
  2. CPU: top processos, Processor Queue Length, % Interrupt Time, verificar Task Scheduler
  3. Memória: Available MBytes, Pages/sec, top processos por RAM, estado do pagefile
  4. Disco: Avg. Disk Queue Length, latência, espaço livre, CHKDSK, SMART
  5. Rede: erros de interface, ping/pathping, DNS, retransmissões TCP
  6. Eventos: Event Viewer erros 24h, IDs críticos, Reliability Monitor, SFC
  7. Documentação: executar script DiagnosticoVM.ps1 e guardar relatório

Este artigo foi útil?

Duarte Spínola

Deixe um Comentário