So mancher Benutzer der den Weg in den Windows TaskManager kennt, erschrickt gerne mal beim Anblick mehrerer Prozesse mit dem Namen svchost.exe 1) 2). Doch keine Panik, der ServiceHost (svchost) ist ein Systemprozess und mehrere Instanzen davon sind normal. Dieser Artikel beschreibt die Funktionalität und Arbeitsweise des SVCHOST etwas detaillierter.
Windows Dienste (SERVICES) sind ein substanzieller Bestandteil des Windows Betriebssystems und in seiner einfachsten Form liegen diese Dienste als ausfürbare Datei vor (StandAloneService). Gewöhnlicher jedoch ist, dass mehrere Dienste in Gruppen zusammengefasst werden und somit von gemeinsam genutzten Code profitieren können (HostedService). Gemeinsam genutzter Code wird in Dynamic-Link Libraries (DLLs) zusammengefasst. Das macht Sinn, weil dadurch der verwendete Plattenplatz deutlich reduziert werden kann und bei Aktualisierungen nur der Code in den DLLs gepatcht werden muss und nicht jede ausführbare Anwendung, welche identische Codeteile enthält. DLLs werden demnach für Programmcode Konsolidierung verwendet. Manche Programmierer lagern häufig sogar den kompletten Programmcode in DLLs aus. SVCHOST ist ein generischer Hostprozessname für Dienste bzw. Dienstgruppen, die aus DLLs heraus ausgeführt werden.
StandAloneService: Windows Dienste werden in der Registry unter HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services organisiert, der Wert ImagePath beschreibt den Pfad, welcher zum Starten des Dienstes ausgeführt wird. Im Falle eines StandAloneService wird dort der Pfad zur ausführbaren Datei definiert. zB läuft mein unter Windows verwendeter Virenscanner Avast als StandAloneService, der ImagePath im dazugehörigem Registryschlüssel dazu lautet: "C:\Programme\Alwil Software\Avast4\ashServ.exe".
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\[ServiceName]
Das ganze kann man in den Eigenschaften des Dienstes im Services SnapIn (Start → Ausführen → services.msc) ebenfalls überprüfen. Dort wird der Dienst unter dem Namen aufgeführt, welcher in der Dienstkonfiguration in der Registry im Wert DisplayName festgelegt ist:
HostedService (DLLbased): Etwas komplizierter wird die Sache nun, wenn ein Dienst über den SVCHOST gestartet wird. zB der Windows NTP Client w32time-Dienst, der für die Synchronisierung der Systemuhr verantwortlich ist, liegt als DLL in %SYSTEMROOT%\system32\w32time.dll vor. Der Aufruf (ImagePath) in der Registry zeigt allerdings nicht auf die DLL sondern auf die Service Gruppe in der der Dienst organisiert ist. Im Beispiel von w32time ist das die Gruppe (ImagePath=) netsvcs:
Die Syntax für den Aufruf einer Dienstgruppe lautet: %SYSTEMROOT%\system32\svchost.exe -k group. Der Wert group definiert welche Dienste als Service-DLLs in einer SVCHOST Instanz ausgeführt werden. Die Liste der Dienste die in der angegebenen Gruppe ausgeführt werden, wird ebenfalls in der Registry definiert:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Svchost
Wird ein DLL-basierter Dienst bzw. die Dienst Gruppe gestartet, lädt der SVCHOST die dazugehörige DLL, welche in der Registry im Subkey Parameters im Wert ServiceDll definiert wird.
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\[service_name]\Parameters
Fazit: Der Prozess svchost.exe ist ein generischer Windows Prozess, der Windows Dienste aus DLLs heraus startet und ggf in Gruppen zusammengefasst ausführt!
In vielen Foren kommt es nun immer wieder zu der Frage was eine CPU Auslastung eines svchost Prozess von 100% bedeutet. Die kurze Antwort darauf lautet, dass vermutlich in den meisten Fällen ein SVCHOST gestarteter Dienst abgestürzt ist. Aber welcher? Das kann uU dann schon zu einer ausgedehnten Detektivarbeit führen. IdR sollte ein Neustart des Systems die Sache wieder gerade biegen aber man kann sich der Sache auch detaillierter nähern. Dazu ist es erst mal erforderlich die PID (ProzessID) der SVCHOST Instanz zu kennen. Dazu blenden Sie im Task Manager die Spalte PID ein (Menü: Ansicht → Spalten auswählen → Checkbox: PID aktivieren). Sie sehen jetzt die PID des Prozesses, welcher die hohe CPU Auslastung verursacht. In einem Terminal können Sie nun den Befehl tasklist /svc /fi "imagename eq svchost.exe" ausführen und in der Liste die HostedServices identifizieren, welche zu dieser PID gehören.
C:\> tasklist /svc /fi "imagename eq svchost.exe"
Abbildname PID Dienste
========================= ===== =============================================
svchost.exe 884 DcomLaunch, TermService
svchost.exe 952 RpcSs
svchost.exe 1048 AudioSrv, BITS, Browser, CryptSvc, Dhcp,
dmserver, ERSvc, EventSystem, helpsvc,
lanmanserver, lanmanworkstation, Netman,
Nla, RasMan, Schedule, seclogon, SENS,
SharedAccess, ShellHWDetection, srservice,
TapiSrv, Themes, TrkWks, W32Time, winmgmt,
wscsvc, wuauserv, WZCSVC
svchost.exe 1144 Dnscache
svchost.exe 1216 LmHosts, RemoteRegistry, SSDPSRV
svchost.exe 428 WebClient
svchost.exe 1128 stisvc
Ist die gesuchte PID nicht mit so vielen Diensten gesegnet wie hier zB die PID 1048 kann recht schnell der verantwortliche Dienst ausfindig gemacht werden. Sie können in einem Terminal den Dienst dann ggf neu starten. Die Syntax dazu lautet: net stop [Dienstname] && net start [Dienstname]:
C:\> net stop w32time && net start w32time
Windows-Zeitgeber wird beendet.
Windows-Zeitgeber wurde erfolgreich beendet.
Windows-Zeitgeber wird gestartet.
Windows-Zeitgeber wurde erfolgreich gestartet.
Im Falle einer großen Gruppe ist es ggf schneller und sicherer das gesamte System neu zu starten, da auch von diesem Dienst abhängige Dienste neu gestartet werden bzw. Ihnen die Möglichkeit gegeben wird dies auch abzulehnen. Bei dauerhaft hoher CPU Last, also auch nach einem evtl. Neustart, wird das ganze allerdings zu der oben bereits erwähnten Detektivarbeit. Das kann zB durch einen DLL Konflikt entstehen, was möglicherweise durch die Installation einer Software oder eines Updates verursacht werden kann, auch Viren etc. werden hier gerne als Ursache genannt. IdR hilft dann nur eine umfangreiche Analyse um das Problem weiter eingrenzen zu können.
— pronto 2010/03/21 19:54
~~DISCUSSION~~