web-dev-qa-db-ja.com

ホストされているサービス(svchost.exe)を独自のプロセスに分離する

多くのスーパーユーザーはおそらく今では気づいているでしょうが、Microsoftは svchost.exe を使用して、単一のプロセスで複数のWindowsサービスをホストし、サービスグル​​ープごとに1つのプロセスを使用しています。

Windows 7以降では、タスクマネージャーで特定のsvchost.exeプロセスを右クリックし、[サービスに移動]を選択して、その内部で実行されているサービスを確認できます。すべてのWindowsバージョンで Process Explorer も使用できます。

ただし、これにより、たとえば、 CPUを100%に固定している特定のサービス、または700 MBのメモリを使用している特定のサービス。同じグループ内のサービスを手動で停止して排除のプロセスを使用することもできますが、特に問題が断続的にしか発生しない場合は、面倒です。

Microsoftはおそらくこのようにサービスをグループ化することには十分な理由があるでしょう(おそらくプロセスごとのオーバーヘッドを削減しますか?)。

14
Søren Løvborg

いいえ、正しい方法はこのコマンドを実行することです:

sc configwuauserv type= own

これにより、Windows Updateを独自のプロセスで実行するように構成されます。これを元に戻すには、

sc config wuauserv type= share

管理者権限を持つコマンドプロンプト から。これにより、設定値typeが変更されます。タイプが 0x20それはグループプロセスです 、値が 0x10独自のプロセスです

Windows 10 Creators Update(バージョン1703、ビルド15063)以降、 十分なRAMがある場合はWindowsが独自にこれを行います

17
magicandre1981

私が知っている唯一の方法は、レジストリのハッキングによるものです。通常のレジストリデータベース編集の免責事項が適用されます(Windowsのインストールから時空のファブリック全体に至るまですべてが破壊される可能性があります)。

次の例では、誤動作して過剰なリソースを使用することがわかっているWindows Update(wuauserv)サービスを分離しています。このメソッドはWindows 7でのみテストされています。

  1. Regedit.exe(レジストリエディター)を起動し、次の場所に移動します。

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost
    

    このキーには、グループ設定を含む各グループのサブキーと、グループ内のサービスをリストする各グループのREG_MULTI_SZ値が含まれています。

  2. ターゲットサービスの現在のグループのサブキー(この例ではnetsvcs)を調べ、適切な名前と同じ内容の新しいサブキーを作成します。値のタイプと内容を必ず確認してください。

  3. 新しいグループにちなんで名前が付けられたREG_MULTI_SZ値を作成し、サービス名が1行だけ含まれるようにします。既存のグループREG_MULTI_SZからサービス名を削除します。

  4. 次に、HKLM\SYSTEM\CurrentControlSet\servicesの下のターゲットサービスサブキーに移動します。この例では:

     HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\wuauserv
    
  5. ImagePath値を編集し、-kの後のグループ名を新しいグループ名に変更します。

  6. ターゲットサービスを再起動します(たとえば、タスクマネージャーの[サービス]タブを使用するか、services.mscを介して)。それは、それ自体の個別のsvchost.exeプロセスに表示されます。

次回Windows Updateで問題が発生すると、リソースの使用状況がタスクマネージャーにすぐに表示され、「プロセスの終了」を使用して強制終了することもできます(ただし、より重要なサービスにはお勧めしません)。

サービスの開始に失敗した場合は、上記の手順を確認して再試行するか、上部の警告を思い出しながら変更を元に戻してください。 :-)

1
Søren Løvborg