質問: linuxは「日和見スワップ」を実行しますか、それとも神話ですか? プログラムがメモリを要求したが、十分な空きメモリが残っていないとします。 linuxが応答する方法はいくつかあります。 1つの応答は、最近アクセスされていない他の使用済みメモリを選択し、この非アクティブなメモリをスワップに移動することです。しかし、これを超える記事やコメントがたくさんあります。空きメモリが大量にある場合でも、linuxは非アクティブなメモリをスワップに書き込むことを決定することがあります。事前にスワップへの書き込みを行うと、最終的にこのメモリを使用するときに、ディスクへの書き込みを待つ必要がなくなります。彼らは、これはパフォーマンスを最適化するための意図的な戦略だと言っています。彼らは正しいですか?それとも神話ですか?出典を引用してください。次の定義を使用して、この質問を理解してください。 スワップ 自由 memory free コマンドで表示される「空き」メモリ。これは、/proc/meminfoのmemfree値です。 /proc/meminfoは、カーネルによって提供される仮想テキストファイルです。 proc(5) または rhel docs を参照してください。 大量の空きメモリがある場合でも -議論のために、10%以上の空きメモリがあると想像してください。 参考文献ここにいくつかの検索用語があります: linux "opportunistic swapping" or(swap "when the system has no good better" "or when when or "システムがアイドル状態のとき" or "アイドル時間中") googleで2番目に高い結果で、stackexchangeユーザーは「ramに十分な空き容量があるのになぜスワップを使用するのですか?」と尋ね、約20%の空きメモリを示すfreeコマンドの結果をコピーします。この特定の質問への回答として、私はこの回答が非常に投票されているのを見る: linuxはramがいっぱいになる前にスワッピングを開始します。これは、パフォーマンスと応答性を向上させるために行われます。 ramは、プログラムメモリを格納するよりもディスクキャッシュに使用する方がよいため、パフォーマンスが向上します。そのため、しばらく使用されていないプログラムをスワップアウトし、代わりに頻繁に使用するファイルを保持することをお勧めします。キャッシュ。 メモリがいっぱいで、一部のプログラムが実行中であり、タスクを完了するためにさらにram=)を要求しているときではなく、システムがアイドル状態のときにページをスワップアウトすることにより、応答性が向上します。 もちろんスワッピングはシステムを遅くします—しかし、スワッピングの代替手段はスワッピングではなく、より多くのramまたはより少ないramを使用しています。 googleでの最初の結果は、上記の質問の複製としてマークされています:-)。この場合、質問者は16gbのうち7gb memfreeを示す詳細をコピーしました。質問には、独自の受け入れられ、賛成された回答があります。 空きメモリがない場合にのみスワッピングが発生するのは、swappinessを0に設定した場合のみです。それ以外の場合は、アイドル時にカーネルがメモリをスワップします。これを行う際、データはメモリから削除されず、スワップパーティションにコピーが作成されます。 これは、メモリが使い果たされた状況が発生した場合に、その場でディスクに書き込む必要がないことを意味します。この場合、カーネルはすでにスワップされているメモリページを上書きするだけでよく、そのため、データのコピーがあることがわかります。 swappinessパラメータは基本的に、これをどの程度行うかを制御するだけです。 他の引用は、スワップされたデータがメモリに保持されることを明示的に主張していません。しかし、20%の空きメモリがある場合でもスワップする場合、その方法を選択するように思われます。これを行う理由は、パフォーマンスを向上させるためです。私の知る限り、linuxは同じデータのコピーをメインメモリとスワップ領域の両方に保持することをサポートしています。また、「日和見スワッピング」は「アイドル時間中に」発生するという一般的な主張にも気付きました。この機能は一般的にパフォーマンスに優れていることを確信させるのに役立つと思います。上記の私の定義にはこれを含めません。ニースの明確な質問をするのに十分な詳細がすでにあるからです。これを必要以上に複雑にしたくありません。元の動機 ギガバイトの空きメモリがある場合、上部に「swout」(スワッピング)が表示されます。なぜですか? このように、空きメモリが十分にあるときにlinuxがswapに書き込むという報告がいくつかあります。 「日和見スワップ」はこれらのレポートを説明するかもしれません。同時に、少なくとも1つの代替原因が提案されました。考えられる原因を調べる最初のステップとして、linuxは上記で定義された「日和見スワップ」を実行しますか?私が報告した例では、質問が答えられました。原因は日和見交換ではありませんでした。
回答: いいえ、linuxには日和見スワップなどはありません。私はしばらく問題を見て、すべてのソース(教科書、カーネル開発者のメーリングリストのメール、linuxソースコードとコミットコメント、およびtwitterとmel gormanとのやり取り)が同じことを言っている:linuxのみが再利用している何らかの形のメモリプレッシャーへの応答としてのメモリ(ハイバネーションの明らかな例外を除く)。この話題に関するよくある誤解はすべて、linuxがスワップを開始する前に空きメモリの最後のバイトまで待つことができないという単純な事実に起因していると考えられます。極端な形のメモリの枯渇から保護するために、ある種のクッションが必要であり、そのクッションのサイズに影響を与える可能性のあるいくつかの調整パラメータがあります(例:vm.min_free_kbytes)。しかし、「やりたいことは何もないので入れ替え」と同じではありません。残念ながら、ページフレームの再利用アルゴリズムは2.6(mel gormanの本で詳細に説明されている場合)に比べてはるかに複雑になりましたが、基本的な考え方はほぼ同じです。ページの再利用は、失敗した割り当てによってトリガーされます。 kswapdをウェイクアップするか、ページを同期的に解放してみてください(メモリプレッシャー、割り当てフラグ、およびその他の要因によって異なります)。十分な空きメモリが残っている状態でページ割り当てが失敗し始める最も明白な理由は、実際にはメモリが断片化されすぎて要求を満たすことができず、連続メモリを要求している可能性があるためです。歴史的に、linuxカーネル開発者は、連続した割り当ての必要性を回避するために多大な努力を払いました。それにもかかわらず、一部のデバイスドライバーは、マルチページメモリi/o(スキャッターギャザーdma)を実行できないため、またはドライバー開発者によるずさんなコーディングである可能性があるため、依然としてそれを必要とします。 transparent huge pages(thp)の登場により、物理的に隣接するチャンクでメモリを割り当てるもう1つの理由が生まれました。ほぼ同じ時期に導入されたゾーン圧縮は、メモリの断片化の問題を解決すると思われますが、必ずしも期待した効果が得られるとは限りません。特定のケースで正確に何が行われているのかを理解するのに役立つさまざまなvmscanトレースポイントがあります。特定のコールスタックがある場合、linuxカーネルコードで必要なものを見つけるのは、探しているすべてをスキャンするだけでなく、常に簡単です。リモートで関連性があります。