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