Oracle® Database管理者リファレンス 12c リリース1 (12.1) for Linux and UNIX-Based Operating Systems B71275-11 |
|
前 |
次 |
この章では、HugePagesの概要を説明し、Linuxシステム管理者がLinuxでHugePagesを構成する方法を説明します。
HugePagesは、Linuxカーネル2.6に統合された機能です。HugePagesを有効にすると、オペレーティング・システムはデフォルト(通常、4KB)より大きいメモリー・ページをサポートできます。大規模なページ・サイズを使用すると、ページ表エントリへのアクセスに必要なシステム・リソースの量を削減することにより、システム・パフォーマンスを向上させることができます。32ビットおよび64ビット構成の両方で使用できます。HugePagesのサイズは、カーネル・バージョンとハードウェア・アーキテクチャに応じて、2MBから256MBになります。Oracle Databaseの場合、HugePagesを使用すると、ページ状態のオペレーティング・システム・メンテナンスが軽減され、Translation Lookaside Buffer(TLB)ヒット率が向上します。
注意: 現時点で、透過的なHugepagesは、手動によるHugePagesの構成の代替手段になりません。 |
この項では、次の項目について説明します。
HugePagesを使用しない場合、オペレーティング・システムではページごとに4KBのメモリーが保持されます。オペレーティング・システムによってページがデータベースのシステム・グローバル領域(SGA)に割り当てられると、オペレーティング・システム・カーネルはSGAに割り当てられた4KBページのそれぞれについて継続的に、ページ表にページ・ライフサイクルを反映する必要があります(ダーティ、空き、プロセスにマッピング済など)。
HugePagesを使用した場合、各ページ表のエントリは2MBから256MBのページを指しているため、オペレーティング・システムのページ表(仮想メモリーから物理メモリーへのマッピング)は小さくなります。
また、カーネルによるライフサイクル監視が必要なページの数が少なくなります。たとえば、64-bitのハードウェアでHugePagesを使用する場合、256MBのメモリーをマップするには、1ページの表エントリ(PTE)が必要です。HugePagesを使用しないで256MBのメモリーをマップするには、256MB×1024KB/4KB=65536PTEが必要です。
HugePagesには次の利点があります。
TLBヒットが増加することによってパフォーマンスが向上します。
ページはメモリー内でロックされ、スワップ・アウトが発生しないので、SGAなどの共有メモリー構造のRAMとして使用できます。
連続するページを事前に割り当てるため、System V共有メモリー(SGAなど)以外に使用できなくなります。
ページ・サイズが大きいので、仮想メモリーのうち該当する部分についてカーネルが行う記録作業が少なくなります。
コンピュータにHugePagesを構成するには、次の手順を実行します。
次のコマンドを実行してカーネルでHugePagesがサポートされているかどうかを確認します。
$ grep Huge /proc/meminfo
Linuxシステムによっては、HugePagesがデフォルトでサポートされていません。このようなシステムの場合、CONFIG_HUGETLBFS
およびCONFIG_HUGETLB_PAGE
構成オプションを使用してLinuxカーネルを構築します。CONFIG_HUGETLBFS
は「File Systems」の下にあり、CONFIG_HUGETLB_PAGE
はCONFIG_HUGETLBFS
を選択すると選択されます。
/etc/security/limits.conf
ファイルのmemlock
設定を編集します。memlock
設定はKB単位で指定し、ロックされるメモリーの上限値を、HugePagesメモリーが有効の場合は現行RAMの90パーセント以上に設定し、HugePagesメモリーが無効の場合は3145728KB (3GB)以上に設定する必要があります。たとえば、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
注意: このスクリプトを実行する前に、hugepages を使用するすべてのアプリケーションが実行中であることを確認します。 |
次のカーネル・パラメータを設定します。valueは、手順7で決定したHugePages値です。
# sysctl -w vm.nr_hugepages=value
HugePagesがシステム再起動後に確実に割り当てられるようにするために、次のエントリを/etc/sysctl.conf
ファイルに追加します。valueは、手順7で決定したHugePages値です。
vm.nr_hugepages=value
次のコマンドを実行して、使用可能なhugepages
を確認します。
$ grep Huge /proc/meminfo
インスタンスを再起動します。
次のコマンドを実行して、使用可能なhugepages
(1から2ページの空きページ)を確認します。
$ grep Huge /proc/meminfo
注意: nr_hugepages を使用してHugePages割当てを設定できない場合は、空きメモリーが断片化している可能性があります。サーバーを再起動するとHugepages割当てが有効になります。 |
HugePagesには次の制限があります。
初期化パラメータMEMORY_TARGET
およびMEMORY_MAX_TARGET
の両方の設定を解除する必要があります。たとえば、データベース・インスタンスのパラメータの設定を解除するには、コマンドALTER SYSTEM RESET
を使用します。
自動メモリー管理(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の割当てに失敗します。
アプリケーションによって余分なHugePagesが使用されない場合にシステムでメモリーが不足することがあるため、HugePagesが適切に構成されていることを確認します。
インスタンスの起動時に十分なHugePagesがなく、初期化パラメータuse_large_pages
がonly
に設定されている場合、データベースは起動できず、アラート・ログ・メッセージに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