4

私は Linux の "swappiness" tuneable について読んでいます。これは、アプリケーションが使用されていないときに、カーネルがアプリケーションのメモリをディスクにスワップする方法を制御します。この用語を Google で検索すると、このような長所と短所について議論しているページがたくさん表示されます。論点を簡単に言うと、次のようになります。

swappiness が低すぎると、非アクティブなアプリケーションが、他のプログラムが使用する可能性のあるすべてのシステム メモリを占有します。

swappiness が高すぎると、非アクティブなアプリケーションを起動するときに、その状態がディスクから読み取られるため、大きな遅延が発生します。

この議論は私には意味がありません。大量のメモリを使用している非アクティブなアプリケーションがある場合、カーネルがそのメモリをディスクにページングし、そのデータの別のコピーをメモリ内に残さないのはなぜですか? これは両方の長所を生むようです: 別のアプリケーションがそのメモリを必要とする場合、その別のコピーがディスク上にあり、非アクティブなアプリケーションが起動されたときにスワップインできるため、すぐに物理 RAM を要求して書き込みを開始できます。上。また、元のアプリが起動すると、まだ RAM にあるページをディスクから取り出すことなく、そのまま使用できます。

または、何か不足していますか?

4

4 に答える 4

3

大量のメモリを使用している非アクティブなアプリケーションがある場合、カーネルがそのメモリをディスクにページングし、そのデータの別のコピーをメモリ内に残さないのはなぜですか?

やったとしましょう。ページをディスクに書き込みましたが、メモリに残しました。しばらくすると、別のプロセスがメモリを必要とするため、最初のプロセスからページを追い出したいと考えています。

ページがディスクに書き出されてから最初のプロセスがページを変更したかどうかを、絶対的に確実に知る必要があります。もしそうなら、私たちはそれをもう一度書き出さなければなりません。これを追跡する方法は、ページを最初にディスクに書き込んだときに、プロセスのページへの書き込み許可を取り除くことです。プロセスが再度ページに書き込もうとすると、ページ フォールトが発生します。カーネルは、書き込み許可を復元してアプリケーションの続行を許可する前に、プロセスがページをダーティにした (したがって、再度書き出す必要がある) ことに気付くことができます。

そこに問題があります。特にマルチプロセッサ マシンでは、ページから書き込み権限を奪うことは、実際にはいくらかコストがかかります。すべての CPU がページ変換のキャッシュを消去して、書き込み許可を確実に取り除くことが重要です。

プロセスがページに書き込みを行う場合、ページ フォールトを取得するとさらにコストがかかります。これらのページのかなりの数がその過ちを犯すことになり、メモリに残しておくことで、私たちが探していた利益を食いつぶすことになると思います.

それで、やる価値はありますか?正直なところわかりません。ページをメモリに残すことが、思ったほど明白な勝利ではない理由を説明しようとしています。

(*) この全体は、プロセスが fork() するときに使用される Copy-On-Write と呼ばれるメカニズムに非常に似ています。子プロセスは、いくつかの命令を実行して exec() を呼び出す可能性が非常に高いため、親ページをすべてコピーするのはばかげています。代わりに、書き込み権限が取り除かれ、子は単に実行できるようになります。ページ フォールトが発生することはほとんどないため、Copy-On-Write は有利です。ほとんどの場合、子はすぐに exec() を呼び出します。

于 2008-09-29T02:12:44.097 に答える
1

アプリのメモリをディスクにページングしてメモリに保持する場合でも、アプリケーションを「非アクティブ」と見なすタイミングを決定する必要があります。これが、スワッピングが制御するものです。ディスクへのページングは​​IOの点でコストがかかるため、あまり頻繁に実行する必要はありません。この方程式には別の変数もあります。それは、Linuxが残りのメモリをディスクバッファ/キャッシュとして使用するという事実です。

于 2008-09-29T01:05:02.107 に答える
0

この1によると、まさにLinuxが行っていることです。

私はまだこれの多くを理解しようとしているので、信頼できるリンクをいただければ幸いです。

于 2009-02-04T16:57:09.167 に答える
0

VM が最初に行うことは、ページをクリーンアップしてクリーン リストに移動することです。
匿名メモリ (実際のファイル バッキング ストアを持たないもの。/proc//maps 内のセグメントが匿名であり、その背後にファイル システム vnode ストレージがないことを確認できます) をクリーニングする場合、VM が最初に行うことは次のとおりです。 「ダーティ」ページを取得して「クリーン」にし、ページの内容を書き込んでスワップします。VM で完全に空きメモリが不足し、使用する新しい空きページを許可する能力について心配している場合、最近使用された時間とメモリの種類に基づいて、「クリーンな」ページのリストを調べることができます。これらのページは空きリストに移動されます。

メモリ ページがフリー リストに配置されると、以前の内容とは関連付けられなくなります。プログラムが以前にページが提供していたメモリ位置を参照する場合、プログラムは重大な障害を起こし、(おそらく完全に異なる) ページが空きリストから取得され、データがディスクからページに読み込まれます。これが完了すると、ページは変更されていないため、実際にはまだ「クリーン」です。VM が RAM 内の別のページのスワップでそのページを使用することを選択した場合、そのページは再び「ダーティ」になるか、アプリがそのページに書き込んだ場合は「ダーティ」になります。そして、プロセスが再び始まります。

また、swappinness は、ビジネス/トランザクション/オンライン/レイテンシーに敏感な環境のサーバー アプリケーションにとって非常に恐ろしいものです。多くのブラウザーや GUI を実行していない 16 GB の RAM ボックスがある場合、通常、すべてのアプリをほぼメモリに固定したいと考えています。RAM の大部分は、私が絶対に使用しない 8 ~ 10 GB の Java ヒープになる傾向がありますディスクにページングしたい、これまで、利用可能な残骸は mingetty のようなプロセスです (ただし、それらのアプリの glibc ページは他のアプリによって共有され、実際に使用されているため、それらの役に立たないプロセスの RSS サイズでさえ、ほとんどが共有され、使用されています)ページ)。私は通常、スワップのために実際にクリーンアップされた 16GB のうち、10MB 以上は見ません。サーバーのswappinessの数値を非常に非常に低くするか、swappinessをゼロにすることをお勧めします-未使用のページはRAM全体のごく一部である必要があり、バッファーキャッシュ用に比較的少量のRAMを再利用しようとすると、アプリケーションページがスワップされ、レイテンシーヒットが発生するリスクがあります実行中のアプリ。

于 2009-07-29T18:20:10.777 に答える