SGA


  1. SGA とは
  2. SGA を確認する
  3. SGA の割り当て
  4. SGA への参照
  5. SGA への参照の終了
  6. SGA の削除
  7. oracle8i まで
  8. oracle9i から
  9. ISM と DIASM
  10. Linux で大きな SGA を実現するには?

SGA とは

SGA (System Global Area) は、Oracle によって割り当てられる共有メモリ構造で、 複数の Oracle インスタンスが SGA 内にある情報を共同使用します。 SGA は読み書き可能ですので、複数のプロセスからのアクセス権を制御する機構 のもとに使用されなければなりません。そのため OS で提供される 共有メモリ構造で構成されています。 ここでは solaris 2.X に基づいて記述します。 ここで示す例は、truss の出力です。

SGA を確認する

SGA を確認するコマンドは ipcs です。 これで SGA の正確なサイズがわかります。

> ipcs -am
IPC status from  as of 2005年06月02日 (木) 17時07分33秒 JST
T         ID      KEY        MODE        OWNER    GROUP  CREATOR   CGROUP NATTCH     SEGSZ  CPID  LPID   ATIME    DTIME    CTIME
Shared Memory:
m          0   0x50078932 --rw-r--r--     root     root     root     root      1        68   311 16345 11:37:49 11:37:53 23:03:43
m          1   0          --rw-rw-rw-     root     root     root     root      0      4096   588   588 23:03:56 23:03:56 23:03:56
m      24602   0x530248   --rw-r-----   ora806      dba   ora806      dba     26   5824512  1405 13136 21:11:51 21:40:31 19:27:39
m      18603   0xc59a7828 --rw-r-----   sup817      dba   sup817      dba      9 243818496 29136 24707 20:03:34 20:06:08 11:59:32
m      10204   0x7802778c --rw-rw----   pro817      dba   pro817      dba     14 160194560 16077  4443 10:05:19 17:07:05 14:00:45
m    1507205   0x60b8bbdc --rw-rw----   pro901      dba   pro901      dba     10 252207104  2110 28246 15:28:34 17:11:19 12:38:18
m      85206   0xd3a44b8c --rw-r-----   ora816      dba   ora816      dba     13 102326272 29069  5601 15:59:12 16:05:07 10:49:01
m      15607   0xe1097dcc --rw-r----- ora920tx      dba ora920tx      dba     10 109051904  9023  3828 20:33:53 22:42:08 19:52:56
m       3608   0x24a7f758 --rw-r-----   ora901      dba   ora901      dba      7 117989376 12778 22337 16:23:45 17:30:47 23:11:27
m       9010   0xbe6a32d8 --rw-r-----   pro816      dba   pro816      dba     12 372629504   444  2980 11:50:53 11:50:53  0:42:51

カラム ID説明
Tm: 共用メモリセグメント
ID共用メモリセグメントの識別子で shmget() から返されます
KEY共用メモリセグメントを使用するキー
MODE共用メモリセグメントのアクセスモード
OWNER共用メモリセグメントの所有者のログイン名
GROUP共用メモリセグメントの所有者のグループ名
CREATOR共用メモリセグメントの作成者のログイン名
CGROUP共用メモリセグメントの作成者のグループ名
NATTCH共用メモリセグメントにアタッチしたプロセス数
SEGSZ共用メモリセグメントのサイズ
CPID共用メモリセグメントの作成者のプロセス ID
LPID共用メモリセグメントを最後にアタッチ/デタッチしたプロセス ID
ATIME共用メモリセグメントの最終アタッチ時間
DTIME共用メモリセグメントの最終デタッチ時間
CTIME共用メモリセグメントの作成、変更時間

SGA の割り当て

ここで記載している内容はoracle 8i までのものです。 oracle 9 からは、若干の違いがあります。

SGA は svrmgrl から起動される Oracle プロセスによって以下の手順で割り当てられる。

まず、shmget が第二引数で指定されるサイズ分の共有メモリを作成します。
次に、shmat がその共有メモリのアクセス権を取得します。 この時、第三引数であるフラグが 04000(8) なので、 SHM_SHARE_MMU つまり ISM (Intimate Shared Memory) であることが解かります。 これはこの共有メモリが swapout されない属性であることを示します。 したがって、solaris の場合 SGA 全体が、実メモリに常駐します。 (ISM がデフォルト)

