Rapporto dettagliato sulle prestazioni su svchost.exe


20

Questo è qualcosa che mi ha sempre infastidito, quindi chiederò alla community Server Fault.

Adoro Process Explorer per tenere traccia di più delle attività di alto livello che si ottengono in Task Manager . Ma voglio costantemente sapere quale di quelle dozzine di servizi ospitati in un singolo processo sotto svchost sta facendo impennare il mio processore.

Quindi ... esiste un modo non intrusivo per scoprire queste informazioni?

Risposte:


34

Sì, esiste un modo (quasi) non invadente e semplice:

Dividi ogni servizio per eseguirlo nel proprio processo SVCHOST.EXE e il servizio che consuma i cicli della CPU sarà facilmente visibile in Process Explorer (lo spazio dopo "=" è richiesto):

SC Config Servicename Type= own

Fallo in una finestra della riga di comando o inseriscilo in uno script BAT. Sono richiesti privilegi di amministratore ed è necessario riavviare il computer prima che abbia effetto.

Lo stato originale può essere ripristinato da:

SC Config Servicename Type= share

Esempio: per eseguire la Strumentazione gestione Windows in un SVCHOST.EXE separato:

SC Config winmgmt Type= own

Questa tecnica non ha effetti negativi, tranne forse un leggero aumento del consumo di memoria. Oltre a osservare l'utilizzo della CPU per ciascun servizio, è anche facile osservare il delta degli errori di pagina, la velocità di lettura degli I / O del disco e la velocità di scrittura degli I / O del disco per ciascun servizio. Per Process Explorer, menu Visualizza / Seleziona colonne: scheda Memoria di processo / Delta errore di pagina, scheda Prestazioni di processo / IO Delta Scrittura byte, scheda Prestazione di processo / IO Delta Lettura byte, rispettivamente.


Sulla maggior parte dei sistemi esiste un solo processo SVCHOST.EXE che offre molti servizi. Ho usato questa sequenza (può essere incollata direttamente in una finestra della riga di comando):

rem  1. "Automatic Updates"
SC Config wuauserv Type= own

rem  2. "COM+ Event System"
SC Config EventSystem Type= own

rem  3. "Computer Browser"
SC Config Browser Type= own

rem  4. "Cryptographic Services"
SC Config CryptSvc Type= own

rem  5. "Distributed Link Tracking"
SC Config TrkWks Type= own

rem  6. "Help and Support"
SC Config helpsvc Type= own

rem  7. "Logical Disk Manager"
SC Config dmserver Type= own

rem  8. "Network Connections"
SC Config Netman Type= own

rem  9. "Network Location Awareness"
SC Config NLA Type= own

rem 10. "Remote Access Connection Manager"
SC Config RasMan Type= own

rem 11. "Secondary Logon"
SC Config seclogon Type= own

rem 12. "Server"
SC Config lanmanserver Type= own

rem 13. "Shell Hardware Detection"
SC Config ShellHWDetection Type= own

rem 14. "System Event Notification"
SC Config SENS Type= own

rem 15. "System Restore Service"
SC Config srservice Type= own

rem 16. "Task Scheduler"
SC Config Schedule Type= own

rem 17. "Telephony"
SC Config TapiSrv Type= own

rem 18. "Terminal Services"
SC Config TermService Type= own

rem 19. "Themes"
SC Config Themes Type= own

rem 20. "Windows Audio"
SC Config AudioSrv Type= own

rem 21. "Windows Firewall/Internet Connection Sharing (ICS)"
SC Config SharedAccess Type= own

rem 22. "Windows Management Instrumentation"
SC Config winmgmt Type= own

rem 23. "Wireless Configuration"
SC Config WZCSVC Type= own

rem 24. "Workstation"
SC Config lanmanworkstation Type= own

rem End.

4
wow, soluzione fantastica +1
Matt Simmons,

2
Al poster che raccomandava lo script PowerShell: l'ho provato e ha cambiato con successo tutti i miei servizi. Tuttavia, al riavvio è stata visualizzata una finestra di errore ed è stato attivato un riavvio. Ho dovuto ripristinare con "ultima configurazione valida". Stai attento.
user42670


1
@ChrisS: sono protetti da manomissioni nelle versioni successive di Windows; Immagino sia importante in Windows XP, però ...
Tamara Wijsman,

2
@ChrisS Grazie per il link all'elenco keep-shared! Quel sito ora sembra essere morto. Per archivio , l'elenco era: HTTPFilter, KDC, Netlogon, NTLMssp, PolicyAgent, ProtectedStorage, SamSs, Eventlog, PlugPlay(tutti associati a lsass.exe)
cxw

2

