5.10. ラージページ領域割当て

スーパーコンピュータ「富岳」のHPC拡張機能が提供するラージページライブラリについて説明します。

詳細はマニュアル「ジョブ運用ソフトウェア - エンドユーザー向けガイド HPC拡張機能編」を参照してください。
また、「プログラミングガイド(プログラミング共通編) 」の「ラージページ」の章も参照してください。

5.10.1. 概要

ラージページ機能は、Linuxの標準機能である HugeTLBfs を拡張し、大規模なデータを扱うアプリケーションプログラムに対して、通常のページ(ノーマルページ)より大きなページサイズのメモリ(ラージページ)を割り当てることで、OSのアドレス変換処理によるコストを低減し、メモリアクセス性能を向上させる機能です。

富岳の計算ノードでは、ページサイズとしてノーマルページで64KiB、ラージページで2MiBを利用可能です。デフォルトでラージページ化が有効となっており、環境変数「XOS_MMM_L_HPAGE_TYPE」によってラージページの有効化/無効化を選択できます。

ページサイズの違いによるメリット/デメリットを以下に示します。

評価項目

64KiB

2MiB

TLBミス率

高い

低い

メモリ初期化コスト

小さい

大きい

メモリ使用効率

高い

低い

ページング方式には、デマンドページング方式とプリページング方式の2種類があります。

  • デマンドページング方式とは、アプリケーションプログラム実行中に必要なページが主記憶に存在しない場合に、必要に応じてページを主記憶に割り当てる方式のことです。 最初にメモリ領域にアクセスしたタイミングで物理ページを割り当てます。

  • プリページング方式とは、あらかじめ主記憶にページを割り当てておく方式のことです。 メモリ領域を割り当てたタイミングで物理ページを割り当てます。

ページング方式

NUMA内/外のメモリアクセス

初回メモリアクセス

デマンドページング方式

できる限りNUMA内のメモリを使用
(コスト:低い)
メモリアクセス時にページを物理メモリにロード
(コスト:高い)

プリページング方式

NUMA内外のメモリに関係なく使用
(コスト:高い)
ページをあらかじめ物理メモリにロード
(コスト:低い)

注釈

スレッド並列で複数CMGをまたぐときはデマンドページング方式を推奨します。 「プログラミングガイド(プログラミング共通編) 」の「ラージページのページングポリシー」を参照ください。

メモリ領域とラージページ化対象を以下に示します。

領域

ラージページ化対象

テキスト(.text)領域

×(64KiBページ)

静的データ(.data)領域

○(2MiBページ)

静的データ(.bss)領域

○(2MiBページ)

動的メモリ確保領域(ヒープ領域)

×(64KiBページ)

スレッドヒープ領域

○(2MiBページ)

スタック領域

○(2MiBページ)

スレッドスタック領域

○(2MiBページ)

動的メモリ確保領域(mmap領域)

○(2MiBページ)

共有メモリ

×(64KiBページ)

5.10.2. ラージページライブラリ設定用環境変数

ラージページライブラリの動作を調整するために、環境変数を利用できます。

ラージページの基本的な設定をするための環境変数を以下に示します。

変数名

指定値

デフォルト値

XOS_MMM_L_HPAGE_TYPE

hugetlbfs|none

hugetlbfs

XOS_MMM_L_LPG_MODE

base+stack|base

base+stack

XOS_MMM_L_PRINT_ENV

on|off|1|0

0

環境変数「XOS_MMM_L_PAGING_POLICY」によって、静的データ(.bss領域)、スタック/スレッドスタック領域、および、動的メモリ確保領域にページング方式を設定できます。

ページング方式を設定するための環境変数を以下に示します。

変数名

指定値

デフォルト値

XOS_MMM_L_PAGING_POLICY

[demand|prepage]:[demand|prepage]:[demand|prepage]

demand:demand:prepage

注釈

XOS_MMM_L_PAGING_POLICYのデフォルト値をカスタマイズしています。 マニュアル「ジョブ運用ソフトウェア エンドユーザ向けガイド HPC拡張機能編」に表記されているデフォルト値 "prepage:demand:prepage" と異なります。

ラージページ割り当てに関するチューニングするための環境変数を以下に示します。

変数名

指定値

デフォルト値

XOS_MMM_L_ARENA_FREE

1|2

1

XOS_MMM_L_ARENA_LOCK_TYPE

0|1

1

XOS_MMM_L_MAX_ARENA_NUM

1 以上 INT_MAX以下の整数値[10進数]

1

XOS_MMM_L_HEAP_SIZE_MB

MALLOC_MMAP_THRESHOLD_の2倍以上 ULONG_MAX以下の整数値<MiB単位>[10進数]

MALLOC_MMAP_THRESHOLD_の2倍

XOS_MMM_L_COLORING

0|1