oracle では SGA が実メモリに常駐することを推奨しています。 そのためには init.ora に LOCK_SGA=true を設定します。 しかし OS にその機能がない場合は、無視されます。


shmget(-1866905020, 5808128, 0660|IPC_CREAT|IPC_EXCL) = 6802
shmat(6802, 0x80000000, 040000)                 = 0x80000000

SGA への参照

いったん共有メモリが作成されると、他のプロセスからそれを参照できるように なります。

shmget は第一引数であるキーが 0 でなく、かつ第三引数であるフラグが ICP_CREAT でない場合、キーに対応する共有メモリ識別子を返します。 shmat はこの共有メモリ識別子を渡されることで、共有メモリのアクセス権を取得します。


shmget(-1866905020, 0, 0)                       = 6802
shmctl(6802, 12, 0xEFFFE2B0)                    = 0
shmat(6802, 0x80000000, 040000)                 = 0x80000000

SGA への参照の終了

shmat を発効したプロセスは SGA の参照を終了した場合、shmdt を呼んで、 終了を告知します。


shmdt(0x80000000)                               = 0

SGA の削除

最後の参照が終了したあとに、共有メモリを削除します。 これは、共有メモリを作成したプロセスが shmdt を呼ぶことによって行われます。


shmctl(6802, 10, 0)                             = 0

oracle8i まで

> pmap -x 21701
21701:  ora_cjq0_ora92032
 Address   Kbytes Resident Shared Private Permissions       Mapped File
00010000   49136   25304   25304       - read/exec         oracle
0301A000     488     360     312      48 read/write/exec   oracle
03094000     288     160     120      40 read/write/exec     [ heap ]
20000000  593920  593920  593920       - read/write/exec/shared  [ ism shmid=0x141e5 ]
FEB00000       8       8       8       - read/write          [ anon ]
FEB10000       8       8       8       - read/write          [ anon ]
FEB50000       8       8       -       8 read/write          [ anon ]
FEB58000      48      48       8      40 read/write          [ anon ]
FEB68000      32      32       -      32 read/write          [ anon ]
FEBB0000      16      16      16       - read/exec         libmp.so.2
FEBC4000       8       8       8       - read/write/exec   libmp.so.2
FEBD0000      88      72      72       - read/exec         libm.so.1
FEBF4000       8       8       8       - read/write/exec   libm.so.1
FEC00000    4416    1216    1216       - read/exec         libjox9.so
FF05E000     192     168     168       - read/write/exec   libjox9.so
FF0A0000       8       8       8       - read/exec         libkstat.so.1
FF0B2000       8       8       8       - read/write/exec   libkstat.so.1
FF0C0000      24      24      24       - read/exec         librt.so.1
FF0D6000       8       8       8       - read/write/exec   librt.so.1
FF0E0000      32      24      24       - read/exec         libaio.so.1
FF0F8000       8       8       8       - read/write/exec   libaio.so.1
FF100000     688     632     632       - read/exec         libc.so.1
FF1BC000      32      32      16      16 read/write/exec   libc.so.1
FF1D0000       8       8       8       - read/write/exec     [ anon ]
FF1E0000       8       8       8       - read/exec         libsched.so.1
FF1F2000       8       8       8       - read/write/exec   libsched.so.1
FF200000     568     392     392       - read/exec         libnsl.so.1
FF29E000      40      40      40       - read/write/exec   libnsl.so.1
FF2A8000      24      16      16       - read/write/exec   libnsl.so.1
FF2C0000      16      16      16       - read/exec         libc_psr.so.1
FF2D0000       8       8       8       - read/write/exec/shared   [ anon ]
FF2E0000       8       8       -       8 read/write/exec     [ anon ]
FF2F0000      24      24      24       - read/exec         libgen.so.1
FF306000       8       8       8       - read/write/exec   libgen.so.1
FF310000      40      40      40       - read/exec         libsocket.so.1
FF32A000       8       8       8       - read/write/exec   libsocket.so.1
FF330000       8       8       8       - read/exec         libskgxn9.so
FF340000       8       8       8       - read/write/exec   libskgxn9.so
FF350000       8       8       8       - read/exec         libskgxp9.so
FF360000       8       8       8       - read/write/exec   libskgxp9.so
FF370000       8       8       8       - read/exec         libodmd9.so
FF380000       8       8       8       - read/write/exec   libodmd9.so
FF390000       8       8       8       - read/exec         libdl.so.1
FF3A0000       8       8       -       8 read/write/exec     [ anon ]
FF3B0000     160     160     160       - read/exec         ld.so.1
FF3E8000       8       8       -       8 read/write/exec   ld.so.1
FFBE8000      32      32      16      16 read/write/exec     [ stack ]
--------  ------  ------  ------  ------
total Kb  650504  622928  622704     224

