Transparent Huge Pages (THP) 機能は、Linuxカーネルの一般的な機能です。 THPは、小さなページ (典型的には4KBのページ) を巨大なページ (典型的にはサイズが2 MB以上のページ) に統合して、ページテーブルエントリ (PTE) の数およびメモリアクセスの数を減らすことができる。 このようにして、変換索引バッファ (TLB) キャッシュに対する圧力が低減され、アプリケーション性能が改善される。 このトピックでは、THP機能を使用してAlibaba Cloud Linuxのシステムパフォーマンスを向上させる方法について説明します。
THP関連の設定
Alibaba Cloud Linux 2カーネルバージョン4.19.81-17.2
以前では、デフォルトでmadvise
がTHPに使用されています。これは、THP機能が制限されていることを示しています。 この設定は、Red Hat Enterprise Linux 7、CentOS 7、Amazon Linux 2などの他の主要なオペレーティングシステムとは異なります。 Alibaba Cloud Linux 2カーネルバージョン4.19.91-18
以降、主要なオペレーティングシステムのデフォルトシナリオとの互換性を確保するために、デフォルトでは常に
THPに使用されます。これは、THP機能がシステムでグローバルに有効になっていることを示しています。
グローバル設定
Alibaba Cloud Linuxカーネルでは、THP設定ファイルのディレクトリは /sys/kernel/mm/transparent_hugepage/enabled
です。 次のいずれかのオプションを使用できます。
always
THPはグローバルに有効です。
never
THPはグローバルに無効になっています。
madvise
THPは、
madvise()
システムコールによって呼び出され、MADV_HUGEPAGE
によってフラグが立てられたメモリ領域でのみ有効になります。説明アプリケーションが
MADV_HUGEPAGE
によってフラグが立てられると、カーネルは、アプリケーションがメモリ割り当てのために透過的な巨大ページを必要とすることを知る。
デフラグ設定
グローバル構成に加えて、システムは以下のTHP関連のデフラグ構成を提供する。
THPデフラグ: THPデフラグは、システム内の小さなページを透明な巨大ページにマージできます。 これにより、メモリの断片化が減少し、システムパフォーマンスが向上します。
khugepagedデフラグ: khugepagedは、透明な巨大なページ管理とデフラグに使用されるカーネルスレッドです。 これにより、メモリの断片化が減少し、システムパフォーマンスが向上します。 khugepagedは、システム内の透明な巨大ページを監視し、散在する透明な巨大ページをより大きなページにマージしようとします。 これにより、メモリ利用率とパフォーマンスが向上します。
Khugepagedデフラグは、既存の透明な巨大なページを管理およびデフラグします。 THPデフラグは、散在する小さなページを大きなページにマージしようとします。 どちらの構成も、ページをマージすることでメモリの断片化を減らし、メモリ使用率とパフォーマンスを向上させます。 次の説明を参照してください。
THPデフラグ
ページフォールトが発生すると、この機能は、直接再利用、バックグラウンド再利用、直接コンパクション、およびバックグラウンドコンパクション操作を実行して、メモリ使用量を制御します。 この機能を有効または無効にする設定ファイルのディレクトリは、/sys/kernel/mm/transparent_hugepage/defrag
です。 次のいずれかのオプションを使用できます。
always
システムが透過的な巨大ページを割り当てることができない場合、メモリ割り当ては一時停止され、システムが直接再利用および直接圧縮を実行するのを常に待つ。 直接再利用および直接圧縮が完了した後にシステムが十分な連続した空きメモリを有する場合、システムは透過的な巨大ページを割り当て続ける。
defer
システムが透過的な巨大ページを割り当てることができない場合、システムは通常のページを割り当てる。 ページサイズは4 KBです。 一方、kswapdカーネルデーモンを起動してバックグラウンド再利用を実行し、kcompactdカーネルデーモンを起動してバックグラウンドコンパクションを実行します。 これらの操作が一定期間実行された後、システムに十分な連続した空きメモリがある場合、khugepagedカーネルデーモンは、以前に割り当てられた通常のページ (サイズ4 KB) を透過的な巨大ページ (サイズ2 MB) にマージします。
madvise
madvise()
システムコールによって呼び出され、MADV_HUGEPAGE
によってフラグが立てられたメモリ領域では、メモリ割り当ての動作はalways
オプションと同じです。 他のメモリ領域では、ページフォルトが発生すると、システムは代わりに通常のページを割り当てる。 ページサイズは4 KBです。説明Alibaba Cloud Linux 2カーネルバージョン
4.19.81-17.2
以降の場合、システムのデフォルトオプションはmadvise
です。defer + madvise
madvise()
システムコールによって呼び出され、MADV_HUGEPAGE
によってフラグが立てられたメモリ領域では、メモリ割り当ての動作はalways
オプションと同じです。 他のメモリ領域では、メモリ割り当ての動作はdefer
オプションと同じです。決して
デフラグは無効です。
khugepagedデフラグ
khugepagedデフラグの次の設定項目を参照してください。
機能の有効化または無効化
この機能を有効または無効にする設定ファイルのディレクトリは、
/sys/kernel/mm/transparent_hugepage/khugepaged/defrag
です。 次のいずれかのオプションを使用できます。0
khugepagedデフラグは無効です。
1
オプション
1
を使用すると、システムはシステムがアイドル状態になっているときに定期的にkhugepagedカーネルデーモンを起動し、連続する通常ページ (サイズ4 KB) を透過的な巨大ページ (サイズ2 MB) にマージしようとします。説明Alibaba Cloud Linux 2カーネルバージョン
4.19.91-18
以降では、システムのデフォルトオプションは1
です。この操作はメモリディレクトリをロックし、khugepagedカーネルデーモンがスキャンを開始し、間違った時間に通常のページを透過的な巨大なページに変換する可能性があります。 したがって、この操作はアプリケーションのパフォーマンスに影響を与える可能性があります。
再試行間隔
khugepagedカーネルデーモンのリトライ間隔。 THPの割り当てが失敗した場合、khugepagedカーネルデーモンは指定された期間待機してから、透過的な巨大ページの割り当てを再開します。 これは、短時間での連続的なTHP割り当ての失敗を回避するのに役立つ。 デフォルト値:
60000
単位:ミリ秒。 デフォルト値は60秒に相当します。 設定ファイルのディレクトリは/sys/kernel/mm/transparent_hugepage/khugepaged/alloc_sleep_millisecs
です。開始間隔
khugepagedカーネルデーモンの開始間隔。 指定された間隔に基づいて、khugepagedカーネルデーモンが起動します。 デフォルト値:
10000
単位:ミリ秒。 デフォルト値は10秒に相当します。 これは、システムが10秒ごとにkhugepagedカーネルデーモンを起動することを示します。 設定ファイルのディレクトリは/sys/kernel/mm/transparent_hugepage/khugepaged/scan_sleep_millisecs
です。スキャンするページ数
khugepagedカーネルデーモンは、毎回起動された後、指定されたページ数をスキャンします。 デフォルトのページ数は4096です。 設定ファイルのディレクトリは
/sys/kernel/mm/transparent_hugepage/khugepaged/pages_to_scan
です。
THP設定の推奨事項
THPのシステムパフォーマンスへの影響
THPは、TLBのヒット率を高め、PTEの数とメモリアクセスの数を減らすことができます。 これにより、システム性能が向上する。 THPは、アプリケーションを変更または構成することなく、O&M操作を簡素化し、ユーザーに気付かれないパフォーマンスの向上を実現します。 しかしながら、THPのリソースは限られている。 システムがTHP割り当てのボトルネックに達すると、システムが期待どおりに実行されるように特定のメカニズムを使用する必要があります。 この場合、デフォルト構成は、すべてのユーザシナリオに適しているとは限らない。 デフォルトの構成は、次のシナリオでシステムパフォーマンスに影響を与える可能性があります。
THPデフラグが
always
に設定されている場合、メモリが不足しているときに直接再利用または直接コンパクションが実行されます。これは、通常のページ (サイズ4 KB) の動作と同じです。 システムは両方の操作が完了するのを待ってから、ページを再度割り当てます。 これはシステムのパフォーマンスに影響します。khugepagedデフラグが
1
に設定されている場合、khugepagedカーネルデーモンがメモリをマージするときにメモリディレクトリがロックされます。 ビジネスのピーク時にkhugepagedデフラグがトリガーされると、メモリに敏感なアプリケーションのパフォーマンスが影響を受ける可能性があります。THPを有効にし、THPのデフラグとkhugepagedのデフラグを無効にすると、メモリ割り当てプロセスでアイドル状態のページリソースが通常のページ (サイズ4 KB) よりも速く消費される可能性があります。 これにより、メモリの再利用およびコンパクション操作が発生し、システムのパフォーマンスが低下します。
設定の推奨事項
THPがシステムパフォーマンスに与える影響は、シナリオによって異なります。 ビジネス、システム、およびアプリケーションの状況に基づいて設定を調整する必要があります。 次の例を参照してください。
変更を加える前に、データ損失を避けるために、構成ファイルをバックアップするか、ディスクスナップショットを作成してください。 ディスクのスナップショットを作成する方法の詳細については、「ディスクのスナップショットの作成」をご参照ください。
システムカーネルに十分なリソースが用意されている場合は、次のコマンドを実行して実験オプションdefer + madviseを有効にすることを推奨します。 これにより、kswapdカーネルデーモン、kcompactdカーネルデーモン、およびkhugepagedカーネルデーモンが可能な限り連携し、メモリ管理と安定したパフォーマンスのバランスをとることができます。
sudo bash -c "echo 'defer + madvise' > /sys/kernel/mm/transparent_hugepage/defrag"
khugepagedカーネルデーモンのCPU使用率が100% に達した場合、または近づいた場合、khugepagedカーネルデーモンの起動間隔をたとえば30秒に増やすことができます。 次のサンプルコマンドを参照してください。
sudo sh -c 'echo 30000 > /sys/kernel/mm/transparent_hugepage/khugepaged/scan_sleep_millisecs '
または、khugepagedカーネルデーモンを直接停止することもできます。 次のサンプルコマンドを参照してください。
sudo sh -c 'echo 0 > /sys/kernel/mm/transparent_hugepage/khugepaged/defrag'
データベースアプリケーションへの多数のアクセス要求、遅延に敏感な多数のアプリケーション、または多数の短期間の割り当てが必要なシナリオでは、システムの安定性がパフォーマンスよりも重要な場合は、THP機能を無効にすることをお勧めします。 システムの実行中にTHPを無効にする次のサンプルコマンドを参照してください。
sudo sh -c 'echo "never" > /sys/kernel/mm/transparent_hugepage/enabled '
説明このコマンドは、システムが稼働しているときだけ有効です。 システムが再起動されると、THP機能が有効になります。 THP機能を完全に無効にするには、rootユーザーとして次のコマンドを順番に実行して、カーネル起動パラメーターにTHP機能を無効にするパラメーターを追加します。
sudo grubby --args="transparent_hugepage=never" --update-kernel="/boot/vmlinuz-$(uname -r)" sudo reboot
THPの使用状況の表示
システムのTHP使用量は、主にシステムレベルまたはプロセスレベルで表示できます。
システムレベル
システムレベルでは、THPパラメータと構成オプションはシステム全体のすべてのプロセスに影響します。 次のコマンドを実行して、THPの使用状況を表示します。
cat /proc/meminfo | grep AnonHugePages
同様の結果が返されます。
AnonHugePages: 614400 kB
説明返された結果がゼロでない場合、いくつかの透過的な巨大ページがシステムで使用されます。
プロセスレベル: プロセスレベルでは、
madvise()
システムコールとMADV_HUGEPAGE
フラグを使用してTHPの使用を制御できます。 これにより、アプリケーションは、他のプロセスやシステム全体に影響を与えることなく、THP機能を個別に有効または無効にできます。 次のコマンドを実行して、特定のプロセスのTHP使用状況を表示します。sudo cat /proc/<PID>/smaps | grep AnonHugePages
説明<PID>
を、表示するプロセスのPIDに置き換えます。同様の結果が返されます。
AnonHugePages: 0 kB AnonHugePages: 0 kB AnonHugePages: 0 kB AnonHugePages: 0 kB AnonHugePages: 0 kB AnonHugePages: 0 kB AnonHugePages: 0 kB AnonHugePages: 0 kB AnonHugePages: 0 kB AnonHugePages: 0 kB
参考資料
THPの機能とリスクの詳細については、「透過的なHugepageサポート」をご参照ください。
巨大ページ機能は、THPと同様に機能して、通常2 MB以上のサイズの巨大ページのメモリ領域に連続したコードフラグメントを統合します。 Alibaba Cloud Linuxが提供する巨大ページ機能を使用して、システムパフォーマンスを向上させることもできます。 詳細については、「巨大ページ」をご参照ください。
THPを使用してRed Hat Enterprise Linux 7のシステムパフォーマンスを最適化する方法の詳細については、「透明な巨大ページの構成」をご参照ください。