Relatórios de desempenho Finegrained no svchost.exe

19

Isso é algo que sempre me incomodou, por isso vou perguntar à comunidade de falhas do servidor.

Eu adoro o Process Explorer para acompanhar mais do que apenas as tarefas de alto nível que você entre no Gerenciador de tarefas . Mas eu quero constantemente saber qual desses serviços hospedados em um único processo sob o svchost está fazendo o meu processador disparar.

Então ... há alguma maneira não intrusiva de descobrir essas informações?

    
por Randolpho 01.05.2009 / 23:00

6 respostas

33

Sim, há uma maneira (quase) não intrusiva e fácil:

Divida cada serviço para executar em seu próprio processo SVCHOST.EXE e o serviço consumindo os ciclos da CPU será facilmente visível no Process Explorer (o espaço após "=" é obrigatório):

SC Config Servicename Type= own

Faça isso em uma janela de linha de comando ou coloque-o em uma BAT roteiro. Privilégios administrativos são necessários e uma reinicialização do computador é necessária antes de efeito.

O estado original pode ser restaurado por:

SC Config Servicename Type= share

Exemplo: para executar o Windows Management Instrumentation em um SVCHOST.EXE separado:

SC Config winmgmt Type= own

Esta técnica não tem efeitos negativos, exceto talvez aumentando consumo de memória ligeiramente. E além de observar CPU uso para cada serviço, também facilita a observação da página faults delta, taxa de leitura de E / S do disco e taxa de gravação de E / S de disco para cada serviço. Para o Process Explorer, menu Visualizar / Selecionar Colunas:   guia Process Memory / Page Fault Delta,   guia Process Performance / IO Delta Write Bytes,   guia Process Performance / IO Delta Read Bytes, respectivamente.

Na maioria dos sistemas, há apenas um processo SVCHOST.EXE que tem muitos serviços. Eu usei essa seqüência (pode ser colado diretamente em uma janela de linha de 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.
    
por 02.06.2009 / 13:01
2

Embora eu não saiba de maneira fácil de fazer isso diretamente, muitas vezes você pode inferir isso na página de propriedades do Process Explorer para o processo svchost. A guia Serviços nas propriedades do processo informará quais serviços estão hospedados nesse processo. E a guia Threads mostrará os encadeamentos e as pilhas de encadeamentos em execução, bem como o uso da CPU. Geralmente, o endereço inicial no encadeamento fornecerá uma indicação da DLL do ponto de entrada e, por extensão, do serviço em execução nesse encadeamento. Outras vezes você pode olhar para o callstack do thread e verá o nome do módulo na pilha de chamadas que informa qual parte do código está sendo executada.

    
por 01.05.2009 / 23:38
1

Teste a ferramenta de Divulgação de Serviços . Isso:

  1. Armazena serviços que compartilham o processo svchost.exe.
  2. Configura serviços para serem executados em processos separados. Após a reinicialização, você verá cada serviço em um processo separado.
  3. Retorna todos os serviços armazenados da etapa 1 para um único processo.

Seus comentários e sugestões são bem-vindos.

@Peter Mortensen: Obrigado pela ideia.

    
por 24.02.2012 / 18:36
1

Caution: Please take the necessary research, restore point and backup procedures before applying this, as well as check that everything is still working afterwards. It is possible to recover from this through the Recovery Environment only on non-RAID systems, as well as Safe Mode on both RAID and non-RAID systems. This has been tested on a developer machine, not on servers.

No Powershell, você pode fazer isso para todos os serviços não-lsass usando os seguintes comandos:

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 }

A lista excluída aqui precisa ser executada em um lsass.exe compartilhado, com exceção de policyagent , que é necessário para o agente de política de grupo se comunicar adequadamente durante a inicialização.

Também foi descoberto recentemente que era (Process Activation) e w3svc (IIS World Wide Web) precisam compartilhar seus processos, então eles foram adicionados às exclusões. / p>

Isso foi testado no Windows 10 (1607, build 14393.953), as exclusões são diferente no XP, ... .

    
por 22.03.2017 / 01:37
0

Eu não sei se esta ainda é uma pergunta que você quer respostas, mas enquanto resolvendo o erro svchost de um cliente, eu aprendi que existe uma linha de comando exatamente para isso: "tasklist / svc" Ele fornece uma lista completa dos processos em execução, com o ID do processo e os serviços que cada processo está executando. Ele não fornece um uso de processador, mas você pode fechá-los um processo por vez por ID de processo e aprender pelo menos qual grupo de serviços está entupindo sua CPU.

    
por 01.06.2009 / 18:04
0

Hoje em dia, você pode usar o PowerShell para alterar os tipos de serviço para "Processo próprio" e ver a memória de cada um individualmente. Esta essência mostra o código completo. A ideia central é tentar mudar o tipo de serviço do menos intrusivo para o mais intrusivo:

$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"
}

Ao colocar os arquivos Set-ServiceTypeToOwnProcess.ps1 e Enable-Privilege.ps1 na mesma pasta, você pode executar o script assim:

.\Set-ServiceTypeToOwnProcess.ps1 -ServiceName 'Appinfo', 'gpsvc', 'Schedule', 'SENS', 'SessionEnv', 'wuauserv'
    
por 18.03.2018 / 02:42