2017/11/01

SvcHost サービス分割とかいう新仕様(from Windows 10 ver 1703)

Windows 10 バージョン 1703 や 1709 のタスク マネージャーを眺めていて、なんだか svchost.exe プロセスがすごい数になってるなぁと気付いた人いると思います。えっ、変わってないけどっていう人もいると思います。

Windows のサービスには、svchost.exe (Windows サービスのホスト プロセス) が DLL をホストしてサービスを提供するものがありますが、サービスにはグループというものがあって、1 つの svchost.exe プロセスで複数のサービス (DLL) がホストされることも多々あります。が、Windows 10 バージョン 1703 以降は、svchost.exe と DLL の対応がほぼ 1:1になり、大量の svchost.exe が動くことがあります。詳しいことはこちらに...

Changes to Service Host grouping in Windows 10
[URL] https://docs.microsoft.com/en-us/windows/application-management/svchost-service-refactoring

物理メモリが 3.5 GBより大きい(> 3.5GB)とこの機能が発動するらしいです(クライアント SKU の機能ということなので、Windows Server バージョン 1709 はこうならないと思います)。仮想マシンで実際に試してみました。


上記のドキュメントにも試す方法が書いていますが、3.5 GB=3584 MB なので、ドキュメントどおりだとうまくいかないはず。3484 MB とミスってます。



左が 3.5 GB (3584 MB) の仮想マシン、右が 3.5 GB + 4 MB(3588 MB) 。使った仮想環境の割り当て粒度が 4 MB だったから +4 MBにしましたが、Hyper-V なら +2 MB で行けると思います。


どちらも、Windows 10 バージョン 1709 を実行する、(メモリ割り当て以外は)同じ仮想マシンです。ほぼほぼ svchost.exe とサービス(DLL)が 1:1。例外もあって、すべてではないですけど(上の画面に見えるところでは、DCOM Server Process Launcher グループ)。

svchost.exe のプロセス数をカウントしてみたところ、左が 18 コ、右が 66 コで、約 35 億倍。うそ、約 3.6 倍。

タスクマネージャーの[パフォーマンス]タブでは、どちらも 3.5 GB に見えますが、wmic computer system get TotalPhysicalMemory とか (Get-ComputerInfo).CsTotalPhysicalMemory とかで見ると、微妙な違いがわかります。ピッタリ 3.5 GB が境目(> 3.5 GB) です。

プロセスごとにメモリ割り当て(WorkingSet)があるわけで、プロセス数が多くなるということはそれだけメモリ消費が増えることになりそうですが、Windows 10 のメモリ管理の新機能であるメモリ圧縮(Memory Compression)とかページ統合(Page Combining、こちらはWindows 8から?)の効果なんでしょうか、全体の使用メモリに大差はありません(使用中の 0.1 GB の差は、Svchost.exe の差とは関係ないかも)。

> 3.5 MB の仮想マシンで、メモリ圧縮とページ統合を無効化してみました(左が既定、右が無効化)。でも、ほとんと違いは見えません。他に何も実行していないアイドル状態だからでしょうか?でも、どちらも起動直後なので、0.1 GB の差が、その差なのかもしれません(どちらも圧縮 0 MBなので、この場合はページ統合?)。

公式ドキュメントに書いてある方法で、Svchost.exe の WorkingSet のサイズを合計してみると...

明らかにメモリ消費は増えています(上が = 3.5 GB、下が > 3.5 GB)。注意:この結果からはメモリ圧縮やページ統合されているかは判断できません。3.5 GB に対して 300 MB 程度ですから、システム全体では差が見えないのかも。


(メモリ圧縮やページ統合が行われるまで放置中、あとでここに追記)(やっぱり有為な差なし)

公式ドキュメントにも書いてありますが、HKLM\SYSTEM\CurrentControlSet\Services\<サービスの内部名> にある SvcHostSplitDisable 値が 1 になっているものは例外(分割対象外)みたい。

以上。

追記)
@ITさんで書いた「Windows 10で増殖する“謎サービス”の正体を追え!」(→http://www.atmarkit.co.jp/ait/articles/1705/01/news009.html) に関連するドキュメントも公開されてました。

Per-user services in Windows 10 and Windows Server
[URL] https://docs.microsoft.com/en-us/windows/application-management/svchost-service-refactoring


12/21 追記) Windows Server バージョン 1709 もそうらしい。
Windows 10 1703+/Windows Server 1709: The many svchost’s are finally split on their own.
[URL] https://blogs.technet.microsoft.com/yongrhee/2017/11/29/windows-10-1703windows-server-1709-the-many-svchosts-are-finally-split-on-their-own/

試してみた。上が2GB、下が4GB。同じサーバー。

0 件のコメント: