Linuxのメモリ管理
まず、Linuxでメモリを管理する様子を以下に示します。
この図で示すように、Linux上のプロセス、たとえばOracle Databaseのサーバー・プロセスは、SGAが存在する物理メモリにアクセスするために、仮想メモリの機構を使います。仮想メモリを使う上では、「ページ・テーブル」を介してアクセスし、その単位はデフォルトでは4KBです。
近年、メモリ容量は急速に増加しており、最近のサーバーでは48GBや96GBといった大容量メモリを搭載することが一般的になっています。この時、従来通りのメモリ管理方式を使っていたらどうなるでしょうか?
ページ・テーブルのサイズが4KB単位であるため、ページ・テーブルが肥大化し、またページ・テーブルのエントリをマッピングするTranslation Lookaside Buffer(TLB)というCPUレジスタの処理が重くなります。結果としてメモリ操作のパフォーマンスに影響を与えるのです。
ここで、HugePagesを使った場合の構成を以下に示します。
HugePagesを使った場合においても、基本的なメモリ管理方法は変わりません。
しかし、メモリ管理の「ページ」の単位が大きくなる(ページ・サイズはOSごとに異なる)ため、ページ・テーブルのエントリ数が減り、TLBの負荷も低くなります。その結果、メモリ操作のパフォーマンスが向上します。
また、HugePages上に配置した領域は、スワップ不可になります。
そのため、データベース・インスタンス領域などの、通常スワップすべきではないメモリ空間を配置するには適していると言えるでしょう。