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)キャッシュのヒット率が低下するなどの問題が生じます。具体的には、下の図のようなイメージです。
ページ数の計算方について
SAPシステムでは、スタンドアロンOracle DBサーバーと、ABAP or JVM & Orace DB組み合わせているサーバーという2つのケースがありましてそれぞれ計算 方法が異なります。計算方法ついては以下に記述します。
①OracelDatabase単体でDBサーバを使うケース
必要なHugePagesの数を計算する方法:
たとえば、Sgaが20GBのOracleデータベースLASがあるとします。
SQL>showsga;
TotalSystemGlobalArea2.1379E+10bytes 固定サイズ2235904バイト
変数サイズ1.5972E+10バイト
データベースバッファ5368709120バイト
REDOバッファ36102144バイト
SQL> #ipcs-m|greporalas
0x38671d2c3997702oralas6602147693363230
HugePagesの数の計算:
21476933632バイト/2MB=(21476933632/2097152)バイト=10241ページ
HugePagesの実装方法:
OS側にHugePagesを実装するステップ:
<n>は、x86_64ハードウェアアーキテクチャ上のサイズが2MBのHugePagesの数です。 <OracleバイナリOS所有者>は、$ORACLE_HOME/binにインストールされたOracleバイナリのOS所有者です。
以下のLinuxカーネルパラメータを設定します。
#sysctl-wvm.nr_hugepages=<n>
コンピュータを再起動するたびにパラメータの値を使用できるようにするには、/etc/sysctl.confファイルを編集し、次のエントリを追加します。
vm.nr_hugepages=<n>
以下のコマンドを実行して、使用可能なHugePagesをチェックします。
#grepHugePages/proc/meminfo
/etc/security/limits.confで必要な追加変更:
<oraclebinaryOSowner>softmemlockunlimited
<oraclebinaryOSowner>hardmemlockunlimited
複数のORACLE_HOMEが存在し、すべてのデータベースインスタンスに対してHugePagesを使用する場合は、各ユーザのエントリを/etc/security/limits.conf
に追加する必要があります。
たとえば、OracleデータベースLASの設定では、HugePagesの数を定義します。
#cat/etc/sysctl.conf|grepvm
vm.nr_hugepages=10241
#grepHugePages/proc/meminfo
HugePages_Total:10241
HugePages_Free:7082
HugePages_Rsvd:7082
HugePages_Surp:0
#cat/etc/security/limits.conf|greporalas
oralassoftmemlockunlimited
oralashardmemlockunlimited
データベース側にHugePagesを実装するステップ:
パラメータuse_large_pagesにより、でのHugePagesの使用が制御されます。
データベースであり、spfileに追加される必要があります。これには、以下の3つの選択肢があります。
値:
・use_large_pages=false
このデータベースインスタンスではHugePagesは使用されませんが、通常の4KBページが使用されます。
・use_large_pages=true
十分な量のHugePagesを使用できる場合は、データベースでHugePagesが使用されます。そうでない場合は、4KBページで起動されます。
11.2.0.3以降では、利用可能なHugePagesが使用され、残りのSGAには4KBページが入力されます。
・use_large_pages=のみ
利用可能なHugePagesの数が不十分または適切に設定されていない場合は、データベースインスタンスが起動に失敗し、以下のエラーが表示されます
Nohugepagesconfiguredornotcorrectlyconfigured:
ora-27102: outofmemoryLinux_x86_64Error12:cannotallocatememory
Notsufficientlyhugepagesconfigured:
ora-03113:end-of-fileoncommunicationchannel
②ABAPセントラルシステム-SAPABAPセントラルインスタンス(CI)またはプライマリアプリケーションサーバー(PAS)とOracleデータベースが同一のホストで利用するケース
CIorPASとOracledatabaseが同一ホストで構成する場合はHugePagesを利用することができません。
NormalPages(4-64KB、CPUアーキテクチャによって異なる)のみ利用することが可能です。
③JAVAセントラルシステム-SAPJAVAセントラルインスタンス(CI)またはプライマリアプリケーションサーバー(PAS)とOracleデータベースが同一のホスト構成で利用するケース
CIorPASとOracledatabaseが同一の構成ホストの場合はABAPとは違い、HugePagesを使用できます。JVMに関して具体的に計算し方と手順については以下で記述します。
HugePagesをどのくらい大きくするか?
max-java-heap-size*1.5/page-sizefreehugepages
たとえば、Hugepagesize=2048K(2M)のx64マシンで、最大ヒープがそれぞれ1GBのSAPJVMプロセスを10個並列実行するには、15Gの大きなページプール、つまり7680ページ数が必要になります。
1048576*1.5/2048=768
10JVMプロセス768*10=7680
実際に設定する手順としては以下に記述します。
--HugePagesのユーザーグループを作成する--
SAPJVMを実行するすべてのユーザー用のLinuxグループを作成します。たとえば、gid1100のグループhuge_tlb_usersを作成するには、次のようにします:
#groupadd-g1100huge_tlb_users
#cat/etc/group|grephuge_tlb_users
huge_tlb_users:!:1100:
--カーネルパラメータの設定--
次のカーネルパラメータが必要です:
1.vm.nr_hugepages:マシン上の巨大ページプールのサイズ(ページ数)。
2.vm.hugetlb_shm_group:SAPJVMを巨大ページモードで実行するすべてのユーザーのユーザーグループのグループID。
3.kernel.shmmax:そのマシンで作成される共有メモリの最大サイズ。通常、この数値は物理メモリと同じ大きさにできます。
/etc/sysctl.confを変更し、カーネルパラメータを追加します。例:
#15Gページプール
vm.nr_hugepages=7680
#SAPJVMを使用するユーザーグループ
vm.hugetlb_shm_group=1100
#このマシンの物理メモリ全体
kernel.shmmax=137438953472
完了したら、次のコマンドを実行して現在のランタイムカーネルパラメータを更新します。
sysctl-p
このコマンドが返されると、巨大ページプールが割り当てられているはずです。次のコマンドで制御します:
cat/proc/meminfo|grepHugePages。
HugePages_Totalの数値がvm.nr_hugepagesに指定した数値より小さい場合、メモリが断片化されすぎて巨大ページプールをオンザフライで作成できない可能性があります。その場合は、マシンを再起動する必要があります。
--memlock制限の設定--
/etc/security/limits.confを変更して、SAPJVMを実行しているユーザーに十分なメモリロック制限を設定します:
sapjvm_usersoftmemlockinfinity
sapjvm_userhardmemlockinfinity"