Finegrained raportowanie wydajności na svchost.exe

20

To zawsze mnie niepokoiło, więc zapytam społeczność Server Fault.

Uwielbiam Process Explorer do śledzenia nie tylko zadań wysokiego poziomu, które otrzymujesz w Menedżerze zadań . Ale ciągle chcę wiedzieć, która z tych kilkunastu usług hostowanych w jednym procesie pod svchost powoduje wzrost wydajności mojego procesora.

Więc ... czy jest jakiś nieinwazyjny sposób na znalezienie tych informacji?

Randolpho
źródło

Odpowiedzi:

34

Tak, istnieje (prawie) nieinwazyjny i łatwy sposób:

Podziel każdą usługę, aby działała we własnym procesie SVCHOST.EXE, a usługa wykorzystująca cykle procesora będzie łatwo widoczna w Eksploratorze procesów (wymagane jest miejsce po „=”):

SC Config Servicename Type= own

Zrób to w oknie wiersza poleceń lub umieść w skrypcie BAT. Wymagane są uprawnienia administracyjne, a przed wejściem w życie wymagane jest ponowne uruchomienie komputera.

Stan pierwotny można przywrócić poprzez:

SC Config Servicename Type= share

Przykład: aby uruchomić Instrumentację zarządzania Windows w osobnym pliku SVCHOST.EXE:

SC Config winmgmt Type= own

Ta technika nie ma żadnych złych skutków, z wyjątkiem być może nieznacznego zwiększenia zużycia pamięci. Poza obserwowaniem użycia procesora dla każdej usługi, ułatwia także obserwowanie delty błędów strony, szybkości odczytu we / wy dysku i prędkości zapisu we / wy dysku dla każdej usługi. W Eksploratorze procesów, menu Widok / Wybierz kolumny: zakładka Pamięć procesu / Delta błędu strony, zakładka Wydajność procesu / Bajty zapisu Delta IO, zakładka Wydajność procesu / Bajty odczytu Delta IO.


W większości systemów jest tylko jeden proces SVCHOST.EXE, który ma wiele usług. Użyłem tej sekwencji (można ją wkleić bezpośrednio w oknie wiersza poleceń):

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
źródło
4
wow, niesamowite rozwiązanie +1
Matt Simmons
2
Do plakatu, który zalecał skrypt PowerShell: wypróbowałem go i pomyślnie zmieniłem wszystkie moje usługi. Jednak po ponownym uruchomieniu pojawiło się okno błędu i uruchomiono restart. Musiałem przywrócić z „ostatnią dobrą konfiguracją”. Bądź ostrożny.
user42670
1
@ChrisS: Są one chronione przed manipulacją w późniejszych wersjach systemu Windows; Wydaje mi się, że to ważne w Windows XP ...
Tamara Wijsman,
2
@ChrisS Dziękujemy za link do listy dzielonych Keep! Ta witryna wydaje się teraz martwa. Według archiwum lista była: HTTPFilter, KDC, Netlogon, NTLMssp, PolicyAgent, ProtectedStorage, SamSs, Eventlog, PlugPlay(wszystkie powiązane z lsass.exe)
cxw
2

Chociaż nie wiem, jak łatwo to zrobić bezpośrednio, często możesz wywnioskować to na stronie właściwości Process Explorer dla procesu svchost. Karta Usługi we właściwościach procesu powie Ci, które usługi są hostowane w tym procesie. Karta Wątki pokaże działające wątki i stosy wątków, a także zużycie procesora. Często adres początkowy wątku podaje wskazanie biblioteki DLL punktu wejścia, a przez rozszerzenie usługi działającej w tym wątku. Innym razem możesz spojrzeć na stos wywołań wątku i zobaczysz nazwę modułu na stosie wywołań, który informuje, który fragment kodu jest uruchomiony.

Kevin Dente
źródło
1

Wypróbuj narzędzie Service Disclosure . To:

  1. Przechowuje usługi, które współużytkują proces svchost.exe.
  2. Konfiguruje usługi do uruchamiania w osobnym procesie. Po ponownym uruchomieniu zobaczysz każdą usługę w osobnym procesie.
  3. Zwraca wszystkie usługi zapisane w kroku 1 z powrotem do jednego procesu.

Twoje komentarze i sugestie są mile widziane.

@Peter Mortensen: Dzięki za pomysł.

Dmytro Ovdiienko
źródło
1
Dmytro, gdzie mogę dowiedzieć się, jak korzystać z narzędzia do ujawniania usług? Pobrałem i uruchomiłem service_disclosure.exe na Windows 7. Krótko zobaczyłem, jak czarne okno poleceń otwiera się i zamyka, ale nic więcej się nie wydarzyło. To było niepokojące! Chciałbym wiedzieć, co zrobił z moim komputerem i jak prawidłowo korzystać z tego narzędzia.
DeveloperDan
Cześć Dan. Zapoznaj się z tym przewodnikiem krok po kroku ( sourceforge.net/p/svcdisclsr/wiki/Home )
Dmytro Ovdiienko,
1

Uwaga: przed zastosowaniem tej procedury należy wykonać niezbędne badania, przywrócić punkt i wykonać kopię zapasową, a także sprawdzić, czy wszystko nadal działa. Można to odzyskać dzięki środowisku odzyskiwania tylko w systemach innych niż RAID, a także w trybie awaryjnym zarówno w systemach RAID, jak i innych. Zostało to przetestowane na komputerze dewelopera, a nie na serwerach.

W Powershell możesz to zrobić dla wszystkich usług innych niż lsass, używając następujących poleceń:

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 }

Wykluczona tutaj lista musi być uruchomiona we współdzielonym pliku lsass.exe, z wyjątkiem policyagent , który jest wymagany, aby agent zasad grupy mógł poprawnie komunikować się podczas uruchamiania.

Niedawno odkryłem, że było to (Aktywacja procesu) i w3svc (IIS World Wide Web) muszą udostępniać swoje procesy, więc zostały one dodane do wykluczeń.

Ten został przetestowany na Windows 10 (1607, budować 14393,953), wyłączenia są różne w XP ... .

Tamara Wijsman
źródło
0

Nie wiem, czy nadal jest to pytanie, na które chcesz uzyskać odpowiedzi, ale podczas rozwiązywania problemu z błędem svchost klienta dowiedziałem się, że istnieje dokładnie wiersz poleceń: „tasklist / svc”. Zawiera pełną listę uruchomionych procesów, z identyfikatorem procesu i usługami uruchomionymi dla każdego procesu. Nie wymaga użycia procesora, ale możesz zamknąć je jeden proces naraz według identyfikatora procesu i dowiedzieć się przynajmniej, która grupa usług blokuje procesor.

Jim B.
źródło
0

W dzisiejszych czasach możesz użyć programu PowerShell, aby zmienić typy usług na „Proces własny” i zobaczyć pamięć dla każdego z nich osobno. Ta istota pokazuje pełny kod. Główną ideą jest próba zmiany rodzaju usługi z najmniej inwazyjnej na najbardziej inwazyjną:

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

Umieszczając pliki Set-ServiceTypeToOwnProcess.ps1i Enable-Privilege.ps1w tym samym folderze, możesz wykonać skrypt w następujący sposób:

.\Set-ServiceTypeToOwnProcess.ps1 -ServiceName 'Appinfo', 'gpsvc', 'Schedule', 'SENS', 'SessionEnv', 'wuauserv'
Rosberg Linhares
źródło