Comment diagnostiquer une utilisation anormale du processeur par svchost.exe? [dupliquer]

19

J'ai un ordinateur portable avec un système Win 7 32 bits alimenté par un Pentium double cœur (c'est un ordinateur portable 2010). Parfois, cela fonctionne bien, mais il tourne généralement à 100% de charge CPU. Le processeur est consommé par deux processus svchost.exe (50% chacun). Pour autant que je comprends, il s'agit d'un hôte de service. Existe-t-il un moyen de savoir quel service est le coupable?

À noter: cela se produit même en mode sans échec.

Girafe violette
la source
1
Vous pouvez utiliser l'Explorateur de processus pour consulter les services qui s'exécutent sous les deux instances de svchost ( technet.microsoft.com/en-us/sysinternals/processexplorer.aspx )
Yorik
@Yorik: J'y ai pensé, mais ProcessExplorer n'a rien montré d'utile.
Violet Giraffe
5
Dans Windows 7, je dirais qu'actuellement> 90% des problèmes de processeur svchost sont liés au service Windows Update. Si vous avez vraiment du mal à mettre à jour un système (ce qui peut être difficile lors d'une nouvelle installation avec un ancien processeur), essayez d'installer KB3050265, KB3138612 et KB3145739 sans connexion réseau. Redémarrez ensuite et recherchez les mises à jour.
ontrack
@ontrack: Intéressant. En fait, je pense que la vérification des mises à jour est désactivée sur cette machine, elle n'a probablement jamais été mise à jour depuis 2010 ou 2012. Et je n'ai aucune envie d'installer des mises à jour, j'ai juste besoin de résoudre le problème de CPU. Si vous avez raison, désactiver simplement l'aide du service Windows Update?
Violet Giraffe
cela a été demandé tant de fois. voir dup. Vous voyez probablement le problème de scnaning WU. Résolvez-le à partir des étapes de ma réponse: superuser.com/a/996072/174557
magicandre1981

Réponses:

28

Comme une instance de svchost.exe héberge plusieurs services système, voici comment séparer les services, chacun à sa propre instance de svchost.exe, afin de savoir quel service consomme le CPU.