Anche se non conosco un modo semplice per farlo direttamente, puoi spesso dedurlo dalla pagina delle proprietà di Process Explorer per il processo svchost. La scheda Servizi sulle proprietà del processo ti dirà quali servizi sono ospitati in quel processo. E la scheda Thread ti mostrerà i thread e le pile di thread in esecuzione e il loro utilizzo della CPU. Spesso l'indirizzo iniziale sul thread fornisce un'indicazione della DLL del punto di ingresso e, per estensione, il servizio in esecuzione su quel thread. Altre volte puoi guardare il thread di chiamata e vedrai il nome del modulo nello stack di chiamate che ti dice quale pezzo di codice è in esecuzione.


1

Prova lo strumento di divulgazione del servizio . It:

  1. Memorizza i servizi che condividono il processo svchost.exe.
  2. Configura i servizi per l'esecuzione in un processo separato. Dopo il riavvio vedrai ogni servizio in un processo separato.
  3. Restituisce tutti i servizi memorizzati al passaggio 1 di nuovo a un processo.

I vostri commenti e suggerimenti sono benvenuti.

@Peter Mortensen: Grazie per l'idea.


1
Dmytro, dove posso imparare come utilizzare il tuo strumento di divulgazione del servizio? Ho scaricato ed eseguito service_disclosure.exe su Windows 7. In breve ho visto aprire e chiudere una finestra di comando nera, ma non è successo nulla di più. Questo è stato sconcertante! Mi piacerebbe sapere cosa ha fatto sul mio computer e come utilizzare correttamente lo strumento.
Sviluppatore:

Ciao Dan Si prega di considerare questa guida passo-passo ( sourceforge.net/p/svcdisclsr/wiki/Home )
Dmytro Ovdiienko

1

Attenzione: eseguire le necessarie ricerche, i punti di ripristino e le procedure di backup prima di applicare questo, nonché verificare che tutto funzioni ancora in seguito. È possibile eseguire il ripristino da questo tramite Recovery Environment solo su sistemi non RAID, nonché su Modalità provvisoria su sistemi RAID e non RAID. Questo è stato testato su una macchina sviluppatore, non su server.

In Powershell, è possibile farlo per tutti i servizi non lassass usando i seguenti comandi:

Get-Service | ForEach-Object `
    { SC.EXE config $_.Name type= own }
ForEach ($svc in @("efs", "keyiso", "netlogon", "policyagent", "samss", "vaultsvc", `
    "was", "w3svc")) `
    { SC.EXE config $svc type= share }

L'elenco qui escluso deve essere eseguito in un file lsass.exe condiviso, ad eccezione di policyagent , necessario per consentire all'agente dei criteri di gruppo di comunicare correttamente durante l'avvio.

Recentemente anche scoperto che era (Process Activation) e che w3svc (IIS World Wide Web) doveva condividere i propri processi, quindi sono stati aggiunti alle esclusioni.

Questo è stato testato su Windows 10 (1607, accumulo 14.393,953), le esclusioni sono diverse in XP, ... .


0

Non so se questa è ancora una domanda a cui vuoi risposte, ma durante la risoluzione dei problemi dell'errore svchost di un cliente, ho imparato che esiste esattamente una riga di comando per questo: "tasklist / svc" Fornisce un elenco completo dei processi in esecuzione, con l'ID del processo e i servizi che ogni processo è in esecuzione. Non offre un utilizzo del processore, ma è possibile chiuderli un processo alla volta per ID processo e apprendere almeno quale gruppo di servizi sta ostruendo la CPU.


0

Al giorno d'oggi, è possibile utilizzare PowerShell per modificare i tipi di servizio in "Proprio processo" e visualizzare la memoria per ognuno singolarmente. Questo Gist mostra il codice completo. L'idea centrale sta cercando di cambiare il tipo di servizio dal modo meno invasivo a quello più invadente:

$win32Service = Get-CimInstance -ClassName Win32_Service -Filter "Name = '$ServiceName'" -Verbose:$false

if ($win32Service)
{
    if (!(Set-ServiceTypeToOwnProcessByCim $win32Service))
    {
        if (!(Set-ServiceTypeToOwnProcessByWindowsRegistry $win32Service))
        {
            if (Grant-FullControlRightsOnServiceRegistryKeyToCurrentUser $win32Service)
            {
                Set-ServiceTypeToOwnProcessByWindowsRegistry $win32Service | Out-Null
            }
        }
    }
}
else
{
    Write-Warning "[$ServiceName] Service not found"
}

Quando si inseriscono i file Set-ServiceTypeToOwnProcess.ps1e Enable-Privilege.ps1nella stessa cartella, è possibile eseguire lo script in questo modo:

.\Set-ServiceTypeToOwnProcess.ps1 -ServiceName 'Appinfo', 'gpsvc', 'Schedule', 'SENS', 'SessionEnv', 'wuauserv'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.