oracle9i から


oracle 9 からは SGA_MAX_SIZE を指定できますが、 このサイズ分はじめから実メモリを確保するのではなく、 不足した場合に動的に OS により実メモリにマップされます。

下記の例は、SGA_MAX_SIZE が 11.6G ですが、 現在実メモリにマップされているのは 3633152KB(3.46G) です (RSS(Resident physical memory)) 。

また3カラム目の Anon は、そのプロセスが個別に使っている、 データセグメント、スタックセグメントを表しています。

> pmap -x 11233
11233:  ora_smon_dbtp0601
         Address     Kbytes        RSS       Anon     Locked Mode   Mapped File
0000000100000000      50472      28912          -          - r-x--  oracle       text segment
0000000103248000        712        536        112          - rwx--  oracle       data segment
00000001032FA000        464        336        336          - rwx--    [ heap ]
0000000380000000       4096       4096          -          - rwxs-    [ dism shmid=0x6a6 ]
0000040000000000    2457600          -          -          - rwxs-    [ dism shmid=0x7020 ]
00000400C0000000    3670016          -          -          - rwxs-    [ dism shmid=0x35ed ]
00000401C0000000    3665920    3633152          -          - rwxs-    [ dism shmid=0x196 ]    SGA 
FFFFFFFF7CBF0000        200        200        200          - rw--R    [ anon ]
FFFFFFFF7CC2E000          8          8          8          - rw--R    [ anon ]
FFFFFFFF7CD70000        512        512        512          - rw--R    [ anon ]
FFFFFFFF7CE00000          8          8          8          - rw--R    [ anon ]
FFFFFFFF7CE10000          8          8          8          - rw--R    [ anon ]
FFFFFFFF7CE50000        192        192        192          - rw--R    [ anon ]
FFFFFFFF7CF00000          8          8          8          - rwx--    [ anon ]
FFFFFFFF7D000000          8          8          -          - r-x--  libmd5.so.1
FFFFFFFF7D102000          8          8          8          - rwx--  libmd5.so.1
FFFFFFFF7D200000         16         16          -          - r-x--  libmp.so.2
FFFFFFFF7D304000          8          8          8          - rwx--  libmp.so.2
FFFFFFFF7D400000        216        160          -          - r-x--  libm.so.1
FFFFFFFF7D534000         16         16         16          - rwx--  libm.so.1
FFFFFFFF7D600000          8          8          8          - rwx--    [ anon ]
FFFFFFFF7D700000          8          8          -          - r-x--  libkstat.so.1
FFFFFFFF7D802000          8          8          8          - rwx--  libkstat.so.1
FFFFFFFF7D900000         32         32          -          - r-x--  librt.so.1
FFFFFFFF7DA08000          8          8          8          - rwx--  librt.so.1
FFFFFFFF7DB00000         32         32          -          - r-x--  libaio.so.1
FFFFFFFF7DC08000          8          8          8          - rwx--  libaio.so.1
FFFFFFFF7DC0A000          8          -          -          - rwx--  libaio.so.1
FFFFFFFF7DD00000        720        720          -          - r-x--  libc.so.1
FFFFFFFF7DEB4000         56         56         56          - rwx--  libc.so.1
FFFFFFFF7DEC2000          8          8          8          - rwx--  libc.so.1
FFFFFFFF7DF00000          8          8          8          - rwx--    [ anon ]
FFFFFFFF7E000000         32         24          -          - r-x--  libgen.so.1
FFFFFFFF7E108000          8          8          8          - rwx--  libgen.so.1
FFFFFFFF7E200000         48         48          -          - r-x--  libsocket.so.1
FFFFFFFF7E30C000         16         16         16          - rwx--  libsocket.so.1
FFFFFFFF7E400000       5328       2728          -          - r-x--  libjox9.so
FFFFFFFF7EA32000        384        288        288          - rwx--  libjox9.so
FFFFFFFF7EA92000          8          -          -          - rwx--  libjox9.so
FFFFFFFF7EB00000          8          8          -          - r-x--  libc_psr.so.1
FFFFFFFF7EC00000        664        288          -          - r-x--  libnsl.so.1
FFFFFFFF7EDA6000         56         56         56          - rwx--  libnsl.so.1
FFFFFFFF7EDB4000         40         32         32          - rwx--  libnsl.so.1
FFFFFFFF7EE00000          8          8          8          - rwx--    [ anon ]
FFFFFFFF7EF00000         32         24          -          - r-x--  libskgxn9.so
FFFFFFFF7F006000          8          8          8          - rwx--  libskgxn9.so
FFFFFFFF7F100000          8          8          -          - r-x--  libskgxp9.so
FFFFFFFF7F200000          8          8          8          - rwx--  libskgxp9.so
FFFFFFFF7F300000          8          8          -          - r-x--  libodmd9.so
FFFFFFFF7F400000          8          8          8          - rwx--  libodmd9.so
FFFFFFFF7F500000          8          8          -          - r-x--  libdl.so.1
FFFFFFFF7F600000        152        152          -          - r-x--  ld.so.1
FFFFFFFF7F724000         16         16         16          - rwx--  ld.so.1
FFFFFFFF7F728000          8          8          8          - rwx--  ld.so.1
FFFFFFFF7FFE4000        112        112        112          - rw---    [ stack ]      stack segment
---------------- ---------- ---------- ---------- ----------
        total Kb    9858360    3672944       2088          -

