web-dev-qa-db-ja.com

Linuxは、ext4ジャーナル書き込みのキャッシュから、他の何よりも前に(たとえば、まったくスワップする前に)、役に立たない「バッファー」をどのように再利用するのですか?

私のラップトップは、約8GBのRAMのうち、/proc/meminfoおよびfree -w -hで「バッファ」としてカウントされる約256MBで動作する傾向があります。

メモリ使用量に興味があります。使いすぎると困ることがあります。 〜256MBの「バッファ」の使用についてはそれほど心配していませんが、興味があります。

どのソフトウェアがそれを使用しているかを調べましたが、使用法は(ほぼ完全に?)不要のようです8-)。 2つのext4ファイルシステムがマウントされており、それぞれのジャーナルサイズは128MBです。 〜256MBの「バッファ」の使用量は基本的にext4ジャーナルからのすべてのキャッシュされた書き込みです

各ファイルシステムのジャーナルファイル全体をキャッシュする必要がないことがわかります。 (ほとんどの場合、ジャーナルのごく一部に「ライブデータ」が含まれます!私はdata=journalledを使用していません)。この特定の不要な「バッファ」の使用法に興味があります。私は他の用途があるかもしれないことを理解しています、そしてそれらのいくつかはもっと必要かもしれません。例えば。私が知っている限りでは、が現在ライブデータを保持しているジャーナルの部分をキャッシュすると便利かもしれません。

調査していると、「バッファ」が小規模なシステムでは物理的なRAMの30%であることに気付きました。

私の質問は、メモリがanyの他の目的のために要求されたときに、Linuxがこれらの不要な「バッファ」の大部分を確実にドロップすることをどの程度うまく行うかです。ページキャッシュ?あなたの信念が基づいているという証拠を引用してください。

私は歴史的な違いには特に興味がなく、「現在の」システムの振る舞いだけに興味があります。興味があれば、私のラップトップは現在Fedora 28、カーネルバージョン4.18.16-200.fc28.x86_64を実行しています。 (または、小規模なシステムはDebian 9、カーネルバージョン4.9.0-8-marvellを実行しています)。

Linuxページキャッシュに関する詳細

「バッファ」の動作よりも、ページキャッシュの概念(/proc/meminfoおよびfree -w -hCached)に慣れています。

私は最近このスレッドを読み直しました: OSファイルキャッシュのためにLinuxカーネルで使用されているページ置換アルゴリズムは何ですか?

キャッシュされていないファイルページへのアクセス。キャッシュされていないファイルをコピーするときの読み取りと書き込みは、「非アクティブ」LRUリストにキャッシュされます。ページキャッシュからメモリを再利用する場合、カーネルは、最も最近使用されていない「非アクティブ」ページから開始することを好みます。古い可能性がある場合でも、複数回アクセスされたページである「アクティブ」ページよりもこれらを優先します。

特に、これにより、実行中のすべてのプログラムをスワップアウトすることなく、任意の大きなファイルコピーを実行できることに注意してください。重要なページは複数回アクセスされるため、実行中のプログラムの重要なメモリページはすべて「アクティブ」リストに含まれます。

これは、Linuxのメモリ管理の複雑さに対する最初の概算です。私はこれらの複雑さの専門家ではないので、ここでは「好む」のような漠然とした言葉を使用します。

理想的には、ページキャッシュを再利用する前に、不要な「バッファ」を最初に再利用したいと思います。 (「バッファ」をページキャッシュの一部として数える場合は、代わりに、キャッシュされた通常のファイルの前に不要な「バッファ」を再利用したいことを理解する必要があります)。

だから私は興味があります。不要な「バッファ」は、「非アクティブな」ページキャッシュの前に再利用されますか?または、「アクティブな」ページキャッシュの前に再利用される傾向があるとしか言えませんか?または、ページキャッシュと比較する前に、説明する必要のある詳細がありますか?

4
sourcejedi

これは通常起こることですが、明示的な設定があるためではなく、アクセス数が通常少ないためです。メモリサブシステムは、プロセスアドレス空間内のディスクブロック、物理メモリ、および仮想アドレスを相互にマッピングします。バッファまたはキャッシュページとプロセス割り当ての唯一の違いは、プロセスマッピングがあるかどうかです。

メモリが不足している場合は常に、最後のアクセスが最も前のメモリページを削除します。ディスクに最新のコピーがあるページから始めて、ディスクマッピングが存在し、書き込み可能なページに移動します。 、そして最後に、スワップスペースを割り当てることによって新しいディスクマッピングの作成を開始します。

このシステムでは、メモリが不足する前に、事前にスワップマッピングを作成しておくと便利です。システムがアイドル状態の場合、しばらくアクセスされていないページをディスクにコピーできますが、メモリにも残しておくことができます。

これは基本的にディスクブロックのキャッシュページと同じですが、プロセスからページにアクセスしてエビクションタイマーをリセットする可能性があるマッピングを除きます。プロセスがスリープ状態で、実行する作業がない場合は、通常、アクティブに使用されているキャッシュページではなく、このページを削除することをお勧めします。

多くのキャッシュは1回または2回しかアクセスされないため、特別なステータスを必要とせずに、ほとんどの場合、エビクションの候補として適しています。

1
Simon Richter