SGA与共享内存
SGA的设置在linux/unix上和一个操作系统内核参数有关,这个参数是shmmax.
不同的操作系统中这个参数据设置的地方一样.在solaris上,这个参数是由
/etc/system文件中的shmsys:shminfo_shmmax来定义的.在linux上,该参数
由/proc/sys/kernel/shmmax参数定义.
shmmax内核参数的作用是系统允许的单个共享内存段的最大值.如果该参数
设置小于oracle sga的大小,那么sga仍然可以创建成功,但是会被分配成多
个共享内存段.通常建议通过调整shmmax的大小来使用sga限制在一个共享
内存段.
在windows系统中,由于系统采用多线程服务器(实际上所有的oracle server procees
都是一个进程中的线程),所以不存在共享内存的问题.无需进行特殊设置.
以32位linux平台为例,来看shmmax参数于数据库的影响.linux上该参数据的缺省值
一般是32M
[root@jingyong ~]# more /proc/sys/kernel/shmmax 33554432
操作系统的版本
[root@jingyong ~]# cat /etc/redhat-release Red Hat Enterprise Linux Server release 5.4 (Tikanga)
通过ipcs命令可以查看在shmmax参数为缺省情况下共享内存的分配情况.
可以看到oracle分配了多个共享内存段来满足sga的设置要求:
[root@jingyong ~]# ipcs -sa ------ Shared Memory Segments -------- key shmid owner perms bytes nattch status 0x289516a4 32768 oracle 640 33554432 18 0x289516a4 32778 oracle 640 33554432 18 0x289516a4 32779 oracle 640 33554432 18 0x289516a4 32781 oracle 640 33554432 18 0x289516a4 32784 oracle 640 33554432 18 0x289516a4 32784 oracle 640 4194304 18 0x00000000 65537 gdm 600 393216 2 dest ------ Semaphore Arrays -------- key semid owner perms nsems 0x0bbc1610 98304 oracle 640 154 ------ Message Queues -------- key msqid owner perms used-bytes messages
从上面可以看到sga为160M(171966464字节)被分成了6个共享内存段.
对于每一个后台进程,使用pmap工具可以看到每个共享内存段的地址空间:
[root@jingyong ~]# ps -ef|grep dbw oracle 2220 1 0 Dec26 ? 00:00:02 ora_dbw0_jingyong root 3390 3309 0 02:39 pts/2 00:00:00 grep dbw [root@jingyong ~]# pmap 2220 2220: ora_dbw0_jingyong 00110000 344K r-x-- /u01/app/oracle/product/10.2.0/db/lib/libocrutl10.so 00166000 16K rwx-- /u01/app/oracle/product/10.2.0/db/lib/libocrutl10.so 0016a000 4K rwx-- [ anon ] 0016b000 1904K r-x-- /u01/app/oracle/product/10.2.0/db/lib/libnnz10.so 00347000 152K rwx-- /u01/app/oracle/product/10.2.0/db/lib/libnnz10.so 0036d000 432K rwx-- [ anon ] 003d9000 36K r-x-- /lib/libnss_files-2.5.so 003e2000 4K r-x-- /lib/libnss_files-2.5.so 003e3000 4K rwx-- /lib/libnss_files-2.5.so 00458000 4K r-x-- [ anon ] 00459000 1276K r-x-- /lib/libc-2.5.so 00598000 4K --x-- /lib/libc-2.5.so 00599000 8K r-x-- /lib/libc-2.5.so 0059b000 4K rwx-- /lib/libc-2.5.so 0059c000 12K rwx-- [ anon ] 005b4000 436K r-x-- /u01/app/oracle/product/10.2.0/db/lib/libocr10.so 00621000 4K rwx-- /u01/app/oracle/product/10.2.0/db/lib/libocr10.so 00622000 1032K rwx-- [ anon ] 00839000 4K rwx-- [ anon ] 0089f000 880K r-x-- /u01/app/oracle/product/10.2.0/db/lib/libhasgen10.so 0097b000 20K rwx-- /u01/app/oracle/product/10.2.0/db/lib/libhasgen10.so 00980000 12K rwx-- [ anon ] 0098f000 4K r-x-- /u01/app/oracle/product/10.2.0/db/lib/libskgxn2.so 00990000 4K rwx-- /u01/app/oracle/product/10.2.0/db/lib/libskgxn2.so 009fd000 36K rwx-- [ anon ] 00a5a000 4K rwx-- [ anon ] 00ab7000 128K r-x-- /u01/app/oracle/product/10.2.0/db/lib/libskgxp10.so 00ad7000 8K rwx-- /u01/app/oracle/product/10.2.0/db/lib/libskgxp10.so 00b01000 76K r-x-- /lib/libnsl-2.5.so 00b14000 4K r-x-- /lib/libnsl-2.5.so 00b15000 4K rwx-- /lib/libnsl-2.5.so 00b16000 8K rwx-- [ anon ] 00b36000 88K r-x-- /u01/app/oracle/product/10.2.0/db/lib/libdbcfg10.so 00b4c000 8K rwx-- /u01/app/oracle/product/10.2.0/db/lib/libdbcfg10.so 00bfd000 104K r-x-- /lib/ld-2.5.so 00c17000 4K r-x-- /lib/ld-2.5.so 00c18000 4K rwx-- /lib/ld-2.5.so 00c1b000 4K r-x-- /usr/lib/libaio.so.1.0.1 00c1c000 4K rwx-- /usr/lib/libaio.so.1.0.1 00cbc000 32K r-x-- /u01/app/oracle/product/10.2.0/db/lib/libclsra10.so 00cc4000 4K rwx-- /u01/app/oracle/product/10.2.0/db/lib/libclsra10.so 00d67000 148K r-x-- /lib/libm-2.5.so 00d8c000 4K r-x-- /lib/libm-2.5.so 00d8d000 4K rwx-- /lib/libm-2.5.so 00d90000 8K r-x-- /lib/libdl-2.5.so 00d92000 4K r-x-- /lib/libdl-2.5.so 00d93000 4K rwx-- /lib/libdl-2.5.so 00d96000 76K r-x-- /lib/libpthread-2.5.so 00da9000 4K r-x-- /lib/libpthread-2.5.so 00daa000 4K rwx-- /lib/libpthread-2.5.so 00dab000 8K rwx-- [ anon ] 00e33000 268K r-x-- /u01/app/oracle/product/10.2.0/db/lib/libocrb10.so 00e76000 4K rwx-- /u01/app/oracle/product/10.2.0/db/lib/libocrb10.so 00ee0000 4K rwx-- [ anon ] 00f07000 4K rwxs- /u01/app/oracle/product/10.2.0/db/dbs/hc_jingyong.dat 00f76000 4K rwx-- [ anon ] 00f77000 7028K r-x-- /u01/app/oracle/product/10.2.0/db/lib/libjox10.so 01654000 260K rwx-- /u01/app/oracle/product/10.2.0/db/lib/libjox10.so 01695000 4K rwx-- [ anon ] 048b1000 1556K rwx-- [ anon ] 08048000 77032K r-x-- /u01/app/oracle/product/10.2.0/db/bin/oracle 0cb82000 324K rwx-- /u01/app/oracle/product/10.2.0/db/bin/oracle 0cbd3000 120K rwx-- [ anon ] 0e505000 456K rwx-- [ anon ] 20000000 167936K rwxs- [ shmid=0x8000 ] b7e6a000 64K rwx-- /dev/zero b7e7a000 64K rwx-- /dev/zero b7e8a000 64K rwx-- /dev/zero b7e9a000 64K rwx-- /dev/zero b7eaa000 64K rwx-- /dev/zero b7eba000 64K rwx-- /dev/zero b7eca000 64K rwx-- /dev/zero b7eda000 64K --x-- /dev/zero b7eea000 24K rwx-- /dev/zero b7ef0000 64K rwx-- /dev/zero b7f00000 64K rwx-- /dev/zero b7f10000 64K rwx-- /dev/zero b7f20000 128K rwx-- /dev/zero b7f40000 64K rwx-- /dev/zero b7f50000 64K rwx-- /dev/zero b7f60000 40K rwx-- /dev/zero bffb7000 84K rwx-- [ stack ] total 263492K
为了避免给sga分配多个共享内存段,可以修改shmmax内核参数,使用sga存在于一个
共享内存段中,可以通过修改/proc/sys/kernel/shmmax参数可以达到此目的
[root@jingyong ~]# echo 536870912> /proc/sys/kernel/shmmax [root@jingyong ~]# more /proc/sys/kernel/shmmax 536870912
我修改了512M了,这里对于shmmax参数的修改不会永久的生效,在系统重新启动后
会失效.可以通过修改/etc/sysctl.conf文件来进行永久修改.
在/ect/sysctl.conf文件中增加以下一行这个更改在系统重启后仍然生效
kernel.shmmax=536870912
在修改shmmax参数后,重启数据库使更改生效
在重新启动数据库后我们再来查看共享内存的分配情况:
[root@jingyong ~]# ipcs -sa ------ Shared Memory Segments -------- key shmid owner perms bytes nattch status 0x289516a4 32768 oracle 640 171966464 18 0x00000000 65537 gdm 600 393216 2 dest ------ Semaphore Arrays -------- key semid owner perms nsems 0x0bbc1610 98304 oracle 640 154 ------ Message Queues -------- key msqid owner perms used-bytes messages
可以看到共享内存分配只分配了一个共享内存段
如果没有修改shmmax参数,oracle在启动过程中就会在alert_
Starting ORACLE instance(normal) Thu Nov 21 16:02;02 2012 WARNING:EINVAL creating segment of size 0x0000000033400000 fix shm parameter in /etc/system or equivalent
这是一个警告提示,是建议修改shmmax参数不是强制