ヘッダーをスキップ
Oracle Database管理者リファレンス
11gリリース1(11.1) for Linux and UNIX-Based Operating Systems
E05786-05
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

H LinuxのVery Large Memory

Oracle Database for Linux 32-bitは、Very Large Memory(VLM)構成をサポートします。この構成を使用すると、Oracle Databaseは、これまでLinuxアプリケーションで使用可能だった4GBを超えるRAMにアクセスできます。Oracle VLMオプションは、大規模なデータベース・バッファ・キャッシュを作成するために使用されます。VLMモードでコンピュータを実行するには、Linuxでの設定を変更する必要があります。また、使用できる機能およびinit.oraパラメータにいくつかの制限が課せられます。


注意:

この付録は、Linux x86にのみ適用されます。

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

H.1 共有グローバル領域のチューニング

Oracleデータベースに関連付けられた基本メモリー構造には、システム・グローバル領域(SGA)とプログラム・グローバル領域(PGA)が含まれます。SGAは、SGAコンポーネントと呼ばれる共有メモリー構造のグループで、1つのOracleデータベース・インスタンスのデータおよび制御情報を保持します。SGAは、すべてのサーバーおよびバックグラウンド・プロセスで共有されます。PGAは、サーバー・プロセスのデータおよび制御情報を保持するメモリー領域です。

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

H.1.1 SGAの手動チューニング

32ビット・コンピュータのシステム・グローバル領域の制限を拡大するには、初期化パラメータDB_BLOCK_BUFFERSおよびSHARED_POOL_SIZEに、Oracleデータベース用に選択した値を手動で設定する必要があります。インスタンスのブロック・サイズを選択するには、初期化パラメータDB_BLOCK_SIZEを使用します。バッファのキャッシュ・サイズは、初期化パラメータDB_BLOCK_BUFFERSによって設定されます。

通常の32ビットLinuxカーネルでは、4GBのアドレス空間を3GBのユーザー空間と1GBのカーネルに分割します。

For Example: Let us consider a configuration with three GB user sapce and one GB Kernel.
On normal kernel we have the following default memory layout for every process:
1.0 GB Text code
1.7 GB Available process memory for address space
0.3 GB Stack
1.0 GB Kernel

この例から、1.7GBをSGAとして使用できることがわかります。これは、共有プールで効果的に使用できます。

1GBカーネルのアドレス可能空間には、次のメモリー・ゾーンがあります。

H.1.1.1 ZONE_DMA

このゾーンは、物理メモリーの最初の16MBにマップされます。一部のデバイスは、このゾーンをデータ転送に使用します。

H.1.1.2 ZONE_NORMAL

このゾーンは、物理メモリーの16〜896MBにマップされます。これはロー・メモリーゾーンとも呼ばれます。このゾーンはカーネル空間に永久的にマップされます。カーネル・リソースの大半がこの空間に存在し、ここから操作できるため、パフォーマンスへの影響が大きいゾーンです。そのため、カーネル・リソースを大量に消費するアプリケーションを実行すると、ロー・メモリーに負担がかかる可能性があります。ロー・メモリーの不足は、パフォーマンスの低下やシステム・ハングの原因にもなります。

H.1.1.3 ZONE_HIGHMEM

Linuxは、アドレス空間に直接マップされていないメモリーにアクセスできません。カーネルは、仮想アドレス空間に物理ページをマップしなければ、1GBを超えるメモリーを使用できません。カーネルはZONE_NORMALゾーンにこれらのページをマップして、ZONE_HIGHMEMゾーンのページにアクセスします。

H.1.2 SGAの自動チューニング

10gから、SGA_TARGETパラメータが導入され、共有プール、Javaプール、ラージ・プールおよびデータベース・バッファ・キャッシュなどのデータベース・パラメータの自動チューニングが容易になりました。自動チューニングの対象となるメモリー・コンポーネントのサイズを増減するには、SGA_TARGETパラメータを0以外の値に設定する必要があります。

11gでは、この機能が見直され、SGAおよびPGAメモリー・コンポーネントの自動チューニングを容易にするMEMORY_TARGETという新しいパラメータが導入されました。

VLMでは、動的SGAおよびマルチ・ブロック・サイズはサポートされません。システムでVLMを有効にするには、SGA_TARGETまたはMEMORY_TARGETの値を0に設定する必要があります。システムでVLMが有効な場合、データベース・バッファ・キャッシュに追加のメモリーを使用できます。


注意:

システムにVLMを実装する前に、同じシステム上のSGA_TARGETまたはMEMORY_TARGETパラメータの設定を解除することをお薦めします。

H.2 SGAの制限を拡大する方法

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

H.2.1 Hugememカーネル

Linux hugememカーネルを使用すると、大規模なメモリー・システムを使用できます。これにより、最大3.6GBのSGAを作成できます。hugememカーネルでは、カーネル空間とユーザー空間に各4GBのアドレス空間を使用できます。32ビット・コンピュータでは、使用可能な4GBのアドレス空間を、3GBの仮想メモリー空間(ユーザー定義プロセスの実行に使用できる空間)と、1GBのカーネル空間に分割します。ただし、SGAのサイズを増加するには、hugememカーネルを使用する必要があります。

