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