特定のプロセスのメモリをディスクにスワップ アウトしないように Windows に指示する方法はありますか?
メモリ使用量がかなり多い .Net Windows サービスです。大量の物理 RAM を取得しましたが、OS はとにかくプロセス メモリの一部をページファイルに移動するようです。
VirtualLockを使用してメモリがディスクにページングされるのを防ぐことができますが、OS にシステムのメモリを管理させたほうがよいと思います。それはかなり上手で、自分が何をしているのか本当にわからない限り、OS がディスクに何かをスワップしていた理由を推測することはできません。
デフォルトでは、VirtualLock は、ユーザーに許可を与えたとしても、急いでクォータを使い果たします (デフォルトでは、「メモリ内のページをロックする」のセキュリティ ポリシー設定にはエントリがありません (管理者でさえありません))。
これを構成する場合は、「プロセスのメモリ クォータを調整する」も設定する必要があります。
この質問は少しあいまいです。VM スペースのどの部分がスワップ アウトされないようにしたいですか? ヒープ/スタック/モジュールの?...?
全体として、私が過去に使用した1つの解決策は、移動できないREAD + WRITEの大きなセクションを持つDLLを作成することです。必要に応じてEXECUTEおよびSHAREDとマークすることもできますが、そのモジュールのセクションにHeapCreateします、ヒープとして使用できるようにします。
ここで設定する正確なビットを調べることができますIMAGE_SCN_MEM_NOT_PAGED
。うまくいくようです。
すべてのモジュールとセクションをこのビットでマークするプロセスを経ると、Windows モジュール ローダーは明確なユーザー クォータを請求したり、コードをデプロイする各システムでポリシー設定を変更する必要がなくなります。これらの NON_PAGEABLE dll に作成した HEAP へのアクセスを提供するには、特別な shim をコーディングする必要があります。
少し手間がかかりますが、以前はうまく機能していました。同じアドレスにある複数のプロセスにメモリを共有するという追加の要件がありました。
最も簡単な方法は、ページ ファイルを完全に無効にすることだと思います。しかし、これより前に、Vista/2008 以降の OS を使用している場合、表示されるスワッピングはスーパーフェッチが原因である可能性があり、近い将来何らかのアプリケーションを使用する必要があるという前提でシステムを積極的に「調整」している可能性があります。他のいくつかの簡単なタスクは、検索などの未使用のサービスを停止することです。これは、大量のファイルのインデックスを作成している可能性があります。また、システムタスクを構成する「タスクスケジューラ」に移動する必要があります。デフォルトでは、ほとんどのシステムに数十あります。すべてのワトソン博士のダンプを MS に送信するアクション、ドライブの最適化、およびその他の非常にメモリを集中的に使用する操作を実行します。
もう少し詳細に返信して、より良い回答を得ることができます...しかし、もう1つの提案は、単純に大容量のソリッドステートドライブを購入し、それをスワップ専用に使用することです.これらは時間の経過とともに全体的なパフォーマンスが低下することに注意してください.すべての既存の SSD テクノロジーに共通する不良ブロック マッピング。
私は最近、彼らのページから「非ページclrホスト」と呼ばれるコードプレックスプロジェクトに出くわしました:
実装実装の観点から、非ページ CLR ホストは SetProcessWorkingSetSize、 SetProcessWorkingSetSizeEx (Windows Server 2003 以降の場合)、およびVirtualLock API を使用して、割り当てられたメモリが物理メモリにロックされるようにします。上記の API を使用しても、ページングが発生しないという絶対的な保証はありませ ん。 代わりに、 非常に例外的なシナリオで発生する可能性を最小限に抑えます。私たちが実施したいくつかの負荷テストでは、システム全体が物理メモリの不足によって占有された場合でも、プロセスでページフォールトは観察されませんでした。 非ページ CLR ホストを使用します。
問題のページがメモリから削除されていることは確かですか? VM サブシステムが削除せずにダーティ ページを積極的にディスクに書き込んでいる可能性があるため、将来の割り当てのレイテンシが低くなります。
また、システムが大量の IO を実行している場合、Martin Poolが説明しているように、問題のメモリをアプリケーション データではなくバッファに使用する方がパフォーマンスが向上する可能性があります。