Oracle® Database管理者リファレンス 11gリリース2 (11.2) for Linux and UNIX-Based Operating Systems B56317-12 |
|
前 |
次 |
この章では、Linuxシステム管理者がLinuxシステムにVery Large Memory構成およびHugePagesを構成する方法について説明します。
次の項目について説明します。
Very Large Memory(VLM)を構成することによって、32ビットのOracle Databaseが、従来はLinuxアプリケーションで利用可能だった4GB以上のRAMにアクセスできるようになります。この32ビット向けのOracle VLMオプションでは、メモリー内ファイル・システム(/dev/shm
)を使用して大規模なデータベース・バッファ・キャッシュを作成します。SGAの他の部分は、通常のメモリーから割り当てられます。VLM構成では、メモリー内により多くのデータベース・バッファをキャッシュすることによって、VLMを使用しない構成に比べてディスクI/Oが大幅に削減されるため、データベースのパフォーマンスが向上します。この章では、32ビット・コンピュータでVLMを使用して、SGAメモリーを増加させる方法について説明します。
注意: この項で説明する内容は、32ビットのLinuxオペレーティング・システムにのみ該当します。64ビットのアーキテクチャを使用する場合、システムでVLMがサポートされています。すべての64ビットLinuxオペレーティング・システムでは、仮想アドレス空間の上限を16EB(エクサバイトは2の60乗バイト)として、物理メモリーを直接使用します。 |
この項では、次の項目について説明します。
32ビットのアーキテクチャでは、特定サイズのVLMウィンドウからVLMにアクセスします。VLMウィンドウは、プロセスのアドレス空間におけるデータ構造で、特定サイズのウィンドウから仮想アドレス空間全体にアクセスできるようにします。32ビットLinuxでは、パラメータUSE_INDIRECT_DATA_BUFFERS=TRUE
を設定し、/dev/shm
上にshmfs
、tmpfs
、ramfs
タイプのメモリー内ファイル・システムをマウントして、使用可能なアドレス空間を増やす必要があります。
次に、32ビットのオペレーティング・システムにVLMを実装するための前提条件をいくつか示します。
Oracle Databaseがインストールされたコンピュータには、4GBを超えるメモリーが必要です。
このコンピュータは、起動時にPAEサポートを使用してカーネルを使用するように構成する必要があります。
VLMサポートを使用するデータベース・インスタンスの初期化パラメータ・ファイルには、USE_INDIRECT_DATA_BUFFERS=TRUE
を設定する必要があります。
初期化パラメータDB_BLOCK_BUFFERS
およびDB_BLOCK_SIZE
には、Oracle Databaseに選択した値を設定する必要があります。
通常、32ビットLinuxカーネルでは、最大2.4GBのサイズのSGAを作成することができます。Linux Hugememカーネルを使用すると、3.2GBサイズまでのSGAを作成できます。32ビット・カーネルで3.2GBを超えるには、VLM機能を使用する必要があります。
32ビット・コンピュータでSGAの制限を拡大するには、次の方法があります。
Red Hat Enterprise Linux 4およびOracle Linux 4には、Hugememカーネルという新しいカーネルが含まれています。Hugememカーネルの機能は、4GB-4GBスプリット・カーネルとも呼ばれ、1プロセス当たり4GBのユーザー空間(他のカーネルの場合は3GB)、および4GBの直接カーネル空間をサポートします。このカーネルを使用すると、RHEL 4/Oracle Linux 4を最大64GBまでのメイン・メモリーを搭載したシステムで実行することができます。Hugememカーネルは、16GBを超えるメモリーを搭載したシステム構成で、すべてのメモリーを使用する必要があります。Hugememカーネルは、より少ないメモリー構成でも実行できます。
従来の32ビットの4GB仮想アドレス空間は、ユーザー・プロセス用に3GB、カーネル用に1GBに分割されます。新しい方法(4GB/4GB)では、カーネルに4GBの仮想アドレス空間を、ほぼ4GBを各ユーザー・プロセスに使用できます。Hugememカーネルによるこの方法で、間接的なデータ・バッファの方法を使用することなく3.2GBのSGAを作成することができます。
注意: 32ビットのRed Hat Enterprise Linux 5/Oracle Linux 5およびRed Hat Enterprise Linux 6/Oracle Linux 6にはhugememカーネルがありません。ユーザー・プロセスに3GB/カーネルに1GBの分割のみサポートされています。これにはPAEカーネルがあり、4GBを超える(16GBまで)RAMを搭載したシステムがサポートされます。3GB/1GBカーネル分割機能により、システムのロードが多数のlowmemを消費する場合、システムのlowmemが不足することがあります。Enterprise Linux 5には、hugememと同等のカーネルがないため、Enterprise Linux 4でhugememを使用するか、または64ビットへの移行が推奨されています。 |
アドレス空間の切替えによるパフォーマンスのオーバーヘッドと比較して、Hugememカーネルは大容量のコンピュータの安定性を向上します。
次のコマンドを実行すると、Hugemem
カーネルを使用しているかどうかを判別できます。
$ uname -r 2.6.9-5.0.3.ELhugemem
32ビット・システムでHugememカーネルのみを使用する場合、SGAサイズは若干増やすことができます。詳細は、「Hugememカーネル」を参照してください。
注意: Red Hat Enterprise Linux 5/Oracle Linux 5およびRed Hat Enterprise Linux 6/Oracle Linux 6はhugememカーネルをサポートしません。PAEカーネルがサポートされ、物理メモリーが16GB以下の間、Very Large Memory(VLM)を実装することができます。 |
この項では、32ビット・システムで、HugememカーネルとVLMを使用することで、SGAを大幅に増やす方法について説明します。
64GBのRAMを搭載した32ビット・システムで、SGAを62GB(ブロック・サイズに応じて異なる)まで増やすことができます。Page Address Extension(PAE)と呼ばれるプロセッサ機能により、64GBまでのRAMを物理アドレスにできます。PAEでは、プロセスまたはプログラムを4GBを超えて直接アドレス指定したり、4GBを超える仮想アドレス空間を指定することはできないため、プロセスを共有メモリーに直接アタッチすることはできません。この問題に対処するには、共有メモリー・ファイルシステム(メモリーベースのファイルシステム)を作成しておく必要があります。これは、カーネルでサポートされる仮想メモリーの上限と同じサイズまで作成できます。共有メモリー・ファイルシステムを使用すると、プロセスをファイルシステムの領域に動的にアタッチし、Oracleなどのアプリケーションで32ビット・オペレーティング・システムにより大きな共有メモリーを事実上使用できます。この問題は、64ビット・オペレーティング・システムにはありません。
VLMは、SGAのデータベース・バッファ・キャッシュの部分をSystem Vの共有メモリーから共有メモリー・ファイル・システムに移動します。これは、引続き1つの大きなSGAとみなされますが、2つの異なるオペレーティング・システムの共有メモリー・エンティティから構成されています。VLMはバッファ・キャッシュ以外の512MBのSGAを使用してVLMを管理します。32ビット・システムでは、プロセスを4GBを超えて直接アタッチすることができないため、このメモリー領域は、間接的なデータ・バッファ(共有メモリー・ファイルシステム・バッファ)をプロセス・アドレス空間にマッピングするために必要です。
注意: Very Large Memoryサポートを使用するデータベース・インスタンスの初期化パラメータ・ファイルに、USE_INDIRECT_DATA_BUFFERS =TRUE を設定する必要があります。このパラメータを設定しないと、Oracle Database 11gリリース2(11.2)以上の動作が、以前のリリースと同じになります。
また、初期化パラメータ |
たとえば、バッファ・キャッシュ以外のSGAが2.5GBの場合、VLMの管理に512MBが使用されるため、共有プール、ラージ・プールおよびREDOログ・バッファ用に、バッファ・キャッシュ以外のSGAは2GBのみです。バッファ・キャッシュ・サイズが512MB未満の場合、VLMの使用はお薦めしません。
RHEL 4/ Oracle Linux 4では、VLMに使用できる異なるメモリー・ファイル・システムが2つあります。
tmpfsまたはshmfs
の使用: 特定のサイズのshmfs
を/dev/shm
にマウントし、適切な権限を設定します。tmpfs
の場合、サイズを指定する必要はありません。Tmpfs
またはshmfs
によって割り当てられたメモリーはページング可能です。
次に例を示します。
Example Mount shmfs: # mount -t shm shmfs -o size=20g /dev/shm Edit /etc/fstab: shmfs /dev/shm shm size=20g 0 0 OR Example Mount tmpfs: # mount –t tmpfs tmpfs /dev/shm Edit /etc/fstab: none /dev/shm tmpfs defaults 0 0
ramfs
の使用: ramfs
は、shmfs
に類似していますが、ページングまたはスワッピングできないという点が異なります。この方法を使用すると、一般に望ましい効果が得られます。ramfs
は、次のようにして作成します。
umount /dev/shm mount -t ramfs ramfs /dev/shm
ramfs
を使用してRed Hat Enterprise Linux 4/ Oracle Linux 4にVery Large Memoryを構成するには、次の手順を実行します。
root
ユーザーでログインします。
sudo -sh Password:
/etc/rc.local
ファイルを編集し、次のエントリを追加して、コンピュータの起動時にramfs
が/dev/shm
ディレクトリにマウントされるようにコンピュータを構成します。
umount /dev/shm mount -t ramfs ramfs /dev/shm chown oracle:oinstall /dev/shm
このコマンドで、oracle
はOracleソフトウェア・ファイルの所有者、oinstall
はOracle所有者アカウントのグループです。新しい構成で、/etc/rc.local
ファイルが無効化されているか、または/etc/init.d
ファイルの下にあるLinuxサービス・スクリプトを使用してOracle Databaseインスタンスを起動した場合、これらのエントリをサービス・スクリプトに追加できます。
この構成は、システムで、重要なOracle Databaseインスタンスを自動起動する前であっても、ramfs
が準備されることに注意してください。起動スクリプトにコマンドを含めることもできます。再起動操作を繰り返してコマンドを広範囲にテストする必要があり、コンピュータを構成した後、次の手順を実行します。
サーバーを再起動します。
root
ユーザーでログインします。
次のコマンドを実行して、/dev/shm
ディレクトリにramfsタイプがマウントされていることを確認します。
/dev/shm directory is mounted with the ramfs type: # mount | grep shm ramfs on /dev/shm type ramfs (rw)
次のコマンドを実行して、/dev/shm
ディレクトリの権限を確認します。
# ls -ld /dev/shm drwxr-xr-x 3 oracle oinstall 0 Jan 13 12:12 /dev/shm
/etc/security/limits.conf
ファイルを編集し、次のエントリを追加して、メモリー・ロックの上限値を大きくします。
soft memlock 3145728 hard memlock 3145728
oracle
ユーザーに切り替えます。
# sudo - oracle Password:
次のコマンドを実行して、メモリー・ロックの上限値を確認します。
$ ulimit -l 3145728
Very Large Memoryのインスタンス・パラメータを構成するには、次の手順を実行します。
DB_CACHE_SIZE
、DB_xK_CACHE_SIZE
、sga_target
およびmemory_target
パラメータをDB_BLOCK_BUFFERS
パラメータに置き換えます。
USE_INDIRECT_DATA_BUFFERS=TRUE
パラメータを追加します。
SGAの要件に従ってSGAを構成します。
SGA_TARGET
、MEMORY_TARGET
またはMEMORY_MAX_TARGET
パラメータを削除します(設定されている場合)。
データベース・インスタンスを起動します。
次のコマンドを実行して、メモリー割当てを確認します。
$ ls -l /dev/shm $ ipcs -m
コンピュータをVery Large Memoryモードで実行する場合の制限事項は次のとおりです。
ramfs
を使用してVLMを実装すると、動的SGAチューニングでAMMが動作するため、自動メモリー管理(AMM)は使用できません。AMMスワッピングは可能です。たとえば、未使用のSGA領域をマッピング解除して、PGAにマッピングできます。動的SGAおよびマルチ・ブロック・サイズは、ramfs
がスワッピング可能でないため、Very Large Memoryではサポートされません。Very Large Memoryを有効にするには、MEMORY_TARGET
の値を0に設定する必要があります。
VLMはデータベース・バッファ・キャッシュのサイズが512MBを超える場合のみ実装できます。
HugePagesは、Linuxカーネル2.6に統合された機能です。HugePagesを有効にすると、オペレーティング・システムはデフォルト(通常、4KB)より大きいメモリー・ページをサポートできます。大規模なページ・サイズを使用すると、ページ表エントリへのアクセスに必要なシステム・リソースの量を削減することにより、システム・パフォーマンスを向上させることができます。32ビットおよび64ビット構成の両方で使用できます。HugePageサイズは、カーネル・バージョンおよびハードウェア・アーキテクチャに応じて、2MBから256MBと異なります。Oracle Databaseの場合、HugePagesを使用すると、ページ状態のオペレーティング・システム・メンテナンスが軽減され、Translation Lookaside Buffer(TLB)ヒット率が向上します。
この項では、次の項目について説明します。
HugePagesを使用しない場合、1ページ当たり4KBのメモリーがオペレーティング・システムに保持され、SGAに割り当てられる際に、ページのライフサイクル(ダーティ、空き、プロセスにマップ済など)がオペレーティング・システム・カーネルによって最新に保たれます。
HugePagesを使用する場合、各ページ表エントリが2MBから256MBのページを指すため、オペレーティング・システム・ページ表(仮想メモリーから物理メモリーへのマッピング)は小さくなります。また、カーネルでは、ライフサイクルを監視する必要があるページが少なくなります。
注意: Linux x86-64、Linux x86およびIBM: Linux on System zで使用できるHugePagesのサイズは2MBです。 |
HugePagesを使用した場合のメリットは次のとおりです。
TLBヒットが増加することによってパフォーマンスが向上します。
ページがメモリー内でロックされ、スワップ・アウトされないため、SGAのような共有メモリーがRAMに残ります。
連続するページを事前に割り当てるため、System V共有メモリー(SGAなど)以外に使用できなくなります。
より大きなページ・サイズによる仮想メモリーの部分のため、カーネル用の記録操作が削減されます。
コンピュータにHugePagesを構成するには、次の手順を実行します。
/etc/security/limits.conf
ファイルのmemlock
設定を編集します。memlock
設定はKB単位で指定し、搭載RAMよりも若干小さく設定します。たとえば、64GBのRAMが搭載されている場合は、次のエントリを追加してメモリー・ロックの上限値を大きくします。
* soft memlock 60397977 * hard memlock 60397977
memlock
の値をSGA要件よりも大きく設定することもできます。
再度oracle
ユーザーとしてログインし、ulimit -l
コマンドを実行して新しいmemlock
設定を確認します。
$ ulimit -l 60397977
次のコマンドを実行して、変数Hugepagesize
の値を表示します。
$ grep Hugepagesize /proc/meminfo
現行の共有メモリー・セグメントのhugepages
構成の推奨値を計算するスクリプトを作成するには、次の手順を実行します。
注意: 変更が必要な場合がある例は、次のとおりです。 |
hugepages_settings.sh
という名前のテキスト・ファイルを作成します。
次の内容をファイルに追加します。
#!/bin/bash # # hugepages_settings.sh # # Linux bash script to compute values for the # recommended HugePages/HugeTLB configuration # # Note: This script does calculation for all shared memory # segments available when the script is run, no matter it # is an Oracle RDBMS shared memory segment or not. # Check for the kernel version KERN=`uname -r | awk -F. '{ printf("%d.%d\n",$1,$2); }'` # Find out the HugePage size HPG_SZ=`grep Hugepagesize /proc/meminfo | awk {'print $2'}` # Start from 1 pages to be on the safe side and guarantee 1 free HugePage NUM_PG=1 # Cumulative number of pages required to handle the running shared memory segments for SEG_BYTES in `ipcs -m | awk {'print $5'} | grep "[0-9][0-9]*"` do MIN_PG=`echo "$SEG_BYTES/($HPG_SZ*1024)" | bc -q` if [ $MIN_PG -gt 0 ]; then NUM_PG=`echo "$NUM_PG+$MIN_PG+1" | bc -q` fi done # Finish with results case $KERN in '2.4') HUGETLB_POOL=`echo "$NUM_PG*$HPG_SZ/1024" | bc -q`; echo "Recommended setting: vm.hugetlb_pool = $HUGETLB_POOL" ;; '2.6'|'3.8') echo "Recommended setting: vm.nr_hugepages = $NUM_PG" ;; *) echo "Unrecognized kernel version $KERN. Exiting." ;; esac # End
次のコマンドを実行して、ファイルの権限を変更します。
$ chmod +x hugepages_settings.sh
hugepages_settings.sh
スクリプトを実行して、hugepages
構成の値を計算します。
$ ./hugepages_settings.sh
次のカーネル・パラメータを設定します。
# sysctl -w vm.nr_hugepages=value_displayed_in_step_5
コンピュータの再起動時に常にこのパラメータ値が使用されるようにするには、/etc/sysctl.conf
ファイルを編集して、次のエントリを追加します。
vm.nr_hugepages=value_displayed_in_step_5
サーバーを再起動します。
注意: 使用可能なHugePages を確認するには、次のコマンドを実行します。
$ grep Huge /proc/meminfo |
HugePagesを使用した場合の制限は次のとおりです。
自動メモリー管理(AMM)とHugePagesは、互換性がありません。AMMを使用すると、SGAメモリー全体は/dev/shm
の下にファイルを作成することによって割り当てられます。Oracle DatabaseがAMMを使用してSGAを割り当てると、HugePagesは予約されません。Oracle Database 12cでHugePagesを使用するには、AMMを無効にする必要があります。
VLMを32ビット環境で使用する場合、データベース・バッファ・キャッシュにHugePagesを使用することはできません。HugePagesは、shared_pool
、large_pool
など、他の部分のSGAに使用できます。VLM(バッファ・キャッシュ)のためのメモリー割当ては、共有メモリー・ファイルシステム(ramfs/tmpfs/shmfs
)を使用して実行されます。メモリー・ファイルシステムでは、HugePagesは予約または使用されません。
システムの起動後に、HugePagesを割当てまたは解放することはできません。ただし、システム管理者が、使用可能なページ数を変更するか、またはプール・サイズを変更することによって、HugePages構成を変更した場合は例外です。システムの起動時に必要な領域がメモリー内に確保されなかった場合、HugePagesの割当てに失敗します。
Red Hat Enterprise Linux 6、SUSE 11、および以前のリリースのOracle Linux Unbreakable Enterprise Kernel 2 (UEK2)に付属するOracle Linux 6では、透過的なHugePagesメモリーがデフォルトで有効になっています。それ以降のリリースのUEK2カーネルでは、透過的なHugePagesメモリーはデフォルトで無効になっています。
透過的なHugePagesを使用すると、実行時にメモリー割当ての遅延が生じます。パフォーマンスの問題を回避するために、透過的なHugePagesはすべてのOracle Databaseサーバーで無効にすることをお薦めします。かわりに標準のHugePagesを使用すると、パフォーマンスが向上します。
透過的なHugePagesメモリーが標準のHugePagesメモリーと異なるのは、カーネルのkhugepaged
スレッドが実行時にメモリーを動的に割り当てるためです。標準のHugePagesメモリーは起動時に事前割当てされ実行中には変更されません。
透過的なHugePagesが有効かどうかを確認するには、root
ユーザーとして次のコマンドのいずれかを実行します。
Red Hat Enterprise Linuxカーネルの場合:
# cat /sys/kernel/mm/redhat_transparent_hugepage/enabled
その他のカーネルの場合:
# cat /sys/kernel/mm/transparent_hugepage/enabled
次に示すのは、[always]
フラグを有効にして使用している透過的なHugePagesを示す出力例です。
[always] never
注意: 透過的なHugePagesをカーネルから削除した場合、/sys/kernel/mm/transparent_hugepage または/sys/kernel/mm/redhat_transparent_hugepage ファイルは存在しません。 |
透過的なHugePagesを無効にするには、次の手順を実行します。
/etc/grub.conf
ファイルで、カーネル・ブートの行に次のエントリを追加します。
transparent_hugepage=never
次に例を示します。
title Oracle Linux Server (2.6.32-300.25.1.el6uek.x86_64) root (hd0,0) kernel /vmlinuz-2.6.32-300.25.1.el6uek.x86_64 ro root=LABEL=/ transparent_hugepage=never initrd /initramfs-2.6.32-300.25.1.el6uek.x86_64.img