以下がこの時の ipcs の結果です。 ipcs のID とpmap の Mapped File の shmid とが一致します(表記が10進と16進)。 shmid=0x196 は ID=406 でこれにのみ KEY が割り当てられていることからも、 実メモリが割り当てられていることが解ります。

T         ID      KEY        MODE        OWNER    GROUP  CREATOR   CGROUP NATTCH      SEGSZ  CPID  LPID   ATIME    DTIME    CTIME
Shared Memory:
m          0   0xde021c3e --rw-------     root     root     root     root      1       3840   173 13307 23:06:58 23:06:58  7:52:04
m          1   0xde021c3d --rw-------     root     root     root     root      1        768   173 11072  7:52:04 22:21:55  7:52:04
m       1702   0          --rw-r-----   oracle      dba   oracle      dba     88    4194304 11188 18199 17:36:43 17:36:55 22:23:40
m        103   0xcace     --rw-rw-rw-     root    other     root    other      0          2  6773 10941 15:03:17 15:03:17 20:45:03
m      28704   0          --rw-r-----   oracle      dba   oracle      dba     88 2516582400 11188 18199 17:36:43 17:36:55 22:23:40
m      13805   0          --rw-r-----   oracle      dba   oracle      dba     88 3758096384 11188 18199 17:36:43 17:36:55 22:23:40
m        406   0x60b99a54 --rw-r-----   oracle      dba   oracle      dba     88 3753902080 11188 18199 17:36:43 17:36:55 22:23:40  

ISM と DIASM

ISNM/DISM(dynamic intimate shared memory)

Solaris の ISM 機能を使用すると、 アプリケーションがデフォルトの 8K バイトページの代わりに、 4M バイトページを使用できるようになります。

DISM には 共有ページテーブル、大規模ページサポート、ページのロックなど ISM と同じ特長があります。 DISM ではこれに加え、 他のアプリケーションにメモリを解放するためにページのロックが解除され、 共有メモリセグメントのサイズを増やすために新たなページがロックされます。 この機能により、 Oracle データベースのパフォーマンスが著しく向上します。



関連項目 (solaris)

shmget(2),shmat(2),shmdt(2),shmctl(2),ipcs(1),truss(1)