8

私のマシン (XP、64) では、ASP.net ワーカー プロセス (w3wp.exe) が常に 5.5 GB の仮想メモリを予約して起動します。これは、ホストしている Web アプリケーションに関係なく発生します (aspx の空の Web ページであっても、何でもかまいません)。

仮想メモリのこの大きな古いチャンクは、プロセスの開始時に予約されているため、これはある種の段階的なメモリ「リーク」ではありません。

windbg を使って調べてみると、メモリがプライベート、予約済み、RegionUsageIsVAD であることがわかります。これは、VirtualAlloc を呼び出す誰かの作業である可能性があることを示しています。また、問題のメモリが、それぞれ 1GB の 4 つの大きなチャンクといくつかの小さなチャンク (それぞれ 1/4GB) で割り当て/予約されていることも示しています。

したがって、誰が VirtualAlloc を呼び出して、このすべてのメモリを予約しているのかを突き止める必要があると思います。それ、どうやったら出来るの?

w3wp.exe は svchost.exe (つまり、IIS/ASP.Net フィルター) によって起動されるプロセスであり、デバッグするために自分で起動しようとすると、メモリ割り当ての前にデバッガーをプロセスに接続するのは難しいです。この大量のメモリ予約なしで終了するだけです。また、コマンド ライン パラメータを再利用すると無効になります (呼び出しプロセスによって作成されたパイプであるため、これは理にかなっています)。

事後にwindbgをプロセスにアタッチできます(これが問題のメモリ領域を見つけた方法です)が、その時点で誰が何を割り当てたかを判断できるかどうかはわかりません。

4

3 に答える 3

7

David Wangは、同様の質問に対して次のように答えています

[...] ASP.Net パフォーマンス開発者は次のように語っています。

  • 予約済みの仮想メモリは心配する必要はありません。これは、CLR のパフォーマンス/キャッシュの前提条件と見なすことができます。また、高負荷テストでは、心配する必要がないことが示されています。
  • System.Windows.Forms - 空の Hello World ASPX ページでは取り込まれません。Microsoft Debugging Tools と "sx e ld system.windows.forms" を使用して、実行時に実際に何が取り込まれているかを特定できます。または、ildasm を使用して依存関係を見つけることができます。
  • mscorlib - GAC および NGen が適切に処理されていることを確認します。
于 2008-12-10T13:17:49.423 に答える
3

仮想メモリは、プロセスに割り当てられた単なるアドレス空間です。メモリ使用量とは関係ありません。

見る:

  1. 仮想メモリ
  2. Windows の限界に挑む: 仮想メモリ
  3. http://support.microsoft.com/kb/555223
于 2008-12-10T12:59:23.127 に答える
0

予約済みメモリは、割り当てられたメモリとは大きく異なります。メモリを予約すると、アドレス空間が割り当てられるだけです。物理ページはコミットされません。

このアドレス空間は、IIS によってそのヒープに割り当てられる可能性があります。必要な場合にのみページをコミットします。

本当に w3wp.exe を windbg から起動したい場合は、おそらく有効なコマンドライン引数を指定して起動する必要があります。Process Explorerを使用して、現在の w3wp.exe プロセスのコマンド ラインを確認できます。たとえば、私のサーバーでは、私のものは次のとおりでした。

c:\windows\system32\inetsrv\w3wp.exe -a \.\pipe\iisipmeca56ca2-3a28-452a-9ad3-9e3da7b7c765 -t 20 -ap "DefaultAppPool"

そこにあるUIDが何を指定しているのかはわかりませんが、おそらくW3SVCサービス(w3wp.exeを起動したもの)によってその場で生成され、そこで指定されたパイプに名前が付けられているようです。そのため、windbg から w3wp を起動する前に、必ずコマンド ラインを確認する必要があります。

于 2008-12-10T13:18:34.443 に答える