it-swarm-ko.tech

svchost.exe에 대한 세분화 된 성능보고

이것은 항상 나를 괴롭히는 것이므로 Server Fault 커뮤니티에 물어볼 것입니다.

나는 작업 관리자 에서 얻는 고급 작업 이상의 것을 추적하기 위해 Process Explorer 를 좋아합니다. 그러나 svchost 아래의 단일 프로세스에서 호스팅되는 수십 개의 서비스 중 어떤 서비스가 내 프로세서를 급등시키는 지 지속적으로 알고 싶습니다.

그래서 ...이 정보를 알아낼 수있는 비 간섭적인 방법이 있습니까?

20
Randolpho

예, (거의) 방해받지 않고 쉬운 방법이 있습니다.

각 서비스를 분할하여 자체 SVCHOST.EXE 프로세스에서 실행하면 CPU주기를 사용하는 서비스가 프로세스 탐색기에서 쉽게 볼 수 있습니다 ( "="뒤의 공백이 필요함).

SC Config Servicename Type= own

명령 줄 창에서이 작업을 수행하거나 BAT 스크립트에 넣습니다. 관리자 권한이 필요하며 적용되기 전에 컴퓨터를 다시 시작해야합니다.

원래 상태는 다음을 통해 복원 할 수 있습니다.

SC Config Servicename Type= share

예 : Windows Management Instrumentation을 별도의 SVCHOST.EXE에서 실행하려면 :

SC Config winmgmt Type= own

이 기술은 메모리 소비를 약간 증가시키는 것을 제외하고는 나쁜 영향이 없습니다. 또한 각 서비스의 CPU 사용량을 관찰하는 것 외에도 각 서비스에 대한 페이지 폴트 델타, 디스크 I/O 읽기 속도 및 디스크 I/O 쓰기 속도를 쉽게 관찰 할 수 있습니다. 프로세스 탐색기의 경우 열보기/선택 메뉴 : 프로세스 메모리/페이지 오류 델타 탭, 프로세스 성능/IO 델타 쓰기 바이트 탭, 프로세스 성능/IO 델타 읽기 바이트 탭을 각각 탭합니다.


대부분의 시스템에는 많은 서비스가있는 SVCHOST.EXE 프로세스가 하나만 있습니다. 이 시퀀스를 사용했습니다 (명령 줄 창에 직접 붙여 넣을 수 있음).

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.
34
Peter Mortensen

직접 수행하는 쉬운 방법은 모르지만 svchost 프로세스의 Process Explorer 속성 페이지에서 추론 할 수 있습니다. 프로세스 속성의 서비스 탭은 해당 프로세스에서 호스팅되는 서비스를 알려줍니다. 스레드 탭에는 실행중인 스레드 및 스레드 스택과 CPU 사용량이 표시됩니다. 종종 스레드의 시작 주소는 진입 점 DLL과 해당 스레드에서 실행중인 서비스를 표시합니다. 다른 경우에는 스레드 호출 스택을보고 실행중인 코드 조각을 알려주는 호출 스택의 모듈 이름을 볼 수 있습니다.

2
Kevin Dente

주의 : 이것을 적용하기 전에 필요한 조사, 복원 지점 및 백업 절차를 수행하고 나중에 모든 것이 여전히 작동하는지 확인하십시오. 비 RAID 시스템에서만 복구 환경을 통해 복구 할 수 있으며 RAID 및 비 RAID 시스템 모두에서 안전 모드를 사용할 수 있습니다. 이것은 서버가 아닌 개발자 컴퓨터에서 테스트되었습니다.

Powershell에서는 다음 명령을 사용하여 모든 비 lass 서비스에 대해이 작업을 수행 할 수 있습니다.

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 }

여기에서 제외 된 목록은 모두 공유 lsass.exe에서 실행되어야합니다. 단, 그룹 정책 에이전트가 부팅 중에 제대로 통신하는 데 필요한 policyagent는 예외입니다.

또한 최근에 was (Process Activation) 및 w3svc (IIS World Wide Web)에서 프로세스를 공유해야하므로 제외 항목에 추가되었습니다.

이것은 Windows 10 (1607, 빌드 14393.953)에서 테스트되었으며 예외는 XP에서 다름, ... 입니다.

1
Tamara Wijsman

서비스 공개 도구 를 사용해보십시오. 그것:

  1. Svchost.exe 프로세스를 공유하는 서비스를 저장합니다.
  2. 별도의 프로세스에서 실행되도록 서비스를 구성합니다. 재부팅 후 각 서비스가 별도의 프로세스로 표시됩니다.
  3. 1 단계 서비스에서 저장된 모든 서비스를 하나의 프로세스로 되돌립니다.

귀하의 의견과 제안을 환영합니다.

@Peter Mortensen : 아이디어 주셔서 감사합니다.

1
Dmytro Ovdiienko

이 질문이 여전히 대답을 원하는지 모르겠지만 고객의 svchost 오류를 해결하는 동안 정확히 이에 대한 명령 줄이 있음을 알게되었습니다. "tasklist/svc"실행중인 프로세스의 전체 목록을 제공합니다. 프로세스 ID 및 각 프로세스가 실행중인 서비스로 프로세서 사용량을 제공하지는 않지만 프로세스 ID로 한 번에 하나의 프로세스를 닫고 적어도 어떤 서비스 그룹이 CPU를 막고 있는지 알 수 있습니다.

0
Rev Danger

요즘에는 PowerShell을 사용하여 서비스 유형을 "Own Process"로 변경하고 각각의 메모리를 개별적으로 볼 수 있습니다. This Gist 전체 코드를 보여줍니다. 핵심 아이디어는 서비스 유형을 가장 덜 방해가되는 방식에서 가장 방해가되는 방식으로 변경하는 것입니다.

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

Set-ServiceTypeToOwnProcess.ps1Enable-Privilege.ps1 파일을 같은 폴더에 넣으면 다음과 같은 스크립트를 실행할 수 있습니다.

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