SGA (System Global Area) は、Oracle によって割り当てられる共有メモリ構造で、 複数の Oracle インスタンスが SGA 内にある情報を共同使用します。 SGA は読み書き可能ですので、複数のプロセスからのアクセス権を制御する機構 のもとに使用されなければなりません。そのため OS で提供される 共有メモリ構造で構成されています。 ここでは solaris 2.X に基づいて記述します。 ここで示す例は、truss の出力です。
SGA を確認するコマンドは ipcs です。 これで SGA の正確なサイズがわかります。
> ipcs -am IPC status fromas 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 | 説明 | T | m: 共用メモリセグメント | ID | 共用メモリセグメントの識別子で shmget() から返されます | KEY | 共用メモリセグメントを使用するキー | MODE | 共用メモリセグメントのアクセスモード | OWNER | 共用メモリセグメントの所有者のログイン名 | GROUP | 共用メモリセグメントの所有者のグループ名 | CREATOR | 共用メモリセグメントの作成者のログイン名 | CGROUP | 共用メモリセグメントの作成者のグループ名 | NATTCH | 共用メモリセグメントにアタッチしたプロセス数 | SEGSZ | 共用メモリセグメントのサイズ | CPID | 共用メモリセグメントの作成者のプロセス ID | LPID | 共用メモリセグメントを最後にアタッチ/デタッチしたプロセス ID | ATIME | 共用メモリセグメントの最終アタッチ時間 | DTIME | 共用メモリセグメントの最終デタッチ時間 | CTIME | 共用メモリセグメントの作成、変更時間 |
---|
ここで記載している内容は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
shmget は第一引数であるキーが 0 でなく、かつ第三引数であるフラグが ICP_CREAT でない場合、キーに対応する共有メモリ識別子を返します。 shmat はこの共有メモリ識別子を渡されることで、共有メモリのアクセス権を取得します。
shmget(-1866905020, 0, 0) = 6802 shmctl(6802, 12, 0xEFFFE2B0) = 0 shmat(6802, 0x80000000, 040000) = 0x80000000
shmdt(0x80000000) = 0
shmctl(6802, 10, 0) = 0
> 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
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
ISNM/DISM(dynamic intimate shared memory)
Solaris の ISM 機能を使用すると、 アプリケーションがデフォルトの 8K バイトページの代わりに、 4M バイトページを使用できるようになります。
DISM には 共有ページテーブル、大規模ページサポート、ページのロックなど ISM と同じ特長があります。 DISM ではこれに加え、 他のアプリケーションにメモリを解放するためにページのロックが解除され、 共有メモリセグメントのサイズを増やすために新たなページがロックされます。 この機能により、 Oracle データベースのパフォーマンスが著しく向上します。