hugememカーネルは、32ビット・カーネルが仮想アドレス空間の4GB制限を超えて16GBのメモリーにアクセスするのをサポートし、最大64GBの物理メモリーをサポートします。アドレス空間の切替えによるパフォーマンスのオーバーヘッドと比較して、hugememカーネルは大容量のコンピュータの安定性を向上します。このカーネルは、1プロセス当たり4GBのユーザー空間(他のカーネルの場合は3GB)、および4GBの直接カーネル空間をサポートします。hugememカーネルは、メイン・メモリーが4GBを超えるマルチプロセッサ・コンピュータにソフトウェアをインストールする場合に使用します。また、少ないメモリーで稼働する構成にも効果があります。

次のコマンドを実行すると、hugememカーネルを使用しているかどうかを判別できます。

$ uname -r
2.6.9-5.0.3.ELhugemem
For Example: Let us consider a configuration with four GB user sapce and four GB Kernel.
If we lower the SGA attach address, then it results in 3.42 GB process memory:

3.42 GB Available process memory for address space
0.25 GB Kernel "trampoline"
0.33 GB Sga base
4.00 GB Kernel

H.2.2 hugememカーネルとVLM

Oracleデータベースは、hugememを使用する32ビットのPhysical Address Extension(PAE)システムで、共有メモリー・ファイル・システムを使用できます。これはVery Large Memory(VLM)と呼ばれる機能です。VLMは、SGAを1.7GBから62GBに増加できます。ただし、ユーザー空間アドレスは4GBに制限されます。

Oracleで共有メモリー・ファイル・システムを使用するには、VLM機能を有効にする必要があります。この機能は、SGAのバッファ・キャッシュをSystem Vの共有メモリーから共有メモリー・ファイル・システムに移動します。RHEL4/OEL4でVLMオプションを使用して大規模なバッファ・キャッシュを作成するには、次の2つのオプションがあります。

  • shmfsの使用: 特定のサイズのshmfs/dev/shmにマウントし、適切な権限を設定します。RHEL4/OEL4で、shmfsによって割り当てられたメモリーはページング可能です。

  • ramfsの使用: ramfsは、shmfsに類似していますが、ページングまたはスワッピングできないという点が異なります。この方法を使用すると、一般に望ましい効果が得られます。ramfsを作成するには、mount -t ramfs ramfs /dev/shm(先にunmount /dev/shm)を使用します。ここでの唯一の違いは、ramfsページには、ラージ・ページのサポートがないことです。


注意:

VLMサポートを使用するデータベース・インスタンスの初期化パラメータ・ファイルに、USE_INDIRECT_DATA_BUFFERS=TRUEを設定する必要があります。このパラメータを設定しないと、Oracle Database 11gリリース1(11.1)以上の動作が、以前のリリースとまったく同じになります。

64GBのRAMを搭載した32ビット・コンピュータで、SGAを約62GBまで増加できます。VLM構成では、メモリー内にキャッシュするデータベース・バッファが増加し、データベース・パフォーマンスが改善されます。その結果、VLMを使用しない構成と比較して、ディスクI/Oが減少します。プロセッサのPage Address Extension(PAE)機能により、64GBのRAMの物理アドレッシングが可能になります。ただし、PAEでは、4GBを超える場合、プログラムはアドレスに直接アクセスできません。そのため、サイズが4GB以上の場合は、プログラムを共有メモリーに直接アタッチできません。カーネルでサポートされる仮想メモリーと同じサイズの共有メモリー・ファイル・システムを作成すると、この問題を解決できます。この共有ファイル・システムを使用して、プログラムをこのファイル・システムの領域に動的にアタッチできます。共有メモリー・ファイル・システムを使用すると、Oracleなどの大規模なアプリケーションが、32ビット・コンピュータで大容量の共有メモリーにアクセスできるようになります。

VLMでは、512MBの非バッファ・キャッシュSGAをVLM自体の管理に使用します。このメモリー領域は、共有メモリー・ファイル・システム・バッファなどの間接データ・バッファをプロセス・アドレス空間にマップする際にVLMによって使用されます。

たとえば、2.5GBの共有プール用の非バッファ・キャッシュSGAがある場合、2GBの非バッファ・キャッシュSGAが共有プール、ラージ・プールおよびREDOログ・バッファに使用されます。残りの512MBの非バッファ・キャッシュは、VLMの管理に使用されます。

H.3 OracleデータベースのVLMの構成

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

  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所有者アカウントのグループです。

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

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

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

    # 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        3145728hard    memlock        3145728
    
  8. oracleユーザーに切り替えます。

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

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

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

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

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

    4. SGA_TARGETを削除します(設定されている場合)。

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

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

    $ ls -l /dev/shm
    $ ipcs -m
    
  13. 次のコマンドを実行して、変数Hugepagesizeの値を表示します。

    $ grep Hugepagesize /proc/meminfo
    
  14. 現行の共有メモリー・セグメントの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') echo "Recommended setting: vm.nr_hugepages = $NUM_PG" ;;
          *) echo "Unrecognized kernel version $KERN. Exiting." ;;
      esac
      # End
      
    3. 次のコマンドを実行して、ファイルの権限を変更します。

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

    $ ./hugepages_settings.sh
    

    注意:

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

  16. 次のカーネル・パラメータを設定します。

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

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

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

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

    $ grep Huge /proc/meminfo
    

    注意:

    nr_hugepagesパラメータの設定が有効でない場合は、サーバーを再起動してください。

H.4 VLMの実装に関する制限

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