Skip to main content
評価してください: 

この記事は、これから数か月にわたって投稿する「Windows の限界に挑む」というシリーズの記事の 1 回目の投稿です。このシリーズでは、Windows やアプリケーションでの特定のリソースの使用方法、ライセンスや実装に由来するリソースの制限、リソースの使用状況を測定する方法、およびリークを診断する方法について説明します。Windows システムを効果的に管理できるようにするために、物理リソース (CPU やメモリなど) および論理リソース (仮想メモリ、ハンドル、ウィンドウ マネージャー オブジェクトなど) を Windows でどのように管理しているかを理解しておく必要があります。これらのリソースの制限と、リソースの使用状況の追跡方法を理解することによって、リソースを利用するアプリケーションごとにリソースの使用状況を見極めたり、特定の作業負荷に応じてシステムのサイズを効果的に変更したり、リソース リークの原因となっているアプリケーションを識別したりすることができます。

物理メモリ

コンピューターの最も基本的なリソースの 1 つが物理メモリです。Windows のメモリ マネージャーは、アクティブ プロセス、デバイス ドライバー、およびオペレーティング システム自体のコードやデータをメモリに割り当てます。多くのシステムでは、実行時に物理メモリの容量を超える量のコードやデータにアクセスするので、物理メモリは、実質的には、長期にわたって使用されるコードやデータへの窓口となります。したがって、メモリの容量はパフォーマンスに影響する可能性があります。プロセスやオペレーティング システムが必要とするデータやコードがメモリ上にない場合、メモリ マネージャーはディスクから再び読み込む必要があるからです。

パフォーマンスへの影響以外に、物理メモリの容量は他のリソースの制限にも影響します。たとえば、非ページ プール、つまり物理メモリによってサポートされるオペレーティング システムのバッファーが、物理メモリによって制約されるのは明らかです。物理メモリはシステムの仮想メモリの制限にも影響します。仮想メモリの制限は、物理メモリのサイズと、すべてのページング ファイルの最大構成サイズの合計とほぼ同じです。また、物理メモリは間接的にプロセスの最大数を制限する場合もあります。これについては、プロセスとスレッドの制限に関する今後の投稿で説明します。

Windows サーバーのメモリの制限

Windows による物理メモリのサポートは、ハードウェアの制限、ライセンス、オペレーティング システムのデータ構造、およびドライバーの互換性によって決定されます。MSDN の 「Memory Limits for Windows Releases (Windows のリリース別のメモリ制限)」 (英語) では、Windows のバージョン別、および同じバージョンの SKU 別のメモリ制限について説明しています。

物理メモリのサポートは、Windows のすべてのバージョンにおいて、サーバー SKU のライセンスによって異なっていることがわかります。たとえば、32 ビット版の Windows Server 2008 Standard では 4 GB までしかサポートされませんが、32 ビット版 Windows Server 2008 Datacenter では 64 GB までサポートされます。同様に、64 ビット版 Windows Server 2008 Standard では 32 GB がサポートされますが、64 ビット版 Windows Server 2008 Datacenter では 2 TB まで処理できます。2 TB のシステムの数はそう多くはありませんが、Windows Server Performance Team では、チームのラボで一時期使用していたものを含め、いくつか存在していることを認識しています。このシステムでタスク マネージャーを実行したときのスクリーンショットを以下に示します。

図 1

図 1 [拡大図]

Windows Server 2003 Datacenter Edition でサポートされる物理メモリが 32 ビット版で最大 128 GB という制限は、メモリ マネージャーが物理メモリを追跡するために使用する構造が、大規模なシステムではシステムの仮想アドレス空間を大量に消費してしまうことによるものです。メモリ マネージャーはメモリの各ページを PFN データベースと呼ばれる配列で追跡し、パフォーマンスのために PFN データベース全体を仮想メモリにマップします。メモリ マネージャーはメモリの各ページを 28 バイトのデータ構造で表すので、128 GB のシステムの PFN データベースでは約 930 MB が必要になります。32 ビット版 Windows では、ハードウェアによって 4 GB の仮想アドレス空間が定義されており、既定ではそれを現在実行中のユーザー モード プロセス (メモ帳など) とシステムとで分割します。980 MB というサイズは、2 GB のシステム仮想アドレス空間の約半分を消費し、カーネル、デバイス ドライバー、システム キャッシュ、およびその他のデータ構造のマッピングには 1 GB しか残されないため、このような制限は理にかなっているといえます。

