お問い合わせ

メールでのお問合せ

メール

admin@foliates.biz

電話でのお問合せ

電話050-1741-0103
2024.12.03

SAP環境におけるOracleデータベースでのHugePagesの利用 ITコンサルタント Ye Htet Aung

サムネイル

SAP環境におけるOracleデータベースでのHugePagesの利用

本記事では、SAP環境におけるOracleデータベースでのHugePagesの利用について記述します。

そもそもHugePagesとは何でしょうか
HugePagesは、Linuxカーネルのメモリー管理機能の一部で、通常のページサイズ(4KB)よりも大きなページサイズ(通常2MBや1GB)を使用することで、メモリー管理の効率を向上させる技術です。

Linux上のプロセス、例えばOracleデータベースサーバの場合、SGAが存在する物理メモリにアクセスするために仮想メモリを多用します。仮想メモリを使用する際にはページテーブルを介してアクセスし、その単位はデフォルトで4KBです。
しかし、ページテーブルのサイズには限りがあり、大規模なメモリー環境においてすべてのメモリーを4KB単位で管理すると、ページテーブルの管理負荷が増加し、TLB(Translation Lookaside Buffer)キャッシュのヒット率が低下するなどの問題が生じます。具体的には、下の図のようなイメージです。

Normal Pagesの場合

HugePgesの場合

ページサイズについて
SAP環境でのHugePagesとNormal Pagesのサイズは、使用されるハードウェアアーキテクチャによって異なる値に制限されています。
例えば、x86_64アーキテクチャのサーバーで利用できるNormal Pagesは4KB、HugePagesは2MBです。

ページ数の計算方について
SAPシステムでは、スタンドアロンOracle DBサーバーと、ABAP or JVM & Orace DB組み合わせているサーバーという2つのケースがありましてそれぞれ計算方法が異なります。算方法ついては以下に記述します。

① Oracel Database単体でDBサーバをを使うケース
必要な HugePages の数を計算する方法:

たとえば、Sga が 20 GB の Oracle データベース LAS があるとします。
 SQL> show sga;

 Total System Global Area 2.1379E+10 bytes
 固定サイズ      2235904 バイト
 変数サイズ   1.5972E+10 バイト
 データベースバッファ  5368709120 バイト
 REDO バッファ     36102144 バイト
 SQL>

 # ipcs -m | grep oralas
 0x38671d2c 3997702    oralas    660        21476933632 30

HugePages の数の計算:
 21476933632 バイト / 2 MB = (21476933632 / 2097152) バイト = 10241 ページ

HugePages の実装方法:
OS 側に HugePages を実装するステップ:
<n> は、x86_64 ハードウェアアーキテクチャ上のサイズが 2 MB の HugePages の数です。
<Oracle バイナリ OS 所有者> は、$ORACLE_HOME/bin にインストールされた Oracle バイナリの OS 所有者です。

以下の Linux カーネルパラメータを設定します。

 # sysctl -w vm.nr_hugepages= <n>

コンピュータを再起動するたびにパラメータの値を使用できるようにするには、 /etc/sysctl.conf ファイルを編集し、次のエントリを追加します。

  vm.nr_hugepages= <n>

以下のコマンドを実行して、使用可能な HugePages をチェックします。
 # grep HugePages /proc/meminfo

/etc/security/limits.conf で必要な追加変更:
 <oracle binary OS owner>   soft memlock unlimited
 <oracle binary OS owner>   hard memlock unlimited

複数の ORACLE_HOME が存在し、すべてのデータベースインスタンスに対して HugePages を使用する場合は、各ユーザのエントリを /etc/security/limits.conf に追加する必要があります。
たとえば、Oracle データベース LAS の設定では、HugePages の数を定義します。

 # cat /etc/sysctl.conf | grep vm
 vm.nr_hugepages=10241

 # grep HugePages /proc/meminfo
 HugePages_Total:  10241
 HugePages_Free:    7082
 HugePages_Rsvd:    7082
 HugePages_Surp:       0

 # cat /etc/security/limits.conf | grep oralas
 oralas          soft    memlock        unlimited
 oralas          hard    memlock        unlimited

