web-dev-qa-db-ja.com

メモリがいっぱいになる前にWindows 2008がスワップを使用するのはなぜですか?

私は、IISおよび.NET4 Webアプリを実行しているWindows 2008サーバー(まあ、Amazon EC2で)を管理しています。先日、メモリアラートが表示されたので、確認しました。プロセスメモリは十分です。ある種の遅いリークによって時間とともに成長しました。60Mから200Mのように、それはそれほど成長しませんでしたが、かなり低いしきい値(75%)を超えて、モニター。

アプリのプールとメモリが解放されて再利用しましたが、統計を確認したところ、スワップ領域が大幅に使用されており、その再利用によって1 GB以上の空き領域が解放されたことがわかりました。

多分これは基本的な質問かもしれませんが、私はUNIXの男で、メモリ不足になるまでスワップに慣れずに慣れています。このボックスは、メモリ使用率が75%を超えたことはありません。これはWindowsのものか、.NETのものか、Amazonのものですか?このアプリには、想定よりもはるかに大きなメモリリークがあると思います。60Mから200Mにリークするのではなく、60Mから1.2GBにリークしますが、その多くは、「コールド」になり、交換のために押し出されていますか?

アプリケーションプールにメモリリサイクルを設定していますが、オフボックスのフルメモリをトリガーするため、このアプリは、自動的にリサイクルする前に非常に大きくなる可能性があります。

定期的な「時間指定」リサイクルを設定することもできますが、これは回避策です。開発者にアプリを修正してもらいますが、スワップの使用法でここで何が起こっているのかを理解して、この権利を確実に理解する必要があります。

詳細情報で編集:インスタンスメモリ:1.7 GBスワップ:4.5 GB

Taskmgrでw3wp.exeプロセスがメモリ:211,000kであることを示しています。しかし、それを再起動すると(それは独自のアプリプールにあり、ボックス上の唯一のアプリです)、メモリ使用量は通常の開始点の60Mまで下がり、1 GB以上のスワップも解放されました。 taskmgrで、通常のメモリ(プライベートワーキングセット)の統計を取得しましたが、他の監視(Cloudkick)でスワップの変更を確認しました。さかのぼって、今日見てみると、メモリはプロセス上で最大195M(1.2 GB合計)になり、スワップは1.0 GBから1.1 GBに急増しました。以前の状態に完全に戻るわけではありません(時間の経過によるグラフです。遅いクリープ)。

私はこの特定のアプリについてはそれほど心配せず、Windowsがいつスワップし、それがどのように使用されるかを理解すること、および特定のWindowsメモリとスワップの一般的な使用について何を心配するべきかについて、もっと心配しています。

9
Ernest Mueller

WindowsとLinuxには、2つの異なるページ/スワップ戦略があります。

Linux

Linuxは、スワップ領域の使用をまったく避けたいと考えており、可能な最後の瞬間まで待機します。 Linuxで大量のスワップが見られる場合は、システムに問題があるか、問題があった可能性があります。この戦略は、システムの最も遅い部分であるディスクI/O全体を最小限に抑えるのに適していますが、軽負荷と重負荷が交互に繰り返されるシステムでは弱くなります(正直なところ、それが私たちのほとんどです)。負荷がすでに重いときは、「余分な」ディスクI/Oによって負荷がかかるようになります。つまり、別の言い方をすると、サーバーのビルドを設計するときに、スワップ中にスワップしない十分なRAMを確保する必要があります。予想される最大の読み込み時間。

ウィンドウズ

Windowsは、メモリをページファイルの単なるキャッシュとして扱いたいと考えています。 realメモリは常にディスク上にありますが、可能な場合は最初に「キャッシュ」から読み取り/書き込みを行います。この戦略は、時間をかけて負荷を均等にするのに適しています。システムがビジー状態になり、ページをスワップする必要がある場合、現在のページはすでにディスク上にあり、作業の半分はすでに完了しています。このアプローチは、Windowsが若い頃には非常に理にかなっており、32 MB(GBを忘れて)はまだ大量のRAMであり、スワップスペースを頻繁に使用する必要性がありました。今日でも、これは、時間の経過とともにディスクI/Oをより均等に分散させるのに役立つので、負荷が軽い負荷と負荷が高い負荷の間で切り替わる作業負荷に適しています。