図 2

図 2

また、メモリ制限の表で、同じ SKU でも 4 GB チューニング (4 GT と呼ばれ、Boot.ini の /3 GB または /USERVA、および Bcdedit の /Set IncreaseUserVa ブート オプションによって有効になります) を使用してブートした場合の制限が低くなっているのもこのためです。4 GT によって分割ラインが移動され、ユーザー モードに 3 GB が割り当てられて、システムには 1 GB しか残されないからです。パフォーマンスを向上させるために、Windows Server 2008 では、32 ビットの最大物理メモリのサポートを 64 GB に縮小して、システム アドレス空間を確保しています。

メモリ マネージャーは、必要に応じて PFN データベースの一部をシステム アドレスにマップすることによってより多くのメモリに対応できますが、追加されたマップ操作やマップ解除操作のオーバーヘッドによって、複雑さが増大し、パフォーマンスが低下する可能性があります。このようなことを考慮しなければならないほどシステムが大規模になったのは最近のことですが、64 ビット版 Windows では、PFN データベース全体をマップする場合にシステム アドレス空間は制約条件にならないので、64 ビット版 Windows ではより多くのメモリのサポートが可能です。

64 ビット版 Windows Server 2008 Datacenter の最大 2 TB という制限は、実装やハードウェアの制限によるものではありませんが、マイクロソフトがサポートできるのはテスト可能な構成のみとなります。Windows Server 2008 のリリース時点で利用可能な最大システムは 2 TB であったため、Windows で使用できる物理メモリの制限がこのサイズに設定されました。

Windows クライアントのメモリの制限

64 ビット版 Windows クライアント SKU では、各 SKU の機能的な差別化要素として、サポートするメモリの容量が異なります。ロー エンドの Windows XP Starter では 512 MB ですが、Vista Ultimate では 128 GB、Windows 7 Ultimate では 192 GB となります。一方、32 ビット版 Windows クライアント SKU (Windows Vista、Windows XP、Windows 2000 Professional など) はすべて、最大 4 GB の物理メモリをサポートします。4 GB は標準的な x86 メモリ管理モードでアクセス可能な最大物理アドレスです。当初は、クライアント上での 4 GB を超えるメモリのサポートは、考慮することさえ必要ではありませんでした。これほどの容量のメモリは、サーバーでも搭載されていることがまれだったからです。

しかし、Windows XP SP2 が開発される頃には、4 GB を超えるクライアント システムの出現が予測されるようになり、Windows チームでは 4 GB を超えるメモリを搭載したシステムで Windows XP の幅広いテストを開始しました。また、Windows XP SP2 の場合、非実行メモリを実装するハードウェアでは既定で物理アドレス拡張 (PAE: Physical Address Extensions) のサポートが有効になりました。これは、データ実行防止 (DEP: Data Execution Prevention) が必要であるためですが、これにより 4 GB を超えるメモリのサポートも有効になります。

しかし、多くのシステムでクラッシュやハングが発生したり、ブート不可能になることがわかりました。これは、一部のデバイス ドライバー (一般的に、クライアントには存在し、サーバーには存在しないビデオ デバイスやオーディオ デバイスのドライバー) が、4 GB を超える物理アドレスを想定してプログラミングされていないことが原因です。その結果、ドライバーはこのようなアドレスを切り捨てるので、メモリの破損や破損の副作用が発生します。サーバー システムでは、通常、より汎用性の高いデバイスと、シンプルで安定したドライバーを使用するので、一般的にこの問題の影響を受けません。問題のあるクライアント ドライバーのエコ システムでは、クライアント SKU では、理論的にはアドレス可能であっても、4 GB を超える範囲の物理メモリを無視するという結論に達しました。

32 ビット クライアントでの実効的なメモリ制限

32 ビット クライアント SKU のライセンス上の制限は 4 GB ですが、実効的な制限はさらに強くなります (システムのチップセットや接続されているデバイスに依存します)。これは、物理アドレス マップには RAM だけではなくデバイス メモリも含まれており、x86 および x64 システムでは、4 GB のアドレス境界以下の範囲にすべてのデバイス メモリをマップして、4 GB を超えるアドレスを処理できない 32 ビット オペレーティング システムとの互換性を維持していることによるものです。システムに 4 GB の RAM と、合計 500 MB のデバイス メモリを必要とするデバイス (ビデオ、オーディオ、およびネットワーク アダプターなど) が存在する場合、次の図のように、4 GB の RAM のうち 500 MB は 4 GB のアドレス境界以下の部分に配置されます。

