ti-enxame.com

Relatórios de desempenho aprimorados em svchost.exe

Isso é algo que sempre me incomodou, então vou perguntar à comunidade do Server Fault.

Eu amo Process Explorer por manter o controle de mais do que apenas as tarefas de alto nível que você obtém no Gerenciador de Tarefas . Mas eu sempre quero saber qual dessas dezenas de serviços hospedados em um único processo em svchost está causando o pico de meu processador.

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

20
Randolpho

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

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

SC Config Servicename Type= own

Faça isso em uma janela de linha de comando ou coloque-o em um script BAT. São necessários privilégios administrativos e é necessário reiniciar o computador para que tenha efeito.

O estado original pode ser restaurado por:

SC Config Servicename Type= share

Exemplo: para fazer a Instrumentação de gerenciamento do Windows ser executada em um SVCHOST.EXE separado:

SC Config winmgmt Type= own

Esta técnica não tem efeitos nocivos, exceto talvez aumentar ligeiramente o consumo de memória. E além de observar o uso da CPU para cada serviço, também torna mais fácil observar o delta de falhas de página, a taxa de leitura de E/S de disco e a taxa de gravação de E/S de disco para cada serviço. Para Process Explorer, menu Exibir/Selecionar colunas: guia Memória de processo/Delta de falha de página, guia Desempenho de processo/Bytes de gravação de delta de E/S, guia Desempenho de processo/Bytes de leitura de Delta de E/S, respectivamente.


Na maioria dos sistemas, há apenas um processo SVCHOST.EXE que possui muitos serviços. Usei esta sequência (ela pode ser colada 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.
34
Peter Mortensen

Embora eu não saiba uma maneira fácil de fazer isso diretamente, você pode frequentemente 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 threads e pilhas de threads em execução, bem como o uso da CPU. Freqüentemente, o endereço inicial no encadeamento dará uma indicação da DLL do ponto de entrada e, por extensão, do serviço que está sendo executado naquele encadeamento. Outras vezes, você pode olhar para a pilha de chamadas do thread e ver o nome do módulo na pilha de chamadas que informa qual código está sendo executado.

2
Kevin Dente

Cuidado: Faça a pesquisa necessária, faça o ponto de restauração e os procedimentos de backup antes de aplicar isso, bem como verifique se tudo ainda está funcionando depois. É possível recuperar isso por meio do Recovery Environment apenas em sistemas não RAID, bem como no modo de segurança em sistemas RAID e não RAID. Isso foi testado em uma máquina de desenvolvedor, não em servidores.

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 que o agente de política de grupo se comunique adequadamente durante a inicialização.

Também descobri recentemente que was (Ativação de Processo) e w3svc (IIS World Wide Web) precisam compartilhar seus processos, portanto, foram adicionados às exclusões.

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

1
Tamara Wijsman

Experimente ferramenta de divulgação de serviço . Isto:

  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 na etapa 1 de volta a um processo.

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

@Peter Mortensen: Obrigado pela ideia.

1
Dmytro Ovdiienko

Não sei se essa ainda é uma pergunta para a qual você deseja respostas, mas ao solucionar um erro de svchost do cliente, aprendi que existe uma linha de comando exatamente para isso: "tasklist/svc" dá 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 o uso do processador, mas você pode fechá-los um processo por vez por ID de processo e aprender pelo menos qual grupo de serviços está obstruindo sua CPU.

0
Rev Danger

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. This Gist mostra o código completo. A ideia central é tentar mudar o tipo de serviço da forma menos intrusiva para a mais intrusiva:

$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 o Set-ServiceTypeToOwnProcess.ps1 e Enable-Privilege.ps1 arquivos na mesma pasta, você pode executar o script assim:

.\Set-ServiceTypeToOwnProcess.ps1 -ServiceName 'Appinfo', 'gpsvc', 'Schedule', 'SENS', 'SessionEnv', 'wuauserv'
0
Rosberg Linhares