Rapports de performance précis sur svchost.exe

20

C'est quelque chose qui m'a toujours dérangé, je vais donc demander à la communauté Server Fault.

J'adore Process Explorer pour garder une trace de plus que les tâches de haut niveau que vous obtenez dans le Gestionnaire des tâches . Mais je veux constamment savoir lequel de ces douzaines de services hébergés dans un seul processus sous svchost fait grimper mon processeur.

Alors ... existe-t-il un moyen non intrusif de trouver ces informations?

Randolpho
la source

Réponses:

34

Oui, il existe un moyen (presque) non intrusif et facile:

Divisez chaque service pour qu'il s'exécute dans son propre processus SVCHOST.EXE et le service consommant les cycles CPU sera facilement visible dans Process Explorer (l'espace après "=" est requis):

SC Config Servicename Type= own

Faites-le dans une fenêtre de ligne de commande ou placez-le dans un script BAT. Les privilèges administratifs sont requis et un redémarrage de l'ordinateur est requis avant qu'il ne prenne effet.

L'état d'origine peut être restauré par:

SC Config Servicename Type= share

Exemple: pour exécuter Windows Management Instrumentation dans un SVCHOST.EXE distinct:

SC Config winmgmt Type= own

Cette technique n'a aucun effet néfaste, sauf peut-être en augmentant légèrement la consommation de mémoire. En plus d'observer l'utilisation du processeur pour chaque service, il est également facile d'observer le delta des erreurs de page, le taux de lecture des E / S disque et le taux d'écriture des E / S disque pour chaque service. Pour Process Explorer, menu View / Select Columns: onglet Process Memory / Page Fault Delta, onglet Process Performance / IO Delta Write Bytes, onglet Process Performance / IO Delta Read Bytes, respectivement.


Sur la plupart des systèmes, il n'y a qu'un seul processus SVCHOST.EXE qui a beaucoup de services. J'ai utilisé cette séquence (elle peut être collée directement dans une fenêtre de ligne de commande):

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
la source
4
wow, solution géniale +1
Matt Simmons
2
À l'affiche qui a recommandé le script PowerShell: je l'ai essayé et il a réussi à changer tous mes services. Cependant, au redémarrage, une boîte d'erreur est apparue et un redémarrage a été déclenché. J'ai dû restaurer avec la «dernière bonne configuration». Faites attention.
user42670
1
@ChrisS: ceux-ci sont protégés contre la falsification dans les versions ultérieures de Windows; Je suppose que c'est important dans Windows XP, cependant ...
Tamara Wijsman
2
@ChrisS Merci pour le lien vers la liste à partager! Ce site semble maintenant mort. Par archive , la liste était: HTTPFilter, KDC, Netlogon, NTLMssp, PolicyAgent, ProtectedStorage, SamSs, Eventlog, PlugPlay(toutes associées à lsass.exe)
cxw
2

Bien que je ne sache pas comment le faire directement, vous pouvez souvent le déduire de la page des propriétés de Process Explorer pour le processus svchost. L'onglet Services des propriétés du processus vous indiquera quels services sont hébergés dans ce processus. Et l'onglet Threads vous montrera les threads et les piles de threads en cours d'exécution ainsi que leur utilisation du processeur. Souvent, l'adresse de début sur le thread donnera une indication de la DLL du point d'entrée et, par extension, du service qui s'exécute sur ce thread. D'autres fois, vous pouvez consulter la pile d'appels du thread et voir le nom du module dans la pile d'appels qui vous indique quel morceau de code est en cours d'exécution.

Kevin Dente
la source
1

Essayez l' outil de divulgation des services . Il:

  1. Stocke les services qui partagent le processus svchost.exe.
  2. Configure les services pour qu'ils s'exécutent dans un processus distinct. Après le redémarrage, vous verrez chaque service dans un processus distinct.
  3. Renvoie tous les services stockés à l'étape 1 à un seul processus.

Vos commentaires et suggestions sont les bienvenus.

@Peter Mortensen: Merci pour l'idée.

Dmytro Ovdiienko
la source
1
Dmytro, où puis-je apprendre à utiliser votre outil de divulgation de service? J'ai téléchargé et exécuté service_disclosure.exe sur Windows 7. En bref, j'ai vu une fenêtre de commande noire s'ouvrir et se fermer, mais rien de plus ne semblait se produire. C'était déconcertant! J'aimerais savoir ce qu'il a fait à mon ordinateur et comment utiliser correctement l'outil.
DeveloperDan
Salut Dan. Veuillez considérer ce guide étape par étape ( sourceforge.net/p/svcdisclsr/wiki/Home )
Dmytro Ovdiienko
1

Attention: Veuillez effectuer les recherches nécessaires, restaurer le point et les procédures de sauvegarde avant de l'appliquer, ainsi que vérifier que tout fonctionne toujours par la suite. Il est possible de récupérer à partir de cela via l'environnement de récupération uniquement sur les systèmes non RAID, ainsi qu'en mode sans échec sur les systèmes RAID et non RAID. Cela a été testé sur une machine de développeur, pas sur des serveurs.

Dans Powershell, vous pouvez effectuer cette opération pour tous les services non lsass à l'aide des commandes suivantes:

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 liste qui est exclue ici doit toutes s'exécuter dans un lsass.exe partagé, à l'exception de policyagent , qui est requis pour que l'agent de stratégie de groupe communique correctement pendant le démarrage.

Récemment découvert que était (activation des processus) et w3svc (IIS World Wide Web) besoin de partager leurs processus, ils ont donc été ajoutées aux exclusions.

Cela a été testé sur Windows 10 (1607, build 14393,953), les exclusions sont différentes dans XP, ... .

Tamara Wijsman
la source
0

Je ne sais pas si c'est toujours une question à laquelle vous souhaitez obtenir des réponses, mais lors du dépannage de l'erreur svchost d'un client, j'ai appris qu'il existe une ligne de commande pour cela: "tasklist / svc" Il donne une liste complète des processus en cours d'exécution, avec l'ID de processus et les services exécutés par chaque processus. Il ne donne pas d'utilisation du processeur, mais vous pouvez les fermer un processus à la fois par ID de processus et apprendre au moins quel groupe de services obstrue votre processeur.

Jim B
la source
0

De nos jours, vous pouvez utiliser PowerShell pour changer les types de service en "Propre processus" et voir la mémoire de chacun individuellement. Ce Gist montre le code complet. L'idée centrale est d'essayer de changer le type de service de la manière la moins intrusive à la plus intrusive:

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

Lorsque vous placez les fichiers Set-ServiceTypeToOwnProcess.ps1et Enable-Privilege.ps1dans le même dossier, vous pouvez exécuter le script comme ceci:

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