図 3

図 3

その結果、3 GB を超えるメモリを搭載したシステムで、32 ビット Windows クライアントを実行している場合、すべての RAM を利用できないことがあります。Windows でアクセス可能な RAM の容量は、Windows 2000、Windows XP、および Windows Vista RTM では、[システムのプロパティ] ダイアログ ボックスやタスク マネージャーの [パフォーマンス] ページで、Windows XP および Windows Vista (SP1 を含む) では、Msinfo32 ユーティリティや Winver ユーティリティで、それぞれ確認できます。Window Vista SP1 では、これらの一部の場所で、利用可能な RAM 容量ではなく、インストールされている RAM 容量が表示されるように変更されています。詳細については、この サポート技術情報の記事を参照してください。

私の 4 GB のラップトップでは、32 ビット版 Vista をブートした場合、利用可能な物理メモリの容量は、Msinfo32 ユーティリティに示されるように 3.5 GB になります。

図 4

図 4

物理メモリのレイアウトは、Alex Ionescu 氏 による Meminfo (英語) ツールで確認できます。Ionescu 氏は、私と David Solomon 氏 (英語)の共著である 『Windows Internals』 (英語) 第 5 版にも寄稿していただいています。システム上で -r スイッチを指定して Meminfo を実行し、物理メモリの範囲をダンプした場合の出力を以下に示します。

図 5

図 5 [拡大図]

ページ 9F0000 からページ 100000 までと、DFE6D000 から FFFFFFFF (4 GB) までのメモリ アドレス範囲が示されていないことに注意してください。しかし、64 ビット版 Vista を使用してこのシステムをブートすると、4 GB すべてが利用可能と表示され、4 GB の境界までの範囲にある残りの 500 MB の RAM がどのように Windows で使用されているかがわかります。

図 6 

図 6 [拡大図]

4 GB 未満の範囲の空白は何に使用されているのでしょうか。デバイス マネージャーを見れば、その答えがわかります。調べるには、"devmgmt.msc" を起動し、[表示] メニューの [リソース (接続別)] をクリックして、[メモリ] ノードを展開します。私のラップトップの場合、マップされたデバイス メモリを最も使用しているのは、当然ビデオ カードで、E0000000-EFFFFFFF の範囲の 256 MB を使用しています。

図 7

図 7 [拡大図]

その他のさまざまなデバイスが残りの大半を占めており、ファームウェアがブート時に使用する保守的な見積もりに基づいて、PCI バスではデバイス用の追加の範囲が予約されます。

4 GB 未満のメモリ アドレスの消費は、大容量のビデオ カードを搭載しているハイエンドのゲーム用システムで顕著です。たとえば、私がゲーム用コンピューター専門店で購入したシステムには、4 GB の RAM と 1 GB のビデオカードが 2 枚搭載されていました。OS のバージョンを指定しなかったのですが、64 ビット版の Vista がインストールされていると思っていました。ところが、インストールされていたのは 32 ビット版だったので、Windows では 2.2 GB のメモリにしかアクセスできませんでした。このシステムに 64 ビット版 Windows をインストールした後で Meminfo を実行したときの出力は次のとおりです。8FEF0000 ~ FFFFFFFF の巨大なメモリ ホールがあることがわかります。

図 8

図 8 [拡大図]

デバイス マネージャーを見ると、2 GB を超えるメモリ ホールのうちの 512 MB は、ビデオ カードに使用されている (それぞれ 256 MB) ことがわかり、動的なマッピングかあるいは保守的な見積もりのために、ファームウェアが必要以上にメモリを予約しているように見えます。

図 9

図 9 [拡大図]

2 GB 程度の少ないメモリのシステムであってもデバイス用に過剰にメモリ領域を予約するチップセットのために、32 ビット版 Windows の下ですべてのメモリを使用できない場合があります。自宅にある家族共用のコンピューターは数か月前に大手 OEM から購入したものですが、インストールされている 2 GB のメモリのうち、使用できるのは 1.97 GB だけであるとレポートされます。

図 10

図 10

7E700000 ~ FFFFFFFF の物理アドレス範囲は PCI バスおよびデバイスによって予約されているため、物理アドレス空間の理論最大値は 7E700000 バイト (1.976 GB) になりますが、その一部はデバイス メモリ用に予約されているので、Windows では 1.97 GB とレポートされます。

