すべてのプロダクト
Search
ドキュメントセンター

Alibaba Cloud Linux:ページキャッシュ制限機能

最終更新日:Jul 05, 2024

ページキャッシュ制限機能は、ビジネスのジッターや予期しないメモリ不足 (OOM) エラーなど、無制限のページキャッシュ使用によって引き起こされるシステムの不安定性の問題を解決するために、カーネルバージョン5.10.134-14以降のAlibaba Cloud Linux 3で提供されています。

背景情報

カーネルでは、memcgで指定されたメモリの上限に達すると、メモリが割り当てられ、メモリ制御グループ (memcg) で直接メモリ再利用がトリガーされます。 メモリ再利用は、現在のプロセスのパフォーマンスに影響を与える可能性があります。 この問題を解決するために、memcg backend asynchronous relaim機能が提供されています。 しかし、この特徴は、バースト・メモリ要求に対してはあまり効果的ではない。 Sparkフレームワークなどの特定のジョブが実行されている場合、大量のメモリがページキャッシュとして使用されます。 ページキャッシュ内のほとんどのページはダーティページです。 汚れたページはゆっくりと回収されます。 その結果、カーネルは、動作を継続するのに十分なメモリを得ることができず、OOMエラーが予期せずに発生する。 ビジネスの安定性を確保し、予期しないOOMエラーを防ぐには、ページキャッシュの使用を制限する必要があります。

Alibaba Cloud Linux 3では、ページキャッシュ制限機能が提供され、ルートメモリを含むメモリのページキャッシュ使用量を制限します。 ページキャッシュの制限機能を使用して、ページキャッシュの使用量の制限を指定し、制限を超えた場合は、非同期的または同期的に過剰なページキャッシュを再利用できます。 これにより、予想以上のメモリ量がページキャッシュに使用されるのを防ぎ、システムの安定性と信頼性を向上させます。

インターフェイス

インターフェイス

説明

/sys/kernel/mm/pagecache_limit/enabled

カーネルでページキャッシュ制限機能をグローバルに有効にするかどうかを制御するスイッチ。 有効な値: 0と1。 デフォルト値:0

  • 1: ページキャッシュ制限機能をグローバルに有効にします。

  • 0: ページキャッシュ制限機能をグローバルに無効にします。

/sys/fs/cgroup/memory/<Memcg directory name>/memory.pagecache_limit.enable

特定のmemcgのページキャッシュ制限機能を有効にするかどうかを制御するスイッチ。 有効な値: 0と1。 デフォルト値:0

  • 1: memcgのページキャッシュ制限機能を有効にします。

  • 0: memcgのページキャッシュ制限機能を無効にします。

/sys/fs/cgroup/memory/<Memcg directory name>/memory.pagecache_limit.size

特定のmemcgの最大ページキャッシュ使用率。 単位:バイト 有効な値: 0をmemcgに指定するmemory.limit_in_bytes値に設定します。 デフォルト値:0

  • 0: グローバルスイッチとmemcg固有のスイッチがオンになっているかどうかに関係なく、memcgのページキャッシュ制限機能を無効にします。

  • 0以外の値: memcgのページキャッシュ使用量をこの値に制限します。

    説明

    memcgのページキャッシュ使用率は、memcg内のすべての子memcgのページキャッシュ使用率の合計です。

/sys/fs/cgroup/memory/<Memcg directory name>/memory.pagecache_limit.sync

memcgがページキャッシュ使用量の制限を超えた場合に、非同期または同期再利用を実行するかどうかを制御します。 有効な値: 0と1。 デフォルト値:0

  • 0: 非同期再利用を実行します。 システムは、バックグラウンドで非同期再利用を実行するワークキューを作成します。 これにより、メインスレッドへの影響が軽減されます。

    説明

    ワークキューは、非同期ジョブ (バックグラウンドタスク) を管理および実行するためにカーネル全体で使用されるメカニズムです。 システムは、タスクをワークキューに追加してページキャッシュを非同期に再利用することにより、再利用タスクをバックグラウンドスレッドにオフロードします。

  • 1: 同期再利用を実行します。 同期再利用タスクは、現在のプロセスのコンテキストで実行され、プロセスをブロックし、ページキャッシュを直接再利用します。 その結果、プロセスのパフォーマンスが変動する可能性があります。

機能の仕組み

ページキャッシュ制限機能を有効にすると、この機能は次の原則に基づいてmemcgsで機能します。

  1. ページキャッシュがmemcgプロセスに割り当てられると、現在のmemcgがページキャッシュの使用制限を超えているかどうかを判断し、memcgから上方向に移動して親memcgのmemory.pagecache_limit値を階層的にチェックします。 親memcgのmemory.pagecache_limit値が0の場合、親memcgのページキャッシュ制限機能は無効になります。 ページキャッシュの使用は、親memcgとその子memcgに制限されません。

  2. 現在のmemcgがページキャッシュ使用量の制限を超えている場合、機能はmemory.pagecache_limit.sync値に基づいて同期または非同期の再利用を実行するかどうかを決定します。

  3. この機能はページキャッシュを再利用します。

    • 同期再利用: デフォルトでは、マップされていないファイルページのみを再利用できます。 カーネルが4回以上のスキャンを実行する場合、マッピングされたファイルページも再利用できます。

    • 非同期再利用: デフォルトでは、マップされていないファイルページとマップされたファイルページを再利用できます。 カーネルが3回以上のスキャンを実行すると、ダーティページを再利用できます。

      説明

      次のメモリページを使用できます。

      • マップされていないファイルページ: ファイルにマップされていないメモリページ。 ほとんどの場合、ページはメモリのプライベート領域であり、一時的なデータとプロセスを保持し、ディスクに永続化されません。

      • マップされたファイルページ: ファイルにマップされるメモリページ。 これらのページにより、プロセスはメモリ内のファイルデータを読み書きでき、ファイルへのランダムアクセスが可能になります。

      • ダーティページ: 変更されたマッピングされたファイルページ。 プロセスがマッピングされたファイルページにデータを書き込むと、ページはダーティとマークされます。 マークは、メモリ内のファイルコピーが変更され、ディスク上のファイルとは異なることを示します。 ダーティページは、データの永続性を確保するために定期的にディスクに書き戻されます。

