2013年12月5日木曜日

続・HugePages_2

折角HugePagesネタを久しぶりに書いたので、
Oracle社のマニュアルよりもグーグルの上位に立つため、
前回の「続・HugePages_1」に書ききれなかった、
Hugepagesネタに関する雑多な内容を書こうと思います。


Oracle® Database管理者リファレンス11.2では、
以下の様な設定手順が書かれていますが、
実際にはそんなに思い通りにはいかないこともあります。

1)memlockの設定変更
2)hugepagesのページ数検討&設定
3)DB再起動により獲得

しかしながら、自動メモリ管理(AMM)を使用している環境を考えた場合、
現実的には2)の部分をもう少し考える必要があります。

共有メモリー・セグメントのhugepages構成の推奨値を計算するスクリプトですが、
自動メモリ管理(AMM)環境では以下の様な出力になります。

[oracle@s112040 ~]$ ./hugepages_settings.sh
Recommended setting: vm.nr_hugepages = 1
ん?1ページなの?となります。

hugepages_settings.shスクリプトの内容を確認すれば分かりますが、
ipcs -mの結果を元にvm.nr_hugepagesを算出しています。

[oracle@s112040 ~]$ ipcs -m
------ 共有メモリセグメント --------
キー     shmid      所有者  権限     バイト  nattch     状態
0x00000000 1114117    oracle     640        4096       0
0x00000000 1146886    oracle     640        4096       0
0x5bb52b60 1179655    oracle     640        4096       0
※SEG_BYTESは4096となる。

この結果から、SEG_BYTESは4096となり、HPG_SZは2048のため、
echo "$SEG_BYTES/($HPG_SZ*1024)" | bc -qの結果は0となり、
if文を抜けて、初期値の1が出力されたことが分かります。

SEG_BYTESが4096となっているのは、自動メモリ管理(AMM)環境では、
/dev/shmにマウントされた共有メモリー・ファイルシステム(ramfs/tmpfs/shmfs)に
グラニュルサイズでファイルを作成して使用しているため、
共有メモリセグメントを使用していないことに起因しています。

このことから、自動メモリ管理(AMM)環境からHugepagesを使用した環境に変更するには、
現時的には以下の手順の実施を検討する必要があります。

2)hugepagesのページ数検討&設定
 2-1)sga_targetやpga_aggregate_targetの検討
 2-2)hugepagesのページ数検討



2-1)についてですが、まずは現状の確認が必要ですね。
Hugepasesに関係する初期化パラメータを確認します。
memory_targetのみが設定されている場合には、
以下の様な状態になっているかもしれません。

SQL> col name_col_plus_show_param for a20
SQL> col value_col_plus_show_param for a10
SQL> col type for a15

SQL> show parameter memory_max_target memory_target
NAME                 TYPE            VALUE
-------------------- --------------- ----------
memory_max_target    big integer     6G

SQL> show parameter memory_target
NAME                 TYPE            VALUE
-------------------- --------------- ----------
memory_target        big integer     6G

SQL> show parameter sga_max
NAME            TYPE            VALUE
--------------- --------------- ----------
sga_max_size    big integer     6G
※設定されていない場合には、memory_targetの値になります。

SQL> show parameter sga_target
NAME                 TYPE            VALUE
-------------------- --------------- ----------
sga_target           big integer     0

SQL> show parameter pga_aggregate_target
NAME                 TYPE            VALUE
-------------------- --------------- ----------
pga_aggregate_target big integer     0G

SQL> show parameter use_large_pages
NAME                 TYPE            VALUE
-------------------- --------------- ----------
use_large_pages      string          TRUE


sga_targetやpga_aggregate_targetを決定するには、
以下のSQLで現状や変動を確認し、設定値を検討します。

SQL>select COMPONENT,CURRENT_SIZE,MIN_SIZE,MAX_SIZE
      from V$MEMORY_DYNAMIC_COMPONENTS
      where COMPONENT IN ('SGA Target','PGA Target');

SQL> select COMPONENT,PARAMETER,INITIAL_SIZE,TARGET_SIZE,
      FINAL_SIZE,START_TIME from V$MEMORY_RESIZE_OPS
      where COMPONENT IN ('SGA Target','PGA Target')

以下のアドバイスを参考にするのもありですね。
V$SGA_TARGET_ADVICE
V$PGA_TARGET_ADVICE

hugepagesを使用できるのはSGAだけなので、
vm.nr_hugepagesはsga_targetの値をHPG_SZである2048で
割った値となります。


長くなってきたので、一旦切ります。
実際の設定作業については次のエントリに記載します。

0 件のコメント:

コメントを投稿