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

前
 
次
 

G Very Large MemoryおよびHugePages

この章では、Linuxシステム管理者がLinuxシステムにVery Large Memory構成およびHugePagesを構成する方法について説明します。

次の項目について説明します。

G.1 Linux x86のVery Large Memory

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乗バイト)として、物理メモリーを直接使用します。

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

G.1.1 32ビットLinuxでのVLM実装

32ビットのアーキテクチャでは、特定サイズのVLMウィンドウからVLMにアクセスします。VLMウィンドウは、プロセスのアドレス空間におけるデータ構造で、特定サイズのウィンドウから仮想アドレス空間全体にアクセスできるようにします。32ビットLinuxでは、パラメータUSE_INDIRECT_DATA_BUFFERS=TRUEを設定し、/dev/shm上にshmfstmpfsramfsタイプのメモリー内ファイル・システムをマウントして、使用可能なアドレス空間を増やす必要があります。

G.1.2 VLM実装のための前提条件

次に、32ビットのオペレーティング・システムにVLMを実装するための前提条件をいくつか示します。

  • Oracle Databaseがインストールされたコンピュータには、4GBを超えるメモリーが必要です。

  • このコンピュータは、起動時にPAEサポートを使用してカーネルを使用するように構成する必要があります。

  • VLMサポートを使用するデータベース・インスタンスの初期化パラメータ・ファイルには、USE_INDIRECT_DATA_BUFFERS=TRUEを設定する必要があります。

  • 初期化パラメータDB_BLOCK_BUFFERSおよびDB_BLOCK_SIZEには、Oracle Databaseに選択した値を設定する必要があります。

G.1.3 SGAの制限を拡大する方法

通常、32ビットLinuxカーネルでは、最大2.4GBのサイズのSGAを作成することができます。Linux Hugememカーネルを使用すると、3.2GBサイズまでのSGAを作成できます。32ビット・カーネルで3.2GBを超えるには、VLM機能を使用する必要があります。

32ビット・コンピュータでSGAの制限を拡大するには、次の方法があります。

G.1.3.1 Hugememカーネル

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

G.1.3.2 HugememカーネルとVery Large Memory

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)以上の動作が、以前のリリースと同じになります。

また、初期化パラメータDB_BLOCK_BUFFERSおよびSHARED_POOL_SIZEにOracle Databaseで選択した値を設定する必要があります。自動メモリー管理(AMM)は使用できません。初期化パラメータDB_BLOCK_SIZEは、インスタンスのバッファ・キャッシュ・サイズを指定するDB_BLOCK_BUFFERSと組み合せて、ブロック・サイズを設定します。


たとえば、バッファ・キャッシュ以外の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
    

G.1.4 Oracle DatabaseのVery Large Memoryの構成

ramfsを使用してRed Hat Enterprise Linux 4/ Oracle Linux 4にVery Large Memoryを構成するには、次の手順を実行します。

  1. rootユーザーでログインします。

    sudo -sh
    Password:
    
  2. /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が準備されることに注意してください。起動スクリプトにコマンドを含めることもできます。再起動操作を繰り返してコマンドを広範囲にテストする必要があり、コンピュータを構成した後、次の手順を実行します。

  3. サーバーを再起動します。

  4. rootユーザーでログインします。

  5. 次のコマンドを実行して、/dev/shmディレクトリにramfsタイプがマウントされていることを確認します。

    /dev/shm directory is mounted with the ramfs type:
    
    # mount | grep shm
    ramfs on /dev/shm type ramfs (rw)
    
  6. 次のコマンドを実行して、/dev/shmディレクトリの権限を確認します。

    # ls -ld /dev/shm
    drwxr-xr-x  3 oracle oinstall 0 Jan 13 12:12 /dev/shm
    
  7. /etc/security/limits.confファイルを編集し、次のエントリを追加して、メモリー・ロックの上限値を大きくします。

    soft    memlock        3145728
    hard    memlock        3145728
    
  8. oracleユーザーに切り替えます。

    # sudo - oracle
    Password:
    
  9. 次のコマンドを実行して、メモリー・ロックの上限値を確認します。

    $ ulimit -l
    3145728
    
  10. Very Large Memoryのインスタンス・パラメータを構成するには、次の手順を実行します。

    1. DB_CACHE_SIZEDB_xK_CACHE_SIZEsga_targetおよびmemory_targetパラメータをDB_BLOCK_BUFFERSパラメータに置き換えます。

    2. USE_INDIRECT_DATA_BUFFERS=TRUEパラメータを追加します。

    3. SGAの要件に従ってSGAを構成します。

    4. SGA_TARGETMEMORY_TARGETまたはMEMORY_MAX_TARGETパラメータを削除します(設定されている場合)。

  11. データベース・インスタンスを起動します。

  12. 次のコマンドを実行して、メモリー割当てを確認します。

    $ ls -l /dev/shm
    $ ipcs -m
    

関連項目:

HugePagesの詳細は、「LinuxでのHugePagesの構成」を参照してください。

G.1.5 Very Large Memoryの実装に関する制限

コンピュータをVery Large Memoryモードで実行する場合の制限事項は次のとおりです。

  • ramfsを使用してVLMを実装すると、動的SGAチューニングでAMMが動作するため、自動メモリー管理(AMM)は使用できません。AMMスワッピングは可能です。たとえば、未使用のSGA領域をマッピング解除して、PGAにマッピングできます。動的SGAおよびマルチ・ブロック・サイズは、ramfsがスワッピング可能でないため、Very Large Memoryではサポートされません。Very Large Memoryを有効にするには、MEMORY_TARGETの値を0に設定する必要があります。

  • VLMはデータベース・バッファ・キャッシュのサイズが512MBを超える場合のみ実装できます。

G.2 HugePagesの概要

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

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

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

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

  • より大きなページ・サイズによる仮想メモリーの部分のため、カーネル用の記録操作が削減されます。

G.2.2 LinuxでのHugePagesの構成

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

  1. /etc/security/limits.confファイルのmemlock設定を編集します。memlock設定はKB単位で指定し、搭載RAMよりも若干小さく設定します。たとえば、64GBのRAMが搭載されている場合は、次のエントリを追加してメモリー・ロックの上限値を大きくします。

    *   soft   memlock    60397977
    *   hard   memlock    60397977
    

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

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

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

    $ grep Hugepagesize /proc/meminfo
    
  4. 現行の共有メモリー・セグメントの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
      
  5. hugepages_settings.shスクリプトを実行して、hugepages構成の値を計算します。

    $ ./hugepages_settings.sh
    
  6. 次のカーネル・パラメータを設定します。

    # sysctl -w vm.nr_hugepages=value_displayed_in_step_5
    
  7. コンピュータの再起動時に常にこのパラメータ値が使用されるようにするには、/etc/sysctl.confファイルを編集して、次のエントリを追加します。

    vm.nr_hugepages=value_displayed_in_step_5
    
  8. サーバーを再起動します。


    注意:

    使用可能なHugePagesを確認するには、次のコマンドを実行します。
    $ grep Huge /proc/meminfo
    

G.2.3 HugePages構成の制限

HugePagesを使用した場合の制限は次のとおりです。

  • 自動メモリー管理(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の割当てに失敗します。

G.2.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