web-dev-qa-db-ja.com

svchost.exeに関するきめ細かいパフォーマンスレポート

これはいつも私を悩ませていることなので、Server Faultコミュニティに質問します。

プロセスエクスプローラー は、 タスクマネージャー で取得する高レベルのタスクだけでなく、それ以上を追跡できる点で優れています。しかし、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書き込み速度を簡単に監視することもできます。プロセスエクスプローラーの場合は、[表示]メニューの[列の選択]をクリックします。


ほとんどのシステムでは、多くのサービスを持つSVCHOST.EXEプロセスが1つしかありません。私はこのシーケンスを使用しました(コマンドラインウィンドウに直接貼り付けることができます):

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システムの場合のみRecovery Environmentを介して、またRAIDおよび非RAIDシステムの両方でセーフモードを使用して、これから回復することができます。これは、サーバーではなく、開発者のマシンでテストされています。

Powershellでは、次のコマンドを使用して、lsass以外のすべてのサービスに対してこれを行うことができます。

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

Service Disclosureツール を試してください。それ:

  1. Svchost.exeプロセスを共有するサービスを格納します。
  2. 別のプロセスで実行するようにサービスを構成します。再起動後、各サービスが個別のプロセスで表示されます。
  3. 手順1で保存されたすべてのサービスを1つのプロセスに戻します。

あなたのコメントや提案は大歓迎です。

@ピーターモーテンセン:アイデアをありがとう。

1

これがまだ回答が必要な質問かどうかはわかりませんが、お客様のsvchostエラーのトラブルシューティング中に、これに正確に対応するコマンドラインがあることがわかりました。プロセスIDと各プロセスが実行しているサービス。プロセッサの使用状況はわかりませんが、プロセスIDを使用して一度に1つのプロセスを閉じて、少なくともどのグループのサービスがCPUを詰まらせているかを知ることができます。

0
Rev Danger

現在、PowerShellを使用してサービスタイプを「独自のプロセス」に変更し、それぞれのメモリを個別に確認できます。 この要点 完全なコードを表示します。中心的なアイデアは、サービスタイプを、最も煩わしくない方法から最も煩わしい方法に変更することです。

$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.ps1およびEnable-Privilege.ps1ファイルが同じフォルダにある場合は、次のようにスクリプトを実行できます。

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