最新のWindowsバージョンには、SuperFetchなどの追加の最適化があり、メモリページをディスクにプリロードして準備し、ロードが他の場合は軽い場合はRAM)にして、追加のディスク書き込みの必要性を回避します。初めてプログラムをロードします。これはすべて、必要な最大負荷よりも小さいものに対して十分なRAMで十分にシステムを設計できるため、少なくとも許容可能なパフォーマンスをすべて維持できることを意味します。時間とコストを削減します。

収束

最初にテスト環境で負荷を測定または予測し、次に負荷がわかっているときに本番リソースを割り当てるというこの概念は、システム構築における比較的最近の開発であり、一部は仮想サーバー、次にクラウドサーバーの登場により可能になりました。 。負荷によっては、まったく交換する必要がないようにシステムを設計することもできます。このような場合、Windowsではページングをオフにして、Linuxシステムのように動作させることができます。ただし、注意が必要です。システム設計が予想よりも多くのメモリを必要とする場合、この方法で問題が発生する可能性があります。

一方、最近のLinuxカーネルは、以前よりも便宜的にディスクにスワップすることをいといません。したがって、2つのシステム間でのメモリ管理戦略の違いは依然として存在しますが、今では以前ほど明確ではありません。どちらのシステムにもメリットがあり、それぞれが他のシステムを監視して、コピーできる進歩を確認します。

17
Joel Coel

Windows(およびLinuxと他のUnix-aのようなOS)は、しばらく使用されていないページをディスクに移動して、バッファーとキャッシュのためのスペースを作り、アクティブなI/Oアクティビティを高速化します。また、アプリケーションは、すぐに使用するよりも多くのメモリを割り当てることがよくあります。これにより、カーネルが最近バックグラウンドで触れられていないものをページングするように促し、突然起動したときにページングの遅延が表示されないようにすることができます。その割り当てを使用します。

Linuxでは、/procファイルシステムの関連する "swappiness"値を変更することで、この動作を微調整(またはブロック)できます。この点に関してWindowsの動作を変更するために微調整できるレジストリ値があることは間違いありません。

もう1つ注意すべき点は、何かがページアウトされ、後で読み戻された場合、カーネルは、ファイルがいっぱいになるか、RAM =が変更されます。このように、そのチャンクを再度ページングする必要がある場合、実際にページをディスクに書き込む必要なしにページングを行うことができます。コンテンツはすでにそこにあります。これにより、メモリのオーバーコミットでパフォーマンスが大幅に向上します。ページファイルのスラッシング(かなりの数のページが絶えずマップされたり、マップアウトされたりする)を引き起こすのは悪いことです。メモリリークによって一部のデータが押し出され、ディスクから読み取られたが、ワイプされていないことがわかるでしょう。それらのページをマップアウトする必要がある場合、またはRAM後でスペースを確保するために。Linuxでは、/proc/meminfoの "SwapCached"値は、 RAMおよびディスク上の同一のコピー。Windowsは間違いなく同じ最適化(または類似の何か)を使用しますが、これがどの程度起こっているかを確認するためにどこを探すべきかは正確ではありません(クエリできる関連するパフォーマンスモニターカウンターがあることは間違いありません)。

tl; dr:これは正常です。最新のOSカーネルは賢く、最大量を最大化しようとしますRAMそれはI/O操作を保存するためのキャッシュとして使用でき、データがディスクとRAMこれらのビットをページアウトする必要がある場合にI/Oを節約するRAM後で。この2つのページファイルをこのように使用すると、直感的に理解できなくなる可能性があります。現在RAMが不足していない場合でも、パフォーマンスを低下させるのではなく、全体的なパフォーマンスを向上させる方法です。

7
David Spillett