一部のX64 Win Server 2012 Webサーバーを実行しています(つまり、IIS 8))。
ボックスの空きメモリが常に5〜10%の空き容量になっていることに気づきました。実際には、これらのボックスで非常に多くのアプリケーションを実行しています(13のサイト、13のアプリプールで80のアプリ)。ほとんどのコードは、異なるデータベースと物理サイトに対応しているため、サイトごとに複製されますが、アプリケーションは同じです。
メモリが増え続けているため、アプリケーションでメモリリークが発生していると確信しているので、すぐにそれを調べていますが、私が混乱しているのは、IISのメモリ割り当てと管理です。 IIS 8サーバーまたはx64サーバー(最近x64に移行したばかり)では何か違うのだろうかと思います。
したがって、基本的に、各Webサーバーには6 GBのメモリがあり、5〜10%の空きメモリが搭載されます。リークしていると確信しているトップアプリケーションは、なんと1.2GBのメモリを使用していました。次は約800MBで、残りは平均で約400〜500MBです(これらの値はすべて、タスクマネージャーで表示されるようにプライベートメモリです)。それらは、物理的な場所が異なると一部の機能がオンまたはオフになる可能性があるということだけです。
問題を解決している間、問題が発生しないようにメモリを増やすことにしました。そこで昨夜、各サーバーを停止し、メモリを2倍にして12GBにしました。今朝、3台のサーバーは77%、80%、82%の使用済みメモリを使用しています。すべてのプロセスで、メモリ使用量が1.5〜2倍に増加しました。
だから今私は混乱しています。本当にメモリリークですか?または、ある種のメモリの事前割り当てはありますか?または、別のプロセスがSQL Serverを要求しない限り、メモリを解放することはありませんか?
メモリが2倍になったときにメモリレベルが突然大きくなった場合、メモリレベルを6GBに抑えていたのはなぜですか?設定されているしきい値はありますか? IIS/ASPは、メモリが少なくなるか、何が行われるまで、ガベージコレクションを実行しないのですか
どんな答えでも大歓迎です。
IIS)のデフォルトの出力キャッシュ構成は、カーネルモードとユーザーモードの両方のキャッシュを有効にします。
カーネルモードのキャッシュはネイティブHTTPドライバー(別名http.sys)によって管理され、非常に高速ですが、リクエストがに到達する前にキャッシュヒットに応答できる必要があるため、「パブリック」なコンテンツのみを提供できます。ウェブアプリケーション。
残念ながら、これは、許可されたセッション(認証が必要なWebサイトへのアクセスなど)を含め、多くの要求タイプをカーネルモードでキャッシュできないことを意味します。
あなたが説明するセットアップのタイプは、ある種のマルチテナンシークライアントサービスのように聞こえます。カーネルモードのキャッシュは考えられないものだと私は信じています。
一方、ユーザーモードキャッシュはアプリケーションレベルで管理され、キャッシュされたオブジェクトは、サービングワーカープロセスのメモリセットに格納されます。キャッシュの合計サイズは、 system.webServer/Caching
構成要素のmaxCacheSize
という属性によって管理されます。
デフォルトでは、maxCacheSize
属性は0
に設定されています。これは、大まかにLet IIS現在と同じ量のメモリを割り当てます。許容される。
連続する小さな(<256kb)ヒットがたくさんあるが、 uriキャッシュヒット率が低い 場合、IISは確実にすべてのメモリを消費しますあなたが提供します。
maxCacheSize
の値を小さくするか、サーバーの出力キャッシュを完全に無効にすることで、これが正しいかどうかを簡単にテストできます。
それでもアプリケーションにメモリの問題があると確信している場合は、パフォーマンスモニターを起動して、 "ASP.NETアプリケーション"パフォーマンスカウンターオブジェクトを確認してください。
GCカウンターを選択し、ガベージコレクションがどのように分散されるかを確認します。
Gen0コレクションはほぼすべての廃棄を表す必要がありますが、Gen1およびGen2コレクションの数が多い場合は、オブジェクトの有効期間が必要以上に長いという問題を示している可能性があります。これは、メモリ管理の失敗の一般的な症状です。