1

XOS_MMM_L_FORCE_MMAP_THRESHOLD

0|1

0

MALLOC_CHECK_

0|1|2|3|5|7 [10進数]

3

MALLOC_TOP_PAD_

0 以上 ULONG_MAX以下の整数値<byte単位> [10進数]

131072(=128KiB)

MALLOC_PERTURB_

INT_MIN 以上 INT_MAX以下の整数値 [10進数]

0

MALLOC_MMAP_MAX_

INT_MIN 以上 INT_MAX以下の整数値 [10進数]

2097152(=2*1024*1024)

MALLOC_MMAP_THRESHOLD_

0 以上 ULONG_MAX以下の整数値<byte単位> [10進数または16進数]

134217728(=128MiB)

MALLOC_TRIM_THRESHOLD_

0 以上 ULONG_MAX以下の整数値<byte単位> [10進数または16進数]

134217728(=128MiB)

5.10.3. ラージページライブラリのリンク

利用者プログラムからラージページを利用するには、実行可能ファイルにラージページライブラリをリンクする必要があります。

富士通コンパイラを利用する場合は、デフォルトでラージページライブラリをリンクします(-Klargepageオプションがデフォルト時有効)。 富士通コンパイラ以外を利用する場合は、ラージページライブラリ「libmpg.so」をリンクすることでラージページ化した実行可能ファイルを作成できます。

ラージページライブラリのパスは次の通りです。

ノード種別

パス名

ログインノード

/opt/FJSVxos/devkit/aarch64/rfs/opt/FJSVxos/mmm/lib64

計算ノード

/opt/FJSVxos/mmm/lib64

ラージページ化するにあたり、本ラージページライブラリは、以下のパスでラージページ用のリンカスクリプトも提供しています。これは、静的データ(.data)、および、静的データ(.bss)をラージページ化するためのものです。このリンカスクリプトもコンパイラに適切に指定してください。

ノード種別

パス名

ログインノード

/opt/FJSVxos/devkit/aarch64/rfs/opt/FJSVxos/mmm/util/bss-2mb.lds

計算ノード

/opt/FJSVxos/mmm/util/bss-2mb.lds

計算ノードの gcc でコンパイルする場合の例を示します。

gcc -Wl,-T/opt/FJSVxos/mmm/util/bss-2mb.lds -L/opt/FJSVxos/mmm/lib64 -lmpg sample.c

参考

アプリケーションプログラムが、PIE(Position Independent Executable、位置独立実行形式)でコンパイルされている場合、.data/.bss 領域はラージページ化されません。この場合、ラージページライブラリは警告ログを出力するだけで、.data/.bss 領域にはノーマルページが使用され、アプリケーションプログラムは実行を継続します。

例えば、gcc で明示的にPIE形式とならないようにコンパイルするには、-no-pie オプションを使用してください。

5.10.4. メモリ断片化の影響緩和

計算ノードで動作しているLinux OSにおいて、メモリ断片化が進行すると、ジョブで使用可能なメモリ量が減少します(これはLinux OSの仕様です)。
このメモリ断片化の影響を緩和する方法として、ラージページに関する環境変数を設定する方法があります。
ただし、いずれの方法も性能低下を招き、ジョブの実行時間が延びる可能性があります。
  • XOS_MMM_L_HPAGE_TYPE=none
    ラージページを使用せず、ノーマルページを使用します。
    メモリ断片化は「連続した空きメモリ領域」が分断され小さな空き領域が飛び飛びに発生します。このため、大きな連続領域(2MiB以上のページサイズ)を必要とするラージページは影響を受けやすくなります。
    ノーマルページを使用することで、より小さな連続領域(64KiBのページサイズ)も使用可能になるため、メモリ断片化の影響を緩和できます。
    デメリットとしては、TLBミス率が高くなることで、メモリアクセス性能が低下する可能性があります。
  • XOS_MMM_L_HUGETLB_FALLBACK=1
    ラージページが不足した場合に、不足分のメモリについてノーマルページによる割り当てを試みます。
    ノーマルページでも必要なメモリを確保できない場合は、メモリ枯渇によりプロセスが終了します。
    これは、ラージページ使用時のメモリ不足に対する救済措置となります。
    この環境変数は、以下の条件を全て満たす場合にのみ有効となり、条件を満たさない場合はデフォルト値の0(無効)が指定されたものとして動作します。
    • XOS_MMM_L_HPAGE_TYPE=hugetlbfs

    • XOS_MMM_L_PAGING_POLICY=*:*:prepage

    • XOS_MMM_L_ARENA_LOCK_TYPE=1

    • XOS_MMM_L_MAX_ARENA_NUM=1

    デメリットとしては、ノーマルページ割り当ての要否を判断するオーバーヘッドが生じるため、メモリ獲得性能が低下します。