1. 概要

この記事では、バッファキャッシュについて説明します。 バッファキャッシュは、Linuxが読み取り操作を高速化するために使用するメモリ領域です。 まず、バッファキャッシュの基本と、それが必要な理由について説明します。 次に、それをクリアして、占有されているメモリを再利用する方法について説明します。 最後に、サイズを制限する方法を示します。

2. バッファキャッシュ

基本的に、すべてのコンピュータプログラムはデータの読み取りと書き込みを行います。 データの転送速度はメディアによって異なり、全体のパフォーマンスやユーザーの応答時間に大きく影響します。 このため、Linuxはこれらのバッファキャッシュを使用したI/O操作の数を最小限に抑えようとします。

バッファキャッシュはメモリに存在するため、ディスクと比較して読み取りと書き込みがはるかに高速です。 このため、 Linuxは毎回ディスクにアクセスする代わりに、これらのバッファキャッシュへの書き込み操作を実行します。 次に、どのデータがキャッシュされているかを知るために簿記を行い、実際のディスクへのそのデータの定期的なフラッシュをスケジュールします

バッファキャッシュを使用すると全体的なパフォーマンスを大幅に向上させることができますが、メインメモリのかなりの部分を要求することがあります。これにより、そのメモリを再利用するときにレイテンシが追加される可能性があるため、に悪影響を及ぼします。実行中のプロセス。 次のセクションでは、これらのキャッシュを手動でクリアし、それらが占有できる最大サイズを制限することによって、その副作用を軽減する方法を検討します。

3. バッファキャッシュをクリアする方法

マシンで使用可能な物理メモリのほとんどを必要とするプロセスを起動する予定であると想像してください。 前のセクションで説明したことに基づいて、Linuxはこのメモリを再利用するためにバッファキャッシュをディスクにフラッシュする必要があります。 ただし、これには時間がかかるため、大幅な遅延が発生する可能性があります。 この問題を解決するために、これらのキャッシュをプロアクティブにフラッシュできます。

そのためには、procfsのdrop_cachesファイルに書き込む必要があります。これを行う方法を見てみましょう。

$ echo 3 > /proc/sys/vm/drop_caches 

procfs内のdrop_cachesファイルでは、フラッシュするバッファキャッシュファイルのタイプ選択できることに注意してください。

4. バッファキャッシュのサイズを制限する方法

前のセクションでは、バッファキャッシュをクリアする方法を見ました。 これは仕事をしますが、毎回手動で操作する必要があります。 より良いアプローチは、そもそもバッファキャッシュが成長するのを防ぐことです。 次の2つのセクションでは、それを行う2つの異なる方法を示します。

4.1. vm.vfs_cache_pressureの値を増やす

Linuxに、仮想ファイルシステムオブジェクトのキャッシュに使用するメモリをより積極的に取り戻すように指示できます。 より具体的には、 / proc / sys / vm / vfs_cache_pressureファイルの値を増やして、Linuxにdentryおよびinodeオブジェクトからメモリをページキャッシュおよびスワップと比較してより速く再利用するように指示できます。 。 iノードdentriesは、それぞれファイルとディレクトリを表すLinuxカーネル内のデータ構造です。

そのsysfsオプションのデフォルト値は100です。 データ集約型アプリケーションを実行しているシステムでこれを150や200などのより大きな値に設定すると、が役立つことが知られています。 次のコマンドを使用してこれを行うことができます。

$ echo 150 > /proc/sys/vm/vfs_cache_pressure

4.2. cgroupsで絶対制限を設定する

バッファキャッシュが使用するメモリの量を制限する別の方法は、コントロールグループ cgroups とも呼ばれます)を使用することです。 cgroups は、1つ以上のプロセスをグループ化して、使用するリソースを制限する方法を提供します。 したがって、その機能を活用してプロセスが取得できるメモリ量の上限を設定します。 新しいものを作成する方法を見てみましょう cgroup そのグループに属するプロセスが取得できる最大メモリを設定します。

まず、cgroupsv1とv2のどちらを使用しているかを確認する必要があります。これは、そのバージョンによってオプションが変わるためです。 ここでは、 cgroups v2が最近のものであるため、これに焦点を当てます。 cgroups v1の手順は、まったく同じです。

まず、fooという名前の新しいcgroupを作成します。

$ sudo cgcreate -t $USER:$USER -a $USER:$USER -g memory:/foo

上記のコマンドが使用できない場合は、ディストリビューションによっては、 cgroup-toolsまたはlibcgroup、をインストールする必要があります。 次に、そのcgroupの上限を2GBに設定しましょう。

$ sudo echo 2G > /sys/fs/cgroup/foo/memory.max

この制限は常にカーネルページサイズの倍数である必要があることに注意してください。 これが、正確に2GBにならない理由です。 次のコマンドを使用して、この制限が設定されていることを確認できます。

$ cgget -g memory:/foo/ | grep memory.max
memory.max: 2147483648

すべてが整っている fooに割り当てるすべてのプロセスは、最大2GBのメモリを占有します。

5. 結論

この記事では、バッファキャッシュのサイズを制限する方法を学びました。 Linuxカーネルに、バッファキャッシュメモリをより積極的に再利用するように指示する方法を示すことから始めました。 次に、 cgroups を利用して、プロセスが取得できるメモリ量の上限を設定しました。