shmmax内核参数定义单个共享内存段的最大值,如果该参数设置小于Oracle SGA设置,那么SGA就会被分配多个共享内存段。这在繁忙的系统中可能成为性能负担,带来系统问题。
Linux上该参数的缺省值通常为32M。
查看当前shmmax
[root@localhost ~]# more /proc/sys/kernel/shmmax
1073741824
通过ipcs命令查看共享内存的分配,如果是默认的32M,可以看到Oracle分配了多个共享内存段以满足SGA设置的需要
[root@localhost ~]# ipcs -sa
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0xb865fd98 360449 oracle9 640 171966464 18
0x00000000 262146 oracle9 600 393216 2 dest
------ Semaphore Arrays --------
key semid owner perms nsems
0x6428328c 229376 oracle9 640 154
------ Message Queues --------
key msqid owner perms used-bytes messages
使用pmap我们可以看到每个共享内存段的地址空间
[root@localhost ~]# ps -ef |grep test9i
oracle9 3421 1 0 Jan05 ? 00:00:06 ora_pmon_test9i
oracle9 3423 1 0 Jan05 ? 00:00:03 ora_psp0_test9i
oracle9 3425 1 0 Jan05 ? 00:00:00 ora_mman_test9i
oracle9 3427 1 0 Jan05 ? 00:00:05 ora_dbw0_test9i
oracle9 3429 1 0 Jan05 ? 00:00:05 ora_lgwr_test9i
oracle9 3431 1 0 Jan05 ? 00:00:27 ora_ckpt_test9i
oracle9 3433 1 0 Jan05 ? 00:00:28 ora_smon_test9i
oracle9 3435 1 0 Jan05 ? 00:00:00 ora_reco_test9i
oracle9 3437 1 0 Jan05 ? 00:00:41 ora_cjq0_test9i
oracle9 3439 1 0 Jan05 ? 00:00:17 ora_mmon_test9i
oracle9 3441 1 0 Jan05 ? 00:00:11 ora_mmnl_test9i
oracle9 3443 1 0 Jan05 ? 00:00:00 ora_d000_test9i
oracle9 3445 1 0 Jan05 ? 00:00:00 ora_s000_test9i
oracle9 3449 1 0 Jan05 ? 00:00:00 ora_qmnc_test9i
oracle9 3461 1 0 Jan05 ? 00:00:00 ora_q000_test9i
oracle9 3463 1 0 Jan05 ? 00:00:00 ora_q001_test9i
oracle9 3872 1 0 Jan05 ? 00:00:06 oracletest9i (LOCAL=NO)
oracle9 7286 1 0 11:23 ? 00:00:00 ora_j000_test9i
root 7289 7214 0 11:23 pts/1 00:00:00 grep test9i
[root@localhost ~]# pmap 3427
3427: ora_dbw0_test9i
0017c000 72K r-x-- /libnsl-2.3.4.so
0018e000 8K rw--- /libnsl-2.3.4.so
00190000 8K rw--- [ anon ]
0099e000 84K r-x-- /ld-2.3.4.so
009b3000 4K r---- /ld-2.3.4.so
009b4000 4K rw--- /ld-2.3.4.so
00b07000 8K r-x-- /libdl-2.3.4.so
00b09000 8K rw--- /libdl-2.3.4.so
08048000 76968K r-x-- /oracle
0cb72000 324K rw--- /oracle
0cbc3000 512K rw--- [ anon ]
20000000 167936K rw-s- [ shmid=0x58001 ]
b6f56000 36K r-x-- /libnss_files-2.3.4.so
b6f5f000 8K rw--- /libnss_files-2.3.4.so
b6f75000 4K rw-s- /hc_test9i.dat
b6f76000 40K rw--- /zero
b6f80000 64K rw--- /zero
b6f90000 64K rw--- /zero
b6fa0000 64K rw--- /zero
b6fb0000 128K rw--- /zero
b6fd0000 64K rw--- /zero
b6fe0000 64K rw--- /zero
b6ff0000 24K rw--- /zero
b6ff6000 3048K rw--- [ anon ]
b72f0000 1160K r-x-- /libc-2.3.4.so
b7412000 4K r---- /libc-2.3.4.so
b7413000 12K rw--- /libc-2.3.4.so
b7416000 8K rw--- [ anon ]
b7418000 56K r-x-- /libpthread-0.10.so
b7426000 8K rw--- /libpthread-0.10.so
b7428000 268K rw--- [ anon ]
b746b000 132K r-x-- /libm-2.3.4.so
b748c000 8K rw--- /libm-2.3.4.so
b748e000 4K r-x-- /libaio.so.1.0.0
b748f000 4K rw--- /libaio.so.1.0.0
b74a5000 1904K r-x-- /libnnz10.so
b7681000 152K rw--- /libnnz10.so
b76a7000 8K rw--- [ anon ]
b76a9000 88K r-x-- /libdbcfg10.so
b76bf000 8K rw--- /libdbcfg10.so
b76c1000 32K r-x-- /libclsra10.so
b76c9000 4K rw--- /libclsra10.so
b76ca000 4K rw--- [ anon ]
b76cb000 7028K r-x-- /libjox10.so
b7da8000 260K rw--- /libjox10.so
b7de9000 4K rw--- [ anon ]
b7dea000 344K r-x-- /libocrutl10.so
b7e40000 16K rw--- /libocrutl10.so
b7e44000 4K rw--- [ anon ]
b7e45000 268K r-x-- /libocrb10.so
b7e88000 4K rw--- /libocrb10.so
b7e89000 436K r-x-- /libocr10.so
b7ef6000 4K rw--- /libocr10.so
b7ef7000 4K r-x-- /libskgxn2.so
b7ef8000 4K rw--- /libskgxn2.so
b7ef9000 880K r-x-- /libhasgen10.so
b7fd5000 20K rw--- /libhasgen10.so
b7fda000 16K rw--- [ anon ]
b7fde000 128K r-x-- /libskgxp10.so
b7ffe000 8K rw--- /libskgxp10.so
bfffb000 20K rwx-- [ stack ]
ffffe000 4K ----- [ anon ]
total 262860K
了避免多个共享内存段,我们可以修改shmmax内核参数,使SGA存在于一个共享内存段中。
修改 /etc/sysctl.conf
加一行
kernel.shmmax = 1073741824
reboot system ,then startup database
实际上,如果没有修改shmmax参数,Oracle在启动过程中就会报出以下错误:
Starting ORACLE instance (normal)
Thu Nov 17 09:27:29 2005
WARNING: EINVAL creating segment of size 0x0000000033400000
fix shm parameters in /etc/system or equivalent