it-swarm-es.com

Informes de rendimiento detallados en svchost.exe

Esto es algo que siempre me ha molestado, así que le preguntaré a la comunidad Server Fault.

Me encanta Explorador de procesos por realizar un seguimiento de más que solo las tareas de alto nivel que obtiene en el Administrador de tareas . Pero constantemente quiero saber cuál de esa docena de servicios alojados en un solo proceso en svchost está haciendo que mi procesador se dispare.

Entonces ... ¿hay alguna forma no intrusiva de encontrar esta información?

20
Randolpho

Sí, existe una forma (casi) no intrusiva y fácil:

Divida cada servicio para que se ejecute en su propio proceso SVCHOST.EXE y el servicio que consume los ciclos de la CPU será fácilmente visible en Process Explorer (se requiere el espacio después de "="):

SC Config Servicename Type= own

Haga esto en una ventana de línea de comando o colóquelo en un script BAT. Se requieren privilegios administrativos y se requiere reiniciar la computadora antes de que surta efecto.

El estado original se puede restaurar mediante:

SC Config Servicename Type= share

Ejemplo: para que Windows Management Instrumentation se ejecute en un SVCHOST.EXE separado:

SC Config winmgmt Type= own

Esta técnica no tiene efectos nocivos, excepto quizás aumentar ligeramente el consumo de memoria. Y además de observar el uso de la CPU para cada servicio, también facilita la observación de fallas de página delta, velocidad de lectura de E/S de disco y velocidad de escritura de E/S de disco para cada servicio. Para Process Explorer, menú Ver/Seleccionar columnas: pestaña Process Memory/Page Fault Delta, pestaña Process Performance/IO Delta Write Bytes, pestaña Process Performance/IO Delta Read Bytes, respectivamente.


En la mayoría de los sistemas, solo hay un proceso SVCHOST.EXE que tiene muchos servicios. He usado esta secuencia (se puede pegar directamente en una ventana de línea 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

Si bien no conozco una manera fácil de hacerlo directamente, a menudo puede inferirlo desde la página de propiedades del Explorador de procesos para el proceso svchost. La pestaña Servicios en las propiedades del proceso le indicará qué servicios están alojados en ese proceso. Y la pestaña Subprocesos le mostrará los subprocesos y las pilas de subprocesos en ejecución, así como su uso de CPU. A menudo, la dirección de inicio en el hilo dará una indicación del punto de entrada DLL y, por extensión, el servicio que se está ejecutando en ese hilo. Otras veces puede mirar la pila de llamadas del hilo y verá el nombre del módulo en la pila de llamadas que le indica qué parte del código se está ejecutando.

2
Kevin Dente

Precaución: Realice los procedimientos necesarios de investigación, punto de restauración y copia de seguridad antes de aplicar esto, y compruebe que todo sigue funcionando después. Es posible recuperarse de esto a través del entorno de recuperación solo en sistemas que no son RAID, así como el modo seguro en sistemas RAID y no RAID. Esto se ha probado en una máquina de desarrollador, no en servidores.

En Powershell, puede hacer esto para todos los servicios que no sean de lsass usando los siguientes 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 }

La lista que se excluye aquí debe ejecutarse en un lsass.exe compartido, con la excepción de policyagent, que es necesario para que el agente de políticas de grupo se comunique correctamente durante el arranque.

También descubrió recientemente que was (Process Activation) y w3svc (IIS World Wide Web) necesitan compartir sus procesos, por lo que se han agregado a las exclusiones.

Esto ha sido probado en Windows 10 (1607, compilación 14393.953), las exclusiones son diferente en XP, ... .

1
Tamara Wijsman

Pruebe herramienta de divulgación de servicios . Eso:

  1. Almacena servicios que comparten el proceso svchost.exe.
  2. Configura los servicios para que se ejecuten en un proceso separado. Después de reiniciar, verá cada servicio en un proceso separado.
  3. Devuelve todos los servicios almacenados en el paso # 1 a un proceso.

Tus comentarios y sugerencias son bienvenidos.

@Peter Mortensen: Gracias por la idea.

1
Dmytro Ovdiienko

No sé si esta sigue siendo una pregunta para la que desea respuestas, pero mientras solucionaba el error svchost de un cliente, descubrí que hay una línea de comando para exactamente esto: "lista de tareas/svc" Ofrece una lista completa de los procesos en ejecución, con el ID del proceso y los servicios que ejecuta cada proceso. No da un uso de procesador, pero puede cerrarlos un proceso a la vez por ID de proceso y saber al menos qué grupo de servicios está obstruyendo su CPU.

0
Rev Danger

Hoy en día, puede usar PowerShell para cambiar los tipos de servicio a "Proceso propio" y ver la memoria de cada uno individualmente. This Gist muestra el código completo. La idea central es intentar cambiar el tipo de servicio de la forma menos intrusiva a la más 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"
}

Al poner el Set-ServiceTypeToOwnProcess.ps1 y Enable-Privilege.ps1 archivos en la misma carpeta, puede ejecutar el script de esta manera:

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