2009-04-05 10 views
3

ターミナルサービス環境で.NET 2.0 WinFormsアプリケーションを実行すると、予期しない結果が発生することがあります。私が読んだことはすべて、JITのアセンブリ(ネイティブイメージを作成するためにNGenを使用しない)がプライベートページに格納されるすべてのコードスペースをもたらし、ワーキングセットのサイズ/メモリの負荷を増加させることを示しています。しかし、実際の結果(プロセスエクスプローラ、VMMap、WinDbgを使って検証)は、JITのアセンブリでさえ実際に共有可能なページに置かれていることを示しています(アプリの複数のインスタンスが実行中の場合、セッション/ユーザー)。共有可能なページ内の.NET JITによるアセンブリ

誰でもこの理由を説明できますか?これはW2K8サーバ環境で実行されているため、ASLRは各アセンブリの特定のベースアドレスが不足している理由を説明します。&結果のリベースは問題を引き起こしません。それでも、これらがネイティブPEイメージではないという事実は、それらのアセンブリがプライベートページに格納されるコードになるはずです。

これは、私たちがNGenを使用してメモリの負荷を減らすために調査を開始したときに発見されましたが、実際にはJITのアセンブリが既に共有されていたため、作業セットのサイズが増えました。

私が見つけた最新の参照が再び私たちの実際の結果と異なっており、ここにある:

http://blogs.msdn.com/morgan/archive/2009/03/07/developing-net-applications-for-deployment-on-terminal-services-or-citrix.aspx

編集:私は、最初に質問を投稿以来、Windows上でより多くの実験をそのを追加する必要がありますServer 2003のテストボックスは、プロセス間で共有可能なJITのアセンブリを明らかに示しています。私は、私が見つけることができるすべてのアドバイスがNGenが必要であることを示しているのはなぜか分かりませんが、現実の証拠はすべてそれに反するものです。私は本当にここの専門家が光を放つことができると期待しています。

ありがとうございます!

編集:私はすべての.NET/CLRブックを削除してしまいました。この問題を解決するために検索クエリのアイデアがなくなりました。 "私は何が起こっているのか分からない"という恐ろしい気持ちをなくすのを手伝って、私の一日をつくってくれるだろう! :)

+0

NGenが実際にメモリ使用に役立つという確かな証拠(および私たちの環境での起動時間の影響はごくわずかです)を除いて、私たちはアセンブリのネイティブイメージを生成することを追及しないことに決めました。私はまだこの予期しない動作を見ている理由を知りたいです! – allgeek

答えて

4

あなたはモジュールページを直接見ていると思います。 JITコードを実行すると、DLLの下には表示されません。実行時に割り当てるメモリに表示されます。あなたが見ているモジュールページは主にメタデータとILです。なぜならそれらがまだ共有可能であるからです。

私は実験として、30Kの静的メソッドを生成して呼び出す小さなプログラムを作成しました。私のシステムでは、このプログラムのJITバージョンは8.2MBのプライベートコンパイル済みメモリを持っていますが、NGENバージョンは3.8です。

しかし、モジュールページ内であっても、NGENはメモリ使用を支援します。ランタイムがNGENイメージをロードできる場合、ランタイムはコードをJITするためにモジュールのメタデータを読み取る必要はありません。私のテストアプリケーションのJITバージョンは、2.3MBのワーキングセットを使用しています。 NGENバージョンは32キロバイトを使用しています。

NGENは起動時にも役立ちます。ウォームスタートアップ時間への影響は無視できますが、コールドスタートアップ時間(ディスクからすべてのページを読み込むことを保存する)への影響は目立つことがあります。

+0

お返事ありがとうございます!私は物事を分解し、より簡単なテストをしますが、私は同じ結果を見ていません。そして私が読んだこと(そして私が参照したブログの投稿)から、私は実際にモジュールページの違いを見なければなりません。 AFAIKでは、CLRはリフレクション、CASポリシーチェックなどをサポートするためにメタデータを読み取る必要があります。 NGENはそれを排除しません。 これは多くのユーザーが実行するTSサーバーベースのアプリケーションであるため、メモリの使用は重要ですが、コールドスタート時間は本質的に無関係です。 – allgeek

+0

問題ありません! Reflectionなどのメタデータアクセスはすべて怠惰です。これらのシナリオをサポートするために熱心に読み込まれるものはありません。 私は、TSシナリオでは、メモリ使用量が重要な要素であることを理解しています。 http://msdn.microsoft.com/en-us/magazine/cc163610.aspx(まだ読んでいない場合)を読むことをお勧めします。 モジュールページを見直したときは、size/commitedの代わりにvmmapのWSカラムを見てください。 WSは実際の使用ページサイズで、2.3MBから32KBのサイズです。がんばろう! –

関連する問題