透過的な巨大ページ (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再利用機能の実装に使用されるインターフェイスを示します。
インターフェイス | 説明 |
| THP再利用機能を有効または無効にします。 有効な値:
デフォルト値: disable。 |
| THP再利用機能のステータスを照会します。 このインタフェースで使用されるパラメータ:
上記のパラメーターの値は、node0やnode1などのNUMAノードIDの昇順で左から右にリストされています。 |
| THP再利用機能のトリガー方法を制御します。 このインタフェースで使用されるパラメータ:
|
| グローバルインターフェイス。 メモリ制御グループごとに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という名前のメモリ制御グループが使用されます。
次のコマンドを実行して、testという名前のメモリ制御グループを作成します。
sudo mkdir /sys/fs/cgroup/memory/test/
次のコマンドを実行して、testのTHP再利用機能を有効にします。
sudo sh -c 'echo reclaim > /sys/fs/cgroup/memory/test/memory.thp_reclaim '
次のコマンドを実行して、THP再利用機能がテストで有効になっているかどうかを確認します。
cat /sys/fs/cgroup/memory/test/memory.thp_reclim
次のコマンド出力が返されます。 有効になる設定は、括弧 (
[]
) で囲まれています。 コマンド出力の[reclaim]
は、THP reclaim機能がtestで有効になっていることを示します。次のコマンドを実行して、グローバルインターフェイスを使用して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
インターフェイス設定は影響を受けません。次のコマンドを実行して、
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回収機能のゼロ・サブページ回収サブ機能がトリガされてゼロ・サブページを回収する。
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バックエンド非同期再利用」をご参照ください。
次のコマンドを実行して、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再利用機能が有効または無効になっているときにテストを実行し、異なるテスト結果を取得できます。
次のコマンドを実行して、
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
次のコマンド出力が返されます。
次のコマンドを実行して、memcgバックエンド非同期再利用機能を無効にします。
memcgバックエンド非同期再利用機能の詳細については、「Memcgバックエンド非同期再利用」をご参照ください。
sudo sh -c 'echo 0 > /sys/fs/cgroup/memory/test/memory.wma rk_ratio '
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エラーが発生する可能性があります。 カーネルログは、メモリ不足と、終了する可能性のあるプロセスの詳細を示します。