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

Alibaba Cloud Linux:THP回収

最終更新日:Jul 10, 2024

透過的な巨大ページ (THP) の再利用機能を使用すると、メモリ不足 (OOM) エラーなど、THPによって引き起こされるメモリの問題を解決できます。 このトピックでは、THP再利用機能の実装に使用されるインターフェイスについて説明し、インターフェイスの使用方法の例を示します。

背景情報

Linuxオペレーティングシステムでは、メモリはページと呼ばれるブロックで管理されます。 通常のメモリページのサイズは4 KiBです。 THPは、サイズが2 MiBと1 GiBのメモリブロックです。 アプリケーションは、ますます多くのメモリを消費し、その結果、アドレス変換オーバーヘッドが高くなる。 アプリケーションがメモリを要求すると、カーネルはTHPを動的に割り当てて、変換ルックアサイドバッファ (TLB) のミスを減らし、アプリケーションのパフォーマンスを向上させます。

ただし、THPは記憶肥大を引き起こす可能性があります。 THP機能を有効にすると、カーネルはメモリの2MiBブロックをTHPとして割り当て、解放します。 各THPは512の4KiBページに相当します。 THPは高い記憶断片化を引き起こし、記憶肥大を引き起こす可能性があります。

メモリ膨張はOOMエラーを引き起こす可能性があります。 たとえば、8 KiBのメモリ (2つの4KiBページ) を要求するアプリケーションに2MiB THPが割り当てられている場合、THPには、アプリケーションが要求する2つの4KiBページと、ゼロページと呼ばれるゼロで満たされた510の4KiBページが含まれます。 これは、常駐セットサイズ (RSS) の著しい浪費を表し、OOMエラーにつながる可能性がある。

THPによって引き起こされるメモリの問題を解決するために、Alibaba Cloud Linuxはメモリ制御グループのTHP再利用機能を提供しています。 THP再利用機能は、THPをサブページに分割し、ゼロのサブページを再利用して、メモリ膨張によって引き起こされるOOMエラーを防ぎます。 しかしながら、THP再生機能は、メモリ性能を低下させ得る。

インターフェイス

次の表に、THP再利用機能の実装に使用されるインターフェイスを示します。

インターフェイス

説明

memory.thp_reclim

THP再利用機能を有効または無効にします。 有効な値:

  • reclaim: THP reclaim機能を有効にします。

  • swap: この値は将来使用するために予約されています。

  • disable: THP再利用機能を無効にします。

デフォルト値: disable。

memory.thp_reclaim_stat

THP再利用機能のステータスを照会します。 このインタフェースで使用されるパラメータ:

  • queue_length: 各ノードのキュー内のTHPの数。 THP再利用機能が有効になっている場合、THPは再利用キューに追加されます。

  • split_hugepage: 各ノードのTHP再利用機能によって分割されたTHPの総数。

  • reclaim_subpage: 各ノードのTHP再利用機能によって再利用されるゼロサブページの総数。

上記のパラメーターの値は、node0やnode1などのNUMAノードIDの昇順で左から右にリストされています。

memory.thp_reclaim_ctrl

THP再利用機能のトリガー方法を制御します。 このインタフェースで使用されるパラメータ:

  • threshold: THP内のゼロサブページの最大数。 THP内のゼロサブページの数がしきい値を超えると、THP再利用機能がトリガーされます。 デフォルト値: 16。

  • reclaim: THP reclaim機能をトリガーします。

/sys/kernel/mm/transparent_hugepage/reclaim

グローバルインターフェイス。 メモリ制御グループごとにTHP再利用機能を設定しない場合は、このインターフェイスを使用できます。 有効な値:

  • memcg: 各メモリ制御グループは、memory.thp_reclaimインターフェイス構成を使用します。 デフォルト値です。

  • reclaim: すべてのメモリ制御グループのTHP reclaim機能を強制的に有効にします。

  • swap: この値は将来使用するために予約されています。

  • disable: すべてのメモリ制御グループのTHP再利用機能を強制的に無効にします。

制限事項

次のカーネルバージョンを含むAlibaba Cloud Linuxイメージは、THP再利用機能をサポートしています。

  • Alibaba Cloud Linux 2: カーネル4.19.91-24.al7以降

  • Alibaba Cloud Linux 3: カーネル5.10.134-15.al8以降

説明

uname -rコマンドを実行して、イメージに含まれるカーネルのバージョンを確認できます。

THP再利用機能の設定