La procédure est la suivante:

  1. Utilisez le Gestionnaire des tâches pour afficher tous les processus triés par CPU décroissant et marquez le PID des processus qui consomment le CPU

  2. Dans une invite de commande (cmd), entrez la commande
    Tasklist /svc /fi "IMAGENAME eq svchost.exe"
    entrez la description de l'image ici

  3. Les instances problématiques de svchost.exe peuvent maintenant être localisées par leur PID et à droite vous trouverez une liste des services système qu'ils hébergent

  4. Pour chacun des noms de la liste, entrez la commande suivante dans une invite de commande (cmd) exécutée en tant qu'administrateur:
    sc config <name> type= own
    (notez l'espace entre les '=' et les 'own')

  5. Redémarrer

Les services système que vous avez séparés s'exécuteront désormais chacun dans sa propre instance de svchost.exe et peuvent être vus dans le Gestionnaire des tâches dans l'onglet Processus. Vous pouvez cliquer avec le bouton droit sur une instance et sélectionner «Aller aux services» pour accéder directement au service, ou utiliser à nouveau la commande list de tâches.

Pour plus d'informations, consultez l'article Microsoft
Prise en main du dépannage de SVCHOST.EXE .

harrymc
la source
7

Process Explorer vous facilite la tâche. J'ai confirmé que cela fonctionne avec Process Explorer v16.20 sur Windows 7 Professionnel 64 bits et Windows 10 Pro 64 bits.

  1. Exécutez Process Explorer élevé.
  2. Localisez un svchost.exeprocessus avec une valeur élevée (ou même juste mesurable / non vide) dans la CPUcolonne. Le tri par la colonne Processou CPUpeut aider à cela.
  3. Cliquez avec le bouton droit sur le svchost.exeprocessus et sélectionnez Properties....
  4. Dans la fenêtre des propriétés du processus, sélectionnez l' Threadsonglet. Tous les threads de ce processus seront affichés.
  5. Localisez un thread avec une valeur élevée (ou, encore une fois, juste mesurable / non vide) dans la CPUcolonne. Le tri par CPUcolonne peut vous y aider.Onglet Threads du processus Process Explorer
  6. La Servicecolonne affichera le nom du service dans lequel ce thread s'exécute.

Si le nom du service ne vous est pas familier ...

  1. Dans la fenêtre des propriétés du processus, sélectionnez l' Servicesonglet. Tous les services qui s'exécutent dans ce processus seront affichés.
  2. Faites correspondre la Servicecolonne de l' Servicesonglet à la valeur de la Servicecolonne de l' Threadsonglet que vous avez localisé à l'étape 6.Onglet Services du processus Process Explorer
  3. La Display Namecolonne affichera le nom convivial du service. La description du service sélectionné apparaîtra sous la liste des services.
BACON
la source
Ah, je ne connaissais pas ces fonctions avancées de Process Explorer. Merci.
Violet Giraffe
3

Vous pouvez utiliser le Gestionnaire des tâches . Il existe d'autres façons (ligne de commande, ou même écrire un programme en utilisant WinAPI ), mais je ne les discuterai pas ici. Avant d'aller plus loin, votre utilisateur doit disposer de privilèges administratifs.

Dans l' onglet Processus :

  • Cochez Afficher les processus de tous les utilisateurs .
  • Faites un clic droit sur le processus « en- tête de table » (qui contient les noms de colonnes comme nom d'image , PID , Nom d'utilisateur , CPU , ...), et sélectionnez Sélectionner les colonnes ... .
    • Dans la boîte de dialogue qui apparaît, faites défiler vers le bas et assurez-vous de cocher la ligne de commande et le PID (identificateur de processus), puis appuyez sur OK .
  • De retour à l' onglet Processus , cliquez sur l'en -tête de la colonne CPU afin que les processus soient ordonnés par leur consommation CPU (notez que les processus peuvent être affichés dans l'ordre croissant / décroissant - chaque clic sur CPU change l'ordre), cliquez jusqu'à ce que les 2 processus apparaissent en haut du tableau. Maintenant, vous pouvez voir leur ligne de commande (je ne sais pas, mais j'ai le sentiment que l'un d'eux est netsvcs(Services réseau)) ainsi que leurs PID.

  • Ensuite, vous devez faire correspondre les 2 processus aux services. Pour cela vous pouvez soit:

    • Faites un clic droit sur eux puis Aller au service (s) ... . Cela passera à l' onglet Services , ayant tous les services en cours d'exécution dans ce processus sélectionnés (pour cette option, vous n'avez besoin d'aucune des étapes précédentes :)).
    • Ouvrez le composant logiciel enfichable Services en mmc . Lorsque vous double-cliquez sur un service (cela n'a de sens que de vérifier ceux qui sont en cours d'exécution), sous Chemin d'accès à l'exécutable, vous pouvez voir leur ligne de commande sur laquelle vous devez faire la correspondance.
  • Sur W10, vous pouvez afficher les informations exactes dont vous avez besoin à partir du moniteur de ressources (vous pouvez le démarrer à partir du Gestionnaire des tâches , onglet Performances ). Là, vous allez dans l' onglet CPU et les services et leur consommation CPU sont répertoriés.

EDIT0 : Mise à jour de la réponse pour fournir une approche plus simple (et plus logique), au lieu de me gratter le côté droit de la tête en utilisant celui de la main gauche , que j'ai initialement publié.

CristiFati
la source
Je n'ai jamais remarqué que vous pouvez voir la ligne de commande, bien! Pas aussi simple que la réponse de harrymc, mais bon à savoir.
Violet Giraffe
Le Gestionnaire des tâches peut le faire seul. Si un processus svchost est sélectionné lors du passage à l'onglet Services, les services exécutés dans ce processus y seront sélectionnés.
Simon Richter
1
Vraiment? Sur W10, cela ne se produit pas (du moins quand un service est déjà sélectionné). La seule façon est de cliquer à nouveau sur le processus, puis de choisir Aller au (x) service (s) (option que j'ai ratée - très probablement, elle existe également dans W7 ). Malheureusement, je ne suis pas en mesure de vérifier.
CristiFati
1
@CristiFati cette option existe depuis Windows Vista (source: technet.microsoft.com/en-us/library/ff642468.aspx ), vous devriez probablement l'ajouter à votre réponse au lieu de la correspondance PID à la main
Vasily Alexeev