メモリは、ページと呼ばれるブロックで割り当てられ、管理されます。 巨大なページは、サイズが4 KBを超えるメモリのブロックです。 透過的巨大ページ (THP) 機能の拡張と最適化として、巨大ページ機能を使用すると、アプリケーションとダイナミックリンクライブラリ (DLL) の実行可能部分を、通常2 MB以上のサイズの巨大ページに割り当てることができます。 このようにして、巨大ページ機能は、アプリケーションの命令変換索引バッファ (iTLB) ミスを大幅に削減し、CPUの2MBのiTLB利用率を向上させます。 巨大なページは、メモリの断片化やメモリの肥大化などの問題を防ぎ、メモリ使用量を改善するのに役立ちます。 巨大なページは、データベースや大規模なアプリケーションなど、大規模なコードセグメントを含むシナリオに最適です。 このトピックでは、巨大ページの使用方法と巨大ページのパフォーマンス上の利点について説明します。
巨大ページがアプリケーションパフォーマンスの向上に役立つ範囲は、プラットフォームとアプリケーションの実行方法によって異なります。
巨大なページに関連する一般的な用語については、「付録: 用語集」をご参照ください。
制限事項
次のカーネルバージョンを含むAlibaba Cloud Linuxイメージは、巨大ページをサポートしています。
Alibaba Cloud Linux 2: カーネル
4.19.91-25
以降Alibaba Cloud Linux 3: カーネル
5.10.112-11
以降
uname -r
コマンドを実行して、イメージに含まれるカーネルのバージョンを確認できます。
使用状況
巨大ページ機能を有効にする
デフォルトでは、巨大ページ機能は無効になっています。 sysfs
インターフェイスを使用して機能を有効にできます。 次のいずれかの方法を使用して、巨大ページ機能を有効にできます。
方法1: バイナリページと動的ライブラリページを有効にします。
sudo sh -c 'echo 1 > /sys/kernel/mm/transparent_hugepage/hugetext_enabled '
方法2: 匿名実行可能ページを有効にします。
sudo sh -c 'echo 2 > /sys/kernel/mm/transparent_hugepage/hugetext_enabled '
方法3: バイナリページ、動的ライブラリページ、および匿名実行可能ページを有効にします。
sudo sh -c 'echo 3 > /sys/kernel/mm/transparent_hugepage/hugetext_enabled '
巨大ページ機能は非同期です。 メモリページは、機能が有効になった直後に巨大なページにマージされません。
巨大ページ機能が有効になっているかどうかを確認する
次のコマンドを実行して、/proc/<pid>/smapsのFilePmdMapped
フィールドを確認し、巨大ページ機能が有効になっているかどうかを確認します。 FilePmdMapped
フィールドは、プロセスによって使用される巨大なページのサイズを指定します。 (単位:KB)
sudo cat /proc/<pid>/smaps | grep FilePmdMapped | awk '{sum +=$2}END{print "Sum= ",sum}'
<pid>
を実際のプロセスIDに置き換えます。 pidof sshd
コマンドを実行して、プロセスIDを照会できます。
巨大なページ機能を無効にする
次のコマンドを実行して、sysfs
インターフェイスを使用して巨大ページ機能を無効にします。
sudo sh -c 'echo 0 > /sys/kernel/mm/transparent_hugepage/hugetext_enabled '
巨大ページ機能は非同期です。 機能が無効になった直後に巨大なページは分割されません。
コードセグメントが巨大なページにマージされた場合、巨大なページ機能が無効になった後も、巨大なページキャッシュは残ります。
hugetextパラメーターを0、1、2、または3に設定して、システムブートオプションの巨大ページ機能のステータスを設定できます。 GRand Unified Bootloader (GRUB) のバージョンとイメージに基づいて、システム起動オプションを構成します。
巨大ページ機能を無効にすると、次のいずれかの方法を使用して、使用済みの巨大ページをクリアできます。
方法1: システム全体のページキャッシュをクリアします。
sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches '
方法2: ファイル固有のページキャッシュをクリアする。
sudo vmtouch -e /<path>/target
説明Virtual Memory Toucher (vmtouch) は、ファイルがメモリにロードされているかどうか、メモリ内のファイルをロックするか、メモリからファイルをアンロードするかどうかを確認するために使用されるツールです。 vmtouchがインストールされていない場合は、
sudo yum install vmtouch
コマンドを実行してvmtouchをインストールします。<path>
をアプリケーションファイルの実際のディレクトリに置き換えます。
方法3: 残りの巨大なページをクリアします。
sudo sh -c 'echo 1 > /sys/kernel/debug/split_huge_pages '
パフォーマンス上のメリット
巨大ページによって提供されるパフォーマンスの利点は、異なるプラットフォーム上のTranslation Lookaside Buffer (TLB) モジュールによって異なります。 巨大なページは、データベース (MySQLやPostgreSQLデータベースなど) やJavaアプリケーションなどのシナリオに適しています。 巨大なページは、物理マシン上の8% に5% することでアプリケーションのパフォーマンスを向上させ、仮想マシン上のアプリケーションのパフォーマンスを向上させます。 次の例では、MySQLを使用して、巨大ページがArmプラットフォームにもたらすパフォーマンス上の利点を説明します。
コードセグメントが巨大なページにマージされた場合、巨大なページ機能が無効になった後でも、巨大なページキャッシュは残ります。 パフォーマンステストを実行するときは、echo 3 > /proc/sys/vm/drop_caches
コマンドを実行してシステム全体のページキャッシュをクリアし、正確なテスト結果を得ることを推奨します。
テストインスタンスに32のvCPUがあり、インスタンスに対して1、8、16、32の同時MySQL接続が確立され、8、16、32のMySQL接続がCPU使用率を25% 、50% 、100% にプッシュすると仮定します。 次の図は、2MBの巨大ページと4KBの標準ページの1秒あたりのトランザクション (TPS) の比較を示しています。
上の図に示すように、巨大なページは常に標準ページよりも優れています。
MySQL接続が1つだけ確立された場合、外部要因の影響はわずかであり、巨大なページは標準ページよりも約6.9% パフォーマンスが優れています。
8または16の同時MySQL接続が確立されると、CPUの競合が解消され、巨大なページが標準ページよりも6.5% を超えてパフォーマンスが向上します。
32の同時MySQL接続が確立されると、他のアプリケーションがCPUリソースを求めて競合する可能性があり、TPSレートは前述のテストシナリオで取得されたものよりも低くなります。 巨大なページは標準ページよりも安定しており、標準ページを約11% 上回っています。
上の図は、巨大ページと4KBページのiTLBデータを示しています。 左側の図はiTLBミス率を示し、右側の図は千命令当たりのiTLBミス数 (MPKI) を示す。 MySQLが巨大なページを使用すると、次の状況が発生します。
iTLBミスの数は約10倍に減少し、iTLBミス率は約0.09% から約0.08% に減少する。
iTLB MPKIレートは約6倍減少する。
PostgreSQLは、巨大なページを使用してパフォーマンスを7% 向上させることもできます。
間隔
パディングは、巨大ページ機能の最適化です。 パディングは、次の問題を解決するために使用されます。アプリケーションのロード後にコードセグメントによっては巨大なページを使用しないため、最適な効果が得られません。 これらのコードセグメントはホットスポットである。 たとえば、バイナリファイルの末尾のテキストセグメントのサイズが2 MBより小さく、テキストセグメントのサイズがhugetext_pad_threshold
パラメーターの値を超えているために巨大なページを使用できない場合は、テキストセグメントを2 MBにパディングして巨大なページを使用できるようにします。
パディングの有効化
次のコマンドを実行して、
sysfs
インターフェイスを使用してパディングを有効にします。sudo sh -c 'echo [0 ~ 2097151] > /sys/kernel/mm/transparent_hugepage/hugetext_pad_threshold '
説明sudo sh -c 'echo 4096 > /sys/kernel/mm/transparent_hugepage/hugetext_pad_threshold '
コマンドでhugetext_pad_thresholdを4096に設定することを推奨します。ほとんどの場合、アプリケーションコードセグメントは2MBに対応したアドレスにマッピングされ、巨大ページ機能はアドレス対応の最適化に役立ちます。 しかしながら、rw − pまたはr_pに続く内容は、2MB整列されないことがある。 その結果、コンテンツは
hugetext_pad_threshold
の値に基づいて期待どおりにパディングされず、一部のコードセグメントは4KBページを使用します。 パディング機能を使用する場合は、コードセグメントとデータセグメントを2MB整列することを推奨します。 2MBのコードまたはデータセグメントを整列するには、デフォルトのIDSファイルを変更し、を追加します。 =ALIGN(0x200000);
コードまたはデータセグメントの前の。パディングを無効にする
次のコマンドを実行して、
sysfs
インターフェイスを使用してパディングを無効にします。sudo sh -c 'echo 0 > /sys/kernel/mm/transparent_hugepage/hugetext_pad_threshold '
付録: 用語集
次の表に、巨大ページ機能で一般的に使用される用語を示します。
期間 | 説明 |
巨大なページ | 巨大ページは巨大ページメモリとも呼ばれます。 メモリは、ページと呼ばれるブロックで管理および割り当てられます。 巨大ページは、サイズが4 KBを超えるメモリページであり、ハードウェアのTLB利用率とパフォーマンスの向上に役立ちます。 |
透明な巨大なページ | 透明な巨大ページ (THP) は、プロセスから巨大なページを使用する複雑さを隠します。 THPはバックグラウンドでカーネルスレッドを起動し、各プロセスの仮想メモリ領域 (VMA) を非同期にスキャンし、VMAを2MBページに統合します。 |
巨大なページ | THPと同様に機能し、コードのみを巨大なページに統合してパフォーマンスを大幅に向上させる機能。 |
iTLBミス | iTLBミスは、一致するエントリがiTLBに見つからない場合に発生する。 iTLBミス率が高い場合、CPUは効率的に実行できません。 |
iTLB使用率 | iTLBの使用率。 システムパフォーマンスは、iTLB使用率とともに向上します。 |
iTLB MPKI | 千命令あたりのiTLBミスの数 (MPKI) 。 より低いiTLB MPKIレートは、より高いシステム性能を示す。 |
関連ドキュメント
Alibaba Cloud Linuxは、THPを使用してメモリアクセス効率を向上させることもできます。 THPは、小さなページ (典型的には4KBのページ) を巨大なページ (典型的にはサイズが2 MB以上のページ) に統合して、ページテーブルエントリ (PTE) の数およびメモリアクセスの数を減らすことができる。 このようにして、TLBキャッシュへの圧力が低減され、アプリケーション性能が改善される。 詳細については、「」をご参照ください。THPを使用してAlibaba Cloud Linuxのパフォーマンスを調整する方法を教えてください。