未使用のRAMが残っているのに、スワップ領域の一部が使用されているのはなぜですか?


9

問題よりも好奇心の方が多い。そして、私は認めますが、恥ずかしいほど基本的な質問です。

多くの場合、Linuxマシンでは、約600MBの未使用のRAMがあっても、約500MBのスワップ領域が使用されることに気づきました。

私の素朴な高レベルの理解は、RAMが使い果たされるまでスワップスペースが有効にならないことでした。

さらに進んで、この状況はLinuxカーネルの処理である必要があると仮定しました。これは、メモリを要求するユーザープロセスが論理的にのみ実行し、そのメモリがRAMまたはスワップスペースによって物理的にバックアップされているかどうかの概念がないためです。

なぜカーネルはスワップ空間を先制的に使用するのでしょうか?これはパフォーマンスチューニングアルゴリズムの一部ですか?アクセスされる可能性が最も低いと思われるメモリのディスク部分にスワップアウトしていますか(おそらくLRUスキーム)?もしそうなら、すべてをRAMに残し、枯渇に近づいたときにのみ、次にRAMからスワップスペースにLRU部分をスワップするだけで意味がありませんか?

明確にする必要があります。私のLinuxサーバーには2 GBのRAMと2 GBのスワップ領域があります。


1
なぜ4票でこの質問を閉じるのですか?

2
@アーロン:それはあなたが悪い質問をしているということではありません。パワーユーザーまたはサーバー管理者のどちらかとよりよく適合するように、システム管理の観点からそれを表現しました。好奇心としてそれについて不思議に思うことは、パワーユーザーPOVのように見えます。

回答:


11

RAM の未使用部分は、実際にはHDDキャッシュとして使用されます。考えてみれば、実際にはRAMの一部にアクセスするよりもディスクの一部を読み取ることが多くなります。RAMを使用してHDDデータをキャッシュしている間、このRAMをディスクに配置することは理にかなっています。


7

本当にメモリが必要なときは、カーネルがディスクアクセスを完了するまで待つ必要がないため、事前に交換することは理にかなっています。

たとえば、大きな画像を開きたいとしましょう。イメージがロードされると、300MBのRAMが必要になります。カーネルが可能なすべてのRAMを使用する場合、イメージをロードするには、カーネルがRAMからディスクに200MBを転送する必要があります。事前にRAMを事前に空にしておけば、数ミリ秒節約できます。


7

2つの理由:

  1. (@dtrosset)Linuxはプログラムの未使用ビットをスワップして、より多くのキャッシュとバッファーを提供します。
  2. 過去により多くのメモリを使用し、いくつかのものをスワップアウトした可能性がありますが、強制されたものがなくなったとしても、使用されていないためスワップインされていません。

1

他の答えに加えて、プログラムが使用していない場合でも、割り当てられたメモリのバッキングを要求するようにLinuxを構成できます。

ただし、メモリのオーバーコミットとOOMキラーの恐れは、Linuxエクスペリエンスの必要な部分ではありません。sysctlパラメータvm / overcommit_memoryを2に設定するだけで、オーバーコミット動作がオフになり、OOMキラーが永久にベイに保持されます。ほとんどの最新のシステムには、ほとんどの状況で十分なスワップファイルを提供するのに十分なディスク領域が必要です。オーバーコミットされたメモリが不足したときにペットプロセスが強制終了されないようにするのではなく、状況を完全に回避する方が簡単な場合があります。[ OOMキラーから一休み ]

プログラムがメモリを割り当てる場合、カーネルは単にスワップのより多くのページをコミット済みとしてマークできます。この指標はカーネルのメモリマネージャーに保存されます。実際のディスク領域はまだ変更されていません。そのメモリが使用されるまで、実際には何も交換する必要はありません。それらが使用されない場合、スワップの使用はパフォーマンスに影響を与えることなく変動します。

プロセスには独自のアドレス空間または「ビュー」が表示されるため(これが最初にswapが機能する方法です)、カーネルはそれを管理する方法に多くの余裕があります。上記のリンク先の記事のフォークの例を使用すると、未使用の大量のメモリを新たに割り当てるよりも共有メモリページを使用する可能性がはるかに高いため、メモリをコピーオンライトに割り当てて、スワップの使用数を増やすことができます。それが実際に書き込まれるとき(これは起こらないかもしれません)、その「コミットされたスワップ」は、未使用のRAMに置き換えることができます(RAMの使用を増やし、スワップの使用を減らします)。500MBが割り当てられ、すべてまたはほとんどすべてのRAMが使用されているマシンでforkするプロセスを想像してください。スワップで500MBが利用可能であり(ディスク容量が安い場合、今日のTBドライブの1%はどれくらいの大きさですか?:P)、メモリをコピーする必要はありません(まだ、

したがって、OOMキラーの可能性は回避され、メモリ割り当て(forkのようなものによる「暗黙の」割り当てを含む)がすぐに成功または失敗するという仮定でほとんどのソフトウェアを設計することははるかに簡単です。交換すると、パフォーマンスに影響を与える可能性があります。その影響はほとんど常にわずかですが、最悪の場合、スワップスラッシングにつながります(完全なカーネルクラッシュやOOMキラーよりも好ましい場合があります)。

Linuxのメモリマネージャがどのように機能するかについての正確な詳細はわかりませんが、この答えは私自身の一般的な理解であり、長年にわたって読んだことを覚えています。私はこの回答を再編集しようとしたので、OS設計の最小限の理解が必要です(これはかなり複雑であり、私自身にはあまり興味がありません)。それがどのように改善できるかを見て、私に知らせてください。握手に関して、それはそれほど恥ずかしいほど基本的な質問ではないかもしれません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.