Informes de rendimiento detallados en svchost.exe

20

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

Me encanta Process Explorer por hacer un seguimiento de más que solo las tareas de alto nivel que obtienes en el Administrador de tareas . Pero constantemente quiero saber cuál de esas docenas de servicios alojados en un solo proceso en svchost está haciendo que mi procesador aumente.

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

Randolpho
fuente

Respuestas:

34

Sí, hay una manera (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 póngalo 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 hacer que el Instrumental de administración de Windows 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 observar los delta de fallas de página, la velocidad de lectura de E / S de disco y la velocidad de escritura de E / S de disco para cada servicio. Para Process Explorer, menú Ver / Seleccionar columnas: pestaña Memoria de proceso / Delta de falla de página, pestaña Desempeño de proceso / IO Delta Bytes de escritura, pestaña Desempeño de proceso / IO Delta Leer 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.
Peter Mortensen
fuente
44
wow, solución increíble +1
Matt Simmons
2
Al póster que recomendaba el script de PowerShell: lo probé y cambió con éxito todos mis servicios. Sin embargo, al reiniciar, apareció un cuadro de error y se activó un reinicio. Tuve que restaurar con 'última buena configuración'. Ten cuidado.
user42670
1
@ChrisS: están protegidos contra manipulaciones en versiones posteriores de Windows; Sin embargo, supongo que es importante en Windows XP ...
Tamara Wijsman
2
@ChrisS ¡Gracias por el enlace a la lista de mantenimiento compartido! Ese sitio ahora parece estar muerto. Por archivo , la lista era: HTTPFilter, KDC, Netlogon, NTLMssp, PolicyAgent, ProtectedStorage, SamSs, Eventlog, PlugPlay(todos asociados con lsass.exe)
cxw
2

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 dirá 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 de la DLL del punto de entrada y, por extensión, el servicio, que se ejecuta en ese hilo. Otras veces, puede mirar la pila de llamadas de subprocesos y verá el nombre del módulo en la pila de llamadas que le indica qué código se está ejecutando.

Kevin Dente
fuente
1

Pruebe la herramienta de divulgación de servicio . Eso:

  1. Almacena servicios que comparten el proceso svchost.exe.
  2. Configura servicios para ejecutarse 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 solo proceso.

Tus comentarios y sugerencias son bienvenidos.

@ Peter Mortensen: Gracias por la idea.

Dmytro Ovdiienko
fuente
1
Dmytro, ¿dónde puedo aprender a usar su herramienta de divulgación de servicios? Descargué y ejecuté service_disclosure.exe en Windows 7. Brevemente vi que se abría y cerraba una ventana de comando negra, pero parecía que nada más sucedía. Esto fue desconcertante! Me gustaría saber qué le hizo a mi computadora y cómo usar la herramienta correctamente.
DesarrolladorDan
Hola dan Considere esta guía paso a paso ( sourceforge.net/p/svcdisclsr/wiki/Home )
Dmytro Ovdiienko
1

Precaución: realice la investigación necesaria, el punto de restauración y los procedimientos de 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 no RAID, así como en Modo seguro tanto en sistemas RAID como 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 lsass utilizando 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 del agente de políticas , que es necesario para que el agente de políticas de grupo se comunique correctamente durante el arranque.

También descubrí recientemente que era (Activación de proceso) 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, acumulación 14393.953), las exclusiones son diferentes en XP, ... .

Tamara Wijsman
fuente
0

No sé si todavía es una pregunta que quiere respuestas, pero al solucionar el error svchost de un cliente, aprendí que hay una línea de comando para exactamente esto: "tasklist / svc". Proporciona una lista completa de los procesos en ejecución, con la ID del proceso y los servicios que ejecuta cada proceso. No proporciona un uso de procesador, pero puede cerrarlos un proceso a la vez por ID de proceso, y aprender al menos qué grupo de servicios está obstruyendo su CPU.

Jim B
fuente
0

Hoy en día, puede usar PowerShell para cambiar los tipos de servicio a "Proceso propio" y ver la memoria de cada uno individualmente. Este Gist muestra el código completo. La idea central es tratar de cambiar el tipo de servicio de la manera 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 colocar los archivos Set-ServiceTypeToOwnProcess.ps1y Enable-Privilege.ps1en la misma carpeta, puede ejecutar el script de esta manera:

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