スワップはいつ物理メモリに戻されますか?


8

Linuxでスワップが物理メモリに戻されるのはいつですか?オンデマンドのみですか?いつ必要ですか?または、コンピューターの負荷が高いときにスワップが物理メモリにゆっくり転送されますか?

回答:


7

オンデマンド。実際、Linuxはアイドル時に物理メモリをゆっくりとスワップに転送します(「スワップ」を参照)。


ありがとう。短い簡潔な答え。私はそれが好きです(他の人の努力が彼らの答えに入れられたことに感謝しますが)!
Ztyx

この答えは間違っています。問題は、メモリがページアウトされるのではなくページインされるときです。これは逆です。ページフォルトが発生すると、カーネルはディスク/スワップからページをリロードします。したがって、ほとんどがオンデマンドです。プロセスのすべての仮想メモリにアクセスして、ページフォールトをトリガーできます。その結果、ページはRAMにコピーされます。
user228505

7

通常の操作中、スワップからのデータはオンデマンドでメモリに読み込まれますが、他の回答もありますが、これが発生するケースがもう1つあります。それは、スワップコンテンツ全体を読み込むのに十分な物理メモリがある場合に、スワップスペースが無効になっている場合です。

ただやる:

swapoff -a

…そして、すべてのスワップデータがメモリに「戻ります」。副作用として、ディスクバッファー/キャッシュがフラッシュされる可能性があります。

時々swapoff -a ; swapon -a、たとえばバグのあるメモリリークプロセスの後、クラッシュする前に、より重要なプロセスを一掃することが望ましい場合があります。システムで実行中のプロセスがメモリにロードされ、スワップインを待機しないようにするためです。数分。


ああ、あなたは毎日良いことを学びます!ところで、「swapoff -a」は十分な物理メモリがないと失敗しますか?スワップオフの呼び出しに伴うリスクはありますか?
Ztyx

十分な物理メモリがない場合は失敗します。それでもリスクswapoffは失敗しませんが、システムはすぐにメモリ不足にswapoffなり、OOMはランダムプロセスを終了します(最悪の場合、シェルswaponまたはswaponコマンドを呼び出します)。実際にはほとんどありません。swapoff呼び出される前に多くのメモリがキャッシュによって使用されるため、両方のコマンドを実行するには十分なRAMが必要です。
Jacek Konieczny 2010年

7

他の人が指摘したように、ページは、必要に応じて(オンデマンドで)RAMにコピーされるだけで、キャッシュ/バッファーで利用可能なままにしておいたRAMを占有することはありません。

ページが移動されずにRAMにコピーされるという事実は重要であり、知らない場合は混乱を招く可能性があります。ページがまったく不要にならない(つまり、ページが完全に割り当て解除される)か、RAMで変更される(そのため、スワップ内のコピーが正しくなくなる)か、スワップが少なくなっている(および-diskブロックは、他のいくつかのページをスワップアウトするために必要です)。カーネルがディスク上に既に適切なコピーがあることを知っているので、このようにページを将来スワップアウトする必要がある場合、ディスク書き込みは不要です。これにより、使用可能なRAMが非常に少なくなったときに「スラッシング」を大幅に減らすことができますが、スワップ領域もありません。混雑。

あなたはからのRAMとスワップの両方に入っているどのように多くのページを見ることができますcat /proc/meminfo- SwapCachedラインはRAMで、ディスク上の両方の現在のページにあるデータの量です。現在のスワップが予想よりも多く使用していると思われる場合は、SwapCachedの値を確認してください。


以前に同様の問題をめぐる議論がありました。ただし、この特定の質問ではありません。参照してくださいserverfault.com/questions/100448/... SwapCachedを扱っています。
Ztyx

私はその答えを書いたことすら覚えていません...上記を入力する代わりに、おそらくそれにリンクする(またはコピー+貼り付ける)だけだったかもしれません...
David Spillett

0

これは通常、使用しているハードウェアにバインドされています。ほとんどのハードウェア(Intelを含む)では、MMUがプロセス全体を制御します。

プログラムがメモリを割り当てると、MMUにメモリを要求し、仮想アドレスを返します。次に、MMUはそのページをグローバルアドレス空間マップで「使用中」として登録します。

プログラムが実際にそのメモリ空間にアクセスすると、MMUはページをアドレスマップにルックアップします。そのページが「ライブ」メモリ内にある場合、プログラムの代わりにメモリの読み取り/書き込みを処理するOSに「ライブ」ポインタを送り返します。メモリが現在割り当てられていない場合は、ページ違反がトリガーされます。次に、このプロセッサ例外はOSによってキャッチされます。OSは、データがスワップファイル内のどこにあるかを把握し、物理メモリにロードして、ページをMMUに戻し、初期プロセスを続行できるようにします。

これは、メモリページがアクセスされない限り、スワップに入れられると「ライブ」メモリに戻らないことを意味します。そのため、通常、特定のメモリブロックをディスクにスワップせず、メモリに保持する必要があることをプログラムが指定できるOS APIがあります(Linuxについてはわかりませんが、WindowsではVirtualLock関数です)。 。


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