svchost.exeの詳細なパフォーマンスレポート


20

これは常に私を悩ませているものなので、Server Faultコミュニティに尋ねます。

タスクマネージャーで取得する高レベルのタスクだけでなく、プロセスエクスプローラーを追跡するのが大好きです。しかし、svchostの下の単一のプロセスでホストされているこれらの12個のサービスのうち、どれが私のプロセッサを急上昇させているかを常に知りたいと思っています。

だから...この情報を見つけるための非侵入的な方法はありますか?

回答:


34

はい、(ほとんど)邪魔にならず簡単な方法があります:

各サービスを分割して独自のSVCHOST.EXEプロセスで実行すると、CPUサイクルを消費するサービスがProcess Explorerで簡単に表示されます(「=」の後のスペースが必要です)。

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.

4
うわー、素晴らしいソリューション+1
マットシモンズ

2
PowerShellスクリプトを推奨するポスターへ:私はそれを試してみましたが、すべてのサービスが正常に変更されました。ただし、再起動時にエラーボックスが表示され、再起動がトリガーされました。「最後の適切な構成」で復元する必要がありました。注意してください。
user42670


1
@ChrisS:これらは、後のバージョンのWindowsでの改ざんから保護されています。私はかかわらず、それはWindows XPで重要だと思う···
タマラWijsman

2
@ChrisS共有リストへのリンクをありがとう!そのサイトは現在、死んでいるようです。アーカイブごとに、リストは次のとおりでした:(HTTPFilter, KDC, Netlogon, NTLMssp, PolicyAgent, ProtectedStorage, SamSs, Eventlog, PlugPlayすべてに関連付けられているlsass.exe
-cxw

2

直接行う簡単な方法はわかりませんが、多くの場合、svchostプロセスのProcess Explorerプロパティページから推測できます。プロセスプロパティの[サービス]タブには、そのプロセスでホストされているサービスが表示されます。また、[スレッド]タブには、実行中のスレッドとスレッドスタック、およびそれらのCPU使用率が表示されます。多くの場合、スレッドの開始アドレスは、そのスレッドで実行されているエントリポイントDLL、および拡張機能によりサービスを示します。また、スレッドコールスタックを調べて、どのコードが実行されているかを示すコールスタック内のモジュール名を確認することもできます。


1

サービス開示ツールをお試しください。それ:

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

あなたのコメントや提案を歓迎します。

@Peter Mortensen:アイデアをありがとう。


1
Dmytro、Service Disclosureツールの使用方法はどこで学べますか?Windows 7でservice_disclosure.exeをダウンロードして実行しました。簡単に言えば、黒いコマンドウィンドウが開いたり閉じたりしているのが見えましたが、それ以上何も起こらなかったようです。これは戸惑いました!コンピューターに対して何が行われ、ツールを適切に使用する方法を知りたいのですが。
DeveloperDan

こんにちはダン。このステップバイステップガイド(sourceforge.net/p/svcdisclsr/wiki/Home)を考慮してください
Dmytro Ovdiienko

1

注意:これを適用する前に、必要な調査、復元ポイント、およびバックアップ手順を実行し、すべてが引き続き機能していることを確認してください。非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を除きます。これは、グループポリシーエージェントがブート中に適切に通信するために必要です。

また、最近発見されたの(プロセスのアクティブ化)およびw3svc(IIS World Wide Web)がプロセスを共有する必要があるため、それらが除外に追加されていることです。

これは、除外があり、(1607、ビルド14393.953)は、Windows 10上でテストされている、XPに異なります...


0

これがまだあなたが答えを求めている質問であるかどうかはわかりませんが、顧客のsvchostエラーのトラブルシューティング中に、まさにこれのためのコマンドラインがあることを学びました: "tasklist / svc"実行中のプロセスの完全なリストを提供し、プロセスIDと各プロセスが実行しているサービス。プロセッサの使用量はわかりませんが、プロセスIDごとに一度に1つのプロセスを閉じ、少なくともどのサービスグル​​ープがCPUを詰まらせているかを知ることができます。


0

現在では、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.ps1Enable-Privilege.ps1、次のようなスクリプトを実行できます。

.\Set-ServiceTypeToOwnProcess.ps1 -ServiceName 'Appinfo', 'gpsvc', 'Schedule', 'SENS', 'SessionEnv', 'wuauserv'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.