image

インターフェイスの設定方法の例

この例では、20 MiBページキャッシュが作成され、ページキャッシュの使用量は10 MiBに制限されています。 ページキャッシュ制限機能を有効にした後、機能が期待どおりに機能するかどうかを確認します。

  1. Elastic Compute Service (ECS) インスタンスに接続します。

    詳細については、「パスワードまたはキーを使用したLinuxインスタンスへの接続」をご参照ください。

  2. 次のコマンドを実行して、ページキャッシュ制限機能をグローバルに有効にします。

    sudo sh -c 'echo 1 > /sys/kernel/mm/pagecache_limit/enabled '
  3. ページキャッシュ制限機能を有効にし、特定のmemcgのページキャッシュ使用量を制限します。

    1. 次のコマンドを実行してmemcgディレクトリを作成します。 例: /sys/fs/cgroup/memory/test/

      sudo mkdir -p /sys/fs/cgroup/memory/test/
    2. 次のコマンドを実行して、memcgのページキャッシュ使用量の制限を指定します。

      この例では、memcgのページキャッシュ使用制限は10,485,760バイト (10 MiBにほぼ等しい) に設定されています。

      sudo sh -c 'echo 10485760 > /sys/fs/cgroup/memory/test/memory.pagecache_limit.size'
    3. memcgのページキャッシュ再利用スキームを設定します。

      • 非同期再利用スキームを使用するには、次のコマンドを実行します。

        sudo sh -c 'echo 0 > /sys/fs/cgroup/memory/test/memory.pagecache_limit.sync'
      • 同期再生スキームを使用するには、次のコマンドを実行します。

        sudo sh -c 'echo 1 > /sys/fs/cgroup/memory/test/memory.pagecache_limit.sync'
    4. 次のコマンドを実行して、memcgのページキャッシュ制限機能を有効にします。

      sudo sh -c 'echo 1 > /sys/fs/cgroup/memory/test/memory.pagecache_limit.enable'
  4. ページキャッシュを作成します。

    1. 次のコマンドを実行してlibcgroupパッケージをインストールします。

      ページキャッシュを作成するには、cgexecコマンドが必要です。 ほとんどの場合、cgexecコマンドはlibcgroupパッケージの一部として提供され、インストールする必要があります。 システムでcgexecコマンドが使用できない場合は、libcgroupパッケージをインストールします。

      sudo yum install libcgroup-tools
    2. 次のコマンドを実行してページキャッシュを作成します。

      この例では、ddコマンドを使用して、1-MiBブロックを20回連続で書き込むことで、20-MiBページキャッシュを作成します。

      sudo dd if=/dev/zero of=./testfile bs=1M count=20 oflag=direct
      sudo cgexec -g "memory:test" cat. /testfile > /dev/null 
  5. ページキャッシュ制限機能が期待どおりに機能するかどうかを確認します。

    1. 次のコマンドを実行して、ページキャッシュの使用状況を確認します。

      grep cache /sys/fs/cgroup/memory/test/memory.stat

      次のコマンド出力が返されます。

      image.png

      上記のコマンド出力では、cacheは、ページキャッシュの使用量が10,543,104バイト (約10 MiB) に制限されていることを示しています。

    2. 次のコマンドを実行して、ページキャッシュ制限機能が期待どおりにページキャッシュを再利用するかどうかを確認します。

      cat /sys/fs/cgroup/memory/test/memory.exstat

      次のコマンド出力が返されます。

      image.png

      上記のコマンド出力で、pagecache_limit_reclaimed_kbは、10,108 KB (10 MiBにほぼ等しい) のページキャッシュが再利用されることを示します。

      検証結果は、20-MiBページキャッシュが作成され、ページキャッシュの使用量が10 MiBに制限されていることを示しています。 ページキャッシュの使用量が制限を超えると、ページキャッシュの10 MiBがページキャッシュ制限機能によって期待どおりに再利用されます。

      説明

      pagecache_limit_reclaimed_kbの値が予想よりも高い場合、これは、シーケンシャル読み取り操作中に先読みまたはプリフェッチされる不適切な量のデータが、ページキャッシュの過剰な再利用をもたらすためである可能性があります。 echo 128 | sudo tee /sys/block/<Disk device name>/queue/read_ahead_kbコマンドを実行して、ディスクのread_ahead_kbパラメーターを設定することを推奨します。 この例では、ディスクデバイス名としてvdaが使用されています。 read_ahead_kbパラメーターは、シーケンシャル読み取り操作中にカーネルが先読みまたはプリフェッチするキロバイト数を指定します。 次に、ページキャッシュ機能を再度確認します。