図 11

図 11 [拡大図]

現在では、デバイス ベンダーがドライバー署名証明書を取得するには、マイクロソフトの Windows Hardware Quality Laboratories (WHQL) に 32 ビットと 64 ビットの両方のドライバーを提出する必要があるので、現在のデバイス ドライバーの多くはおそらく 4 GB を超える物理アドレスを処理できるはずです。ただし、リスクの評価が難しい側面もあり、OEM は、この問題がない 64 ビット版 Windows に移行している (少なくとも、移行するべきである) ため、32 ビット版 Windows では 4 GB を超えるメモリは引き続き無視されます。

結論は、64 ビット版 Windows では、容量に関係なく、システムのメモリを (SKU の制限まで) 最大限に利用できるということと、ハイエンドのゲーム用システムを購入する場合は、工場で 64 ビット版 Windows をインストールするように必ず OEM に依頼するべきであるということです。

十分なメモリが搭載されているか

システムに搭載されているメモリの容量に関係なく、問題は、それが十分であるかどうかということです。残念ながら、これを確実に調べることができる絶対的な規則はありません。ただし、システムの "利用可能" メモリを長期間にわたって監視した結果に基づいた、特にメモリを大量に消費する作業負荷を実行する場合に使用できる、一般的なガイドラインがあります。Windows では、利用可能メモリを、プロセス、カーネル、またはデバイス ドライバーに割り当てられていない物理メモリと定義しています。名前が示すとおり、利用可能メモリは必要に応じてプロセスやシステムへの割り当てに利用できます。メモリ マネージャーは当然、メモリを ファイル キャッシュ (スタンバイ リスト) やゼロ メモリ (ゼロ ページ リスト) として使用して、メモリを最大限に活用しようとします。また、Vista のスーパーフェッチ機能は、データやコードをスタンバイ リストにプリフェッチし、近い将来使用される可能性があるデータやコードをすぐに使えるように優先します。

利用可能メモリが不足している場合、つまり、プロセスやシステムがアクティブに物理メモリを使用し、長期間にわたって 0 に近い状態が続く場合は、メモリを追加することによって恩恵が受けられる可能性があります。利用可能メモリを追跡する方法はたくさんあります。Windows Vista では、タスク マネージャーで [物理メモリの使用率の履歴] を見て、長期間にわたって 100% 近い状態になっていないかどうかを確認することによって、利用可能メモリを間接的に追跡できます。私の 8 GB のデスクトップ システムでタスク マネージャーを実行したときのスクリーンショットを以下に示します (どうやら、私の場合はメモリが多すぎるようです)。

図 12

図 12 [拡大図]

すべてのバージョンの Windows で、パフォーマンス モニターを使用して、[Memory] パフォーマンス カウンター グループの [Available Bytes] カウンターを追加することによって、利用可能メモリをグラフ化できます。

図 13 

図 13 [拡大図]

瞬間的な値は、 Process Explorer の [System Information] ダイアログ ボックス、または Vista 以前のバージョンの Windows では、タスク マネージャーの [パフォーマンス] ページで確認できます。

限界に挑む

CPU、メモリ、およびディスクの中で、一般的に、メモリはシステム全体のパフォーマンスとって最も重要です。メモリが多いほど、パフォーマンスは向上します。すべてのメモリを活用するためにとるべき方法は 64 ビット版 Windows を使用することであり、64 ビット版 Windows にはこれ以外のパフォーマンス上の利点もあります。これについては、今後の「限界に挑む」の投稿で、仮想メモリの制限についてお話しするときに説明します。

公開: 2008 年 7 月 21 日月曜日 7:28 PM 投稿者: markrussinovich (英語)

トップへ戻る

共有

ブログにコピー: ([Ctrl] + [C] でコピーしてください)

Mark's ブログ: 一覧

Mark Russinovichマーク・ルシノビッチ (Mark Russinovich)

マーク・ルシノビッチ氏は、マイクロソフトの Windows Azure チームのテクニカル フェローで、『 Windows Internals』、『 Windows Sysinternals Administrator’s Reference』、およびサイバー サスペンスの『 Zero Day: A Novel』の著者でもあります。連絡先は、 markruss@microsoft.com (英語のみ) です。

Mark's ブログ 日本語版は、 Mark's blog (英語) を翻訳したものです。