これは常に私を悩ませているものなので、Server Faultコミュニティに尋ねます。
タスクマネージャーで取得する高レベルのタスクだけでなく、プロセスエクスプローラーを追跡するのが大好きです。しかし、svchostの下の単一のプロセスでホストされているこれらの12個のサービスのうち、どれが私のプロセッサを急上昇させているかを常に知りたいと思っています。
だから...この情報を見つけるための非侵入的な方法はありますか?
これは常に私を悩ませているものなので、Server Faultコミュニティに尋ねます。
タスクマネージャーで取得する高レベルのタスクだけでなく、プロセスエクスプローラーを追跡するのが大好きです。しかし、svchostの下の単一のプロセスでホストされているこれらの12個のサービスのうち、どれが私のプロセッサを急上昇させているかを常に知りたいと思っています。
だから...この情報を見つけるための非侵入的な方法はありますか?
回答:
はい、(ほとんど)邪魔にならず簡単な方法があります:
各サービスを分割して独自の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.
直接行う簡単な方法はわかりませんが、多くの場合、svchostプロセスのProcess Explorerプロパティページから推測できます。プロセスプロパティの[サービス]タブには、そのプロセスでホストされているサービスが表示されます。また、[スレッド]タブには、実行中のスレッドとスレッドスタック、およびそれらのCPU使用率が表示されます。多くの場合、スレッドの開始アドレスは、そのスレッドで実行されているエントリポイントDLL、および拡張機能によりサービスを示します。また、スレッドコールスタックを調べて、どのコードが実行されているかを示すコールスタック内のモジュール名を確認することもできます。
サービス開示ツールをお試しください。それ:
あなたのコメントや提案を歓迎します。
@Peter Mortensen:アイデアをありがとう。
注意:これを適用する前に、必要な調査、復元ポイント、およびバックアップ手順を実行し、すべてが引き続き機能していることを確認してください。非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に異なります...。
現在では、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'