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
以上になります。