プライマリ・コンテンツに移動
Oracle® Database管理者リファレンス
12c リリース1 (12.1) for Linux and UNIX-Based Operating Systems
B71275-11
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

G HugePages

この章では、HugePagesの概要を説明し、Linuxシステム管理者がLinuxでHugePagesを構成する方法を説明します。

G.1 HugePagesの概要

HugePagesは、Linuxカーネル2.6に統合された機能です。HugePagesを有効にすると、オペレーティング・システムはデフォルト(通常、4KB)より大きいメモリー・ページをサポートできます。大規模なページ・サイズを使用すると、ページ表エントリへのアクセスに必要なシステム・リソースの量を削減することにより、システム・パフォーマンスを向上させることができます。32ビットおよび64ビット構成の両方で使用できます。HugePagesのサイズは、カーネル・バージョンとハードウェア・アーキテクチャに応じて、2MBから256MBになります。Oracle Databaseの場合、HugePagesを使用すると、ページ状態のオペレーティング・システム・メンテナンスが軽減され、Translation Lookaside Buffer(TLB)ヒット率が向上します。


注意:

現時点で、透過的なHugepagesは、手動によるHugePagesの構成の代替手段になりません。

この項では、次の項目について説明します。

G.1.1 HugePagesによるSGAのチューニング

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など)以外に使用できなくなります。

  • ページ・サイズが大きいので、仮想メモリーのうち該当する部分についてカーネルが行う記録作業が少なくなります。

G.1.2 LinuxでのHugePagesの構成

コンピュータにHugePagesを構成するには、次の手順を実行します。

  1. 次のコマンドを実行してカーネルでHugePagesがサポートされているかどうかを確認します。

    $ grep Huge /proc/meminfo
    
  2. Linuxシステムによっては、HugePagesがデフォルトでサポートされていません。このようなシステムの場合、CONFIG_HUGETLBFSおよびCONFIG_HUGETLB_PAGE構成オプションを使用してLinuxカーネルを構築します。CONFIG_HUGETLBFSは「File Systems」の下にあり、CONFIG_HUGETLB_PAGECONFIG_HUGETLBFSを選択すると選択されます。

  3. /etc/security/limits.confファイルのmemlock設定を編集します。memlock設定はKB単位で指定し、ロックされるメモリーの上限値を、HugePagesメモリーが有効の場合は現行RAMの90パーセント以上に設定し、HugePagesメモリーが無効の場合は3145728KB (3GB)以上に設定する必要があります。たとえば、64GBのRAMが搭載されている場合は、次のエントリを追加してメモリー内にロックされるアドレス空間の上限値を大きくします。

    *   soft   memlock    60397977
    *   hard   memlock    60397977
    

    memlockの値をSGA要件よりも大きく設定することもできます。

  4. oracleユーザーとして再度ログインし、ulimit -lコマンドを実行して新しいmemlock設定を確認します。

    $ ulimit -l
    60397977
    
  5. 次のコマンドを実行して、変数Hugepagesizeの値を表示します。

    $ grep Hugepagesize /proc/meminfo
    
  6. 現行の共有メモリー・セグメントのhugepages構成の推奨値を計算するスクリプトを作成するには、次の手順を実行します。

    1. hugepages_settings.shという名前のテキスト・ファイルを作成します。

    2. 次の内容をファイルに追加します。

      #!/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
      
    3. 次のコマンドを実行して、ファイルの権限を変更します。

      $ chmod +x hugepages_settings.sh
      
  7. hugepages_settings.shスクリプトを実行して、hugepages構成の値を計算します。

    $ ./hugepages_settings.sh
    

    注意:

    このスクリプトを実行する前に、hugepagesを使用するすべてのアプリケーションが実行中であることを確認します。

  8. 次のカーネル・パラメータを設定します。valueは、手順7で決定したHugePages値です。

    # sysctl -w vm.nr_hugepages=value
    
  9. HugePagesがシステム再起動後に確実に割り当てられるようにするために、次のエントリを/etc/sysctl.confファイルに追加します。valueは、手順7で決定したHugePages値です。

    vm.nr_hugepages=value
    
  10. 次のコマンドを実行して、使用可能なhugepagesを確認します。

    $ grep Huge /proc/meminfo
    
  11. インスタンスを再起動します。

  12. 次のコマンドを実行して、使用可能なhugepages(1から2ページの空きページ)を確認します。

    $ grep Huge /proc/meminfo
    

    注意:

    nr_hugepagesを使用してHugePages割当てを設定できない場合は、空きメモリーが断片化している可能性があります。サーバーを再起動するとHugepages割当てが有効になります。

G.1.3 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_poollarge_poolなど、他の部分のSGAに使用できます。VLM(バッファ・キャッシュ)のためのメモリー割当ては、共有メモリー・ファイルシステム(ramfs/tmpfs/shmfs)を使用して実行されます。メモリー・ファイルシステムでは、HugePagesは予約または使用されません。

  • システムの起動後に、HugePagesを割当てまたは解放することはできません。ただし、システム管理者が、使用可能なページ数を変更するか、またはプール・サイズを変更することによって、HugePages構成を変更した場合は例外です。システムの起動時に必要な領域がメモリー内に確保されなかった場合、HugePagesの割当てに失敗します。

  • アプリケーションによって余分なHugePagesが使用されない場合にシステムでメモリーが不足することがあるため、HugePagesが適切に構成されていることを確認します。

  • インスタンスの起動時に十分なHugePagesがなく、初期化パラメータuse_large_pagesonlyに設定されている場合、データベースは起動できず、アラート・ログ・メッセージにHugepagesに関して必要な情報が表示されます。

G.1.4 透過的な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を無効にするには、次の手順を実行します。

  1. /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