このセクションでは、THP再利用機能を設定する方法について説明します。 この例では、testという名前のメモリ制御グループが使用されます。

  1. 次のコマンドを実行して、testという名前のメモリ制御グループを作成します。

    sudo mkdir /sys/fs/cgroup/memory/test/
  2. 次のコマンドを実行して、testのTHP再利用機能を有効にします。

    sudo sh -c 'echo reclaim > /sys/fs/cgroup/memory/test/memory.thp_reclaim '
  3. 次のコマンドを実行して、THP再利用機能がテストで有効になっているかどうかを確認します。

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

    次のコマンド出力が返されます。 有効になる設定は、括弧 ([]) で囲まれています。 コマンド出力の [reclaim] は、THP reclaim機能がtestで有効になっていることを示します。

    image

  4. 次のコマンドを実行して、グローバルインターフェイスを使用してTHP再利用機能を強制的に有効にします。

    sudo sh -c 'echo reclaim > /sys/kernel/mm/transparent_hugepage/reclaim'

    次のコマンドを実行して、THP再利用機能を強制的に無効にします。

    sudo sh -c 'echo disable > /sys/kernel/mm/transparent_hugepage/reclaim'
    説明

    /sys/kernel/mm/transparent_hugepage/reclaimグローバルインターフェイスをreclaimまたはdisableに設定した場合、グローバルインターフェイスはmemory.thp_reclaimインターフェイスよりも優先されます。 メモリ制御グループのmemory.thp_reclaimインターフェイス設定は影響を受けません。

  5. 次のコマンドを実行して、memory.thp_reclaim_ctrlインターフェイスのthresholdパラメーターを設定し、テスト用THPのゼロサブページ数を制限します。

    sudo sh -c 'echo "threshold 32" > /sys/fs/cgroup/memory/test/memory.thp_reclaim_ctrl '

    この例では、閾値パラメータは32に設定される。 THP内のゼロ・サブページの数が32を超えると、THP回収機能のゼロ・サブページ回収サブ機能がトリガされてゼロ・サブページを回収する。

  6. THP再利用機能のゼロサブページ再利用サブ機能をトリガーします。

    THP再利用機能のゼロサブページ再利用サブ機能がトリガーされた後、ゼロサブページの数がしきい値を超えると、サブ機能は超過ゼロサブページを再利用します。 reclaimパラメーターの次の項目に注意してください。

    説明

    reclaimは、memory.thp_reclaim_ctrlインターフェイスにのみ書き込むことができ、THP reclaim機能のゼロサブページreclaimサブ機能をトリガーします。 catコマンドを実行して再利用設定を照会することはできません。

    • 次のコマンドを実行して、現在のメモリ制御グループのTHP再利用機能のゼロサブページ再利用サブ機能をトリガーします。

      sudo sh -c 'echo "reclaim 1" > /sys/fs/cgroup/memory/test/memory.thp_reclaim_ctrl '
    • 次のコマンドを実行して、現在のメモリ制御グループとその子制御グループのTHP再利用機能のゼロサブページ再利用サブ機能を再帰的にトリガーします。

      sudo sh -c 'echo "reclaim 2" > /sys/fs/cgroup/memory/test/memory.thp_reclaim_ctrl '

      reclaimをmemory.thp_reclaim_ctrlインターフェイスに書き込むことで、THP reclaim機能のゼロサブページreclaimサブ機能をトリガーできます。 THP再利用機能は、メモリ再利用によってトリガすることができる。

      • OOMエラーが発生すると、THP再利用機能のゼロサブページ再利用サブ機能がトリガーされます。

      • memcgバックエンド非同期再利用機能がトリガーされると、THP再利用機能のゼロサブページ再利用サブ機能がトリガーされます。 memcgバックエンド非同期再利用機能の詳細については、「Memcgバックエンド非同期再利用」をご参照ください。

  7. 次のコマンドを実行して、testのTHP再利用機能のステータスを確認します。

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

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

    queue_length 14
    split_hugepage 523
    reclaim_subpage 256207 

    上記のコマンド出力で:

    • queu_length: 14個のTHPがキューにあることを示します。

    • split_hugepage: 523のTHPがTHP再利用機能によって分割されることを示します。

    • reclaim_subpage: THP再利用機能によってゼロのサブページ256,207が再利用されることを示します。

THP再利用機能のテスト

このセクションでは、アプリケーションのTHPを要求するために使用されるサンプルCコードを提供します。 サンプルCコードを使用して、THP再利用機能が有効または無効になっているときにテストを実行し、異なるテスト結果を取得できます。

  1. 次のコマンドを実行して、memory.limit_in_bytesを1 GiBに設定します。

    sudo sh -c 'echo 1G > /sys/fs/cgroup/memory/test/memory.limit_in_bytes'

    次のコマンドを実行して、memory.limit_in_bytesの値を照会します。

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

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

    image

  2. 次のコマンドを実行して、memcgバックエンド非同期再利用機能を無効にします。

    memcgバックエンド非同期再利用機能の詳細については、「Memcgバックエンド非同期再利用」をご参照ください。

    sudo sh -c 'echo 0 > /sys/fs/cgroup/memory/test/memory.wma rk_ratio '
  3. THP再利用機能が有効および無効になっている場合、次のサンプルCコードを実行し、テスト結果を確認します。

    gcc -o test <test.c>

    <test.c> サンプルCコードのパラメーターを、ビジネス要件に基づいた実際の値に置き換えます。

    // The application requests 1 GiB of memory (512 THPs), in which 10 THPs contain zero subpages. 
    #include <stdlib.h>  // For posix_memalign
    #include <string.h>  // For memset
    #include <unistd.h>  // For pause
    
    #define HUGEPAGE_SIZE 4096 * 512
    int main()
    {
            int i, thp = 512;
            char *addr;
            posix_memalign((void **)&addr, HUGEPAGE_SIZE, HUGEPAGE_SIZE * thp);
    
            for (i = 0; i < 10; i++) {
                    memset(addr, 0xc, HUGEPAGE_SIZE >> 1);
                    addr += HUGEPAGE_SIZE;
            }
    
            for (; i < thp; i++) {
                    memset(addr, 0xc, HUGEPAGE_SIZE);
                    addr += HUGEPAGE_SIZE;
            }
    
            pause();
            return 0;
    }

    テスト中に、別の端末でdmesg -wHコマンドを実行して、システムのOOMエラーとメモリ使用量を検出できます。 テスト結果は、THP再利用機能が有効になっているかどうかによって異なります。

    • THP再生機能が有効になっている場合、この機能は以前に割り当てられたTHPをサブページに分割し、ゼロのサブページを再生します。 これにより、メモリ使用量が減り、OOMエラーが防止されます。

    • THP再利用機能が無効になっている場合、システムはTHPを分割したり、ゼロのサブページを再利用したりしません。 その結果、OOMエラーが発生する可能性があります。 カーネルログは、メモリ不足と、終了する可能性のあるプロセスの詳細を示します。

関連ドキュメント