データベース側に HugePages を実装するステップ:
パラメータ use_large_pages により、での HugePages の使用が制御されます。
データベースであり、spfile に追加される必要があります。これには、以下の 3 つの選択肢があります。
値:
 ・use_large_pages=false
  このデータベースインスタンスでは HugePages は使用されませんが、通常の 4 KB ページが使用されます。
 ・use_large_pages=true
  十分な量の HugePages を使用できる場合は、データベースで HugePages が使用されます。そうでない場合は、4 KB ページで起動されます。
  11.2.0. 3 以降では、利用可能な HugePages が使用され、残りの SGA には 4 KB ページが入力されます。
 ・use_large_pages=のみ
  利用可能な HugePages の数が不十分または適切に設定されていない場合は、データベースインスタンスが起動に失敗し、以下のエラーが表示されます
   No hugepages configured or not correctly configured:
   ora-27102 :  out of memory Linux_x86_64 Error 12 :cannot allocate memory
   Not sufficiently hugepages configured:
   ora-03113 : end-of-file on communication channel

②ABAP セントラル システム - SAP ABAP セントラル インスタンス (CI) またはプライマリ アプリケーション サーバー (PAS) と Oracle データベースが同一のホストで利用するケース
 CI or PAS とOracle databaseが同一ホストで構成する場合はHugePagesを利用することができません。
 NormalPages(4-64KB、CPU アーキテクチャによって異なる)のみ利用することが可能です。


③JAVA セントラル システム - SAP JAVA セントラル インスタンス (CI) またはプライマリ アプリケーション サーバー (PAS) と Oracle データベースが同一のホスト構成で利用するケース
 CI or PASと Oracle databaseが同一の構成ホストの場合はABAP とは違い、HugePages を使用できます。JVMに関して具体的に計算し方と 手順については以下で記述します。

HugePagesをどのくらい大きくするか?
 max-java-heap-size * 1.5/ page-size free huge pages
 たとえば、Hugepagesize=2048K (2M) の x64 マシンで、最大ヒープがそれぞれ 1GB の SAP JVM プロセスを 10 個  並列実行するには、15G の大きな ページ プール、つまり 7680 ページ 数 が必要になります。
 1048576 * 1.5/2048 = 768
 10JVMプロセス 768 * 10 = 7680

 実際に設定する手順としては以下に記述します。

--Huge Pages のユーザー グループを作成する--

 SAP JVM を実行するすべてのユーザー用の Linux グループを作成します。たとえば、gid 1100 のグループ huge_tlb_users を作成するには、次のようにします:

 # groupadd -g 1100 huge_tlb_users
 # cat /etc/group | grep huge_tlb_users
  huge_tlb_users:!:1100:

--カーネル パラメータの設定--

 次のカーネル パラメータが必要です:

 1. vm.nr_hugepages: マシン上の巨大ページ プールのサイズ (ページ数)。

 2. vm.hugetlb_shm_group: SAP JVM を巨大ページ モードで実行するすべてのユーザーのユーザー グループのグループ ID。

 3. kernel.shmmax: そのマシンで作成される共有メモリの最大サイズ。通常、この数値は物理メモリと同じ大きさにできます。

 /etc/sysctl.conf を変更し、カーネル パラメータを追加します。例:

 # 15G ページ プール
 vm.nr_hugepages = 7680
 # SAP JVM を使用するユーザー グループ
 vm.hugetlb_shm_group = 1100
 # このマシンの物理メモリ全体
 kernel.shmmax = 137438953472

 完了したら、次のコマンドを実行して現在のランタイム カーネル パラメータを更新します。

 sysctl -p

 このコマンドが返されると、巨大ページ プールが割り当てられているはずです。次のコマンドで制御します:

 cat /proc/meminfo | grep HugePages。

 HugePages_Total の数値が vm.nr_hugepages に指定した数値より小さい場合、メモリが断片化されすぎて巨大ページ プールをオンザフライで作成できない可能性があります。その場合は、マシンを再起動する必要があります。

--memlock 制限の設定--
 /etc/security/limits.conf を変更して、SAP JVM を実行しているユーザーに十分なメモリ ロック制限を設定します:
 sapjvm_user soft memlock infinity
 sapjvm_user hard memlock infinity

以上になります。