| 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