Linux系统层面shmmax定义的是单个共享内存段的最大值.如果该参数设置小于Oracle SGA设置,那么SGA仍然可以创建成功,
但是会被分配多个共享内存段.推荐调整shmmax设置,将SGA限制在一个共享内存段中。
流程:
[root@server1 ~]# more /proc/sys/kernel/shmmax
系统分配给Oracle的共享内存段:
[oracle@server1 ~]$ ipcs -sa
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 294915 oracle 640 4096 0
0x00000000 327684 oracle 640 4096 0
0x00000000 360453 oracle 640 4096 0
0x00000000 393222 oracle 640 4096 0
0x00000000 425991 oracle 640 4096 0
0x00000000 458760 oracle 640 4096 0
0x00000000 491529 oracle 640 4096 0
0x00000000 524298 oracle 640 4096 0
0x00000000 557067 oracle 640 4096 0
0x00000000 589836 oracle 640 4096 0
0x00000000 622605 oracle 640 4096 0
0x00000000 655374 oracle 640 4096 0
0x00000000 688143 oracle 640 4096 0
0x00000000 720912 oracle 640 4096 0
0x00000000 753681 oracle 640 4096 0
0x00000000 786450 oracle 640 4096 0
0x00000000 819219 oracle 640 4096 0
0x00000000 851988 oracle 640 4096 0
0x00000000 884757 oracle 640 4096 0
0x00000000 917526 oracle 640 4096 0
0x00000000 950295 oracle 640 4096 0
0x00000000 983064 oracle 640 4096 0
0x00000000 1015833 oracle 640 4096 0
0x00000000 1048602 oracle 640 4096 0
0x00000000 1081371 oracle 640 4096 0
0x00000000 1114140 oracle 640 4096 0
0xba1697c4 1146909 oracle 640 4096 0
------ Semaphore Arrays --------
key semid owner perms nsems
0x4d96aff0 360450 oracle 640 154
//共分配给Oracle 23个共享内存段
针对一个进程具体观察:
[oracle@server1 ~]$ ps -ef | grep smon
oracle 2684 1 0 23:51 ? 00:00:00 ora_smon_prod
[oracle@server1 ~]$ pmap 2684
2684: ora_smon_prod
0000000000400000 189264K r-x-- /oracle/app/product/11.2.0/db_1/bin/oracle
000000000bed4000 2020K rw--- /oracle/app/product/11.2.0/db_1/bin/oracle
000000000c0cd000 348K rw--- [ anon ]
000000000d00c000 268K rw--- [ anon ]
0000000060000000 4K r--s- /dev/shm/ora_prod_294915_0
0000000060001000 4092K rw-s- /dev/shm/ora_prod_294915_0
....
0000000073000000 4096K rw-s- /dev/shm/ora_prod_622605_1
0000000073400000 4096K rw-s- /dev/shm/ora_prod_622605_2
0000000073800000 4096K rw-s- /dev/shm/ora_prod_622605_3
0000000073c00000 4096K rw-s- /dev/shm/ora_prod_622605_4
0000000074000000 4096K rw-s- /dev/shm/ora_prod_622605_5
0000000074400000 4096K rw-s- /dev/shm/ora_prod_622605_6
....
0000000076400000 4096K rw-s- /dev/shm/ora_prod_655374_6
0000000076800000 4096K rw-s- /dev/shm/ora_prod_655374_7
....
000000007bc00000 4096K rw-s- /dev/shm/ora_prod_753681_4
000000007c000000 4096K rw-s- /dev/shm/ora_prod_753681_5
000000007c400000 4096K rw-s- /dev/shm/ora_prod_753681_6
000000007c800000 4096K rw-s- /dev/shm/ora_prod_753681_7
000000007cc00000 4096K rw-s- /dev/shm/ora_prod_786450_0
....
0000000082400000 4096K rw-s- /dev/shm/ora_prod_851988_6
0000000082800000 4096K rw-s- /dev/shm/ora_prod_851988_7
0000000082c00000 4096K rw-s- /dev/shm/ora_prod_884757_0
0000000083000000 4096K rw-s- /dev/shm/ora_prod_884757_1
0000000083400000 4096K rw-s- /dev/shm/ora_prod_884757_2
....
0000000089400000 4096K rw-s- /dev/shm/ora_prod_983064_2
0000000089800000 4096K rw-s- /dev/shm/ora_prod_983064_3
0000000089c00000 4096K rw-s- /dev/shm/ora_prod_983064_4
....
0000000090400000 4096K rw-s- /dev/shm/ora_prod_1081371_6
0000000090800000 4096K rw-s- /dev/shm/ora_prod_1081371_7
0000000090c00000 4096K rw-s- /dev/shm/ora_prod_1114140_0
0000000091000000 4096K rw-s- /dev/shm/ora_prod_1114140_1
0000000091400000 4096K rw-s- /dev/shm/ora_prod_1114140_2
0000000091800000 4096K rw-s- /dev/shm/ora_prod_1114140_3
0000000091c00000 4096K rw-s- /dev/shm/ora_prod_1146909_0
这里的/dev/shm/ora_prod_1146909_0中的1146909就是共享内存ID.
为了避免多个共享内存段,可以修改shmmax内核参数,使SGA存在于一个共享内存段中。
修改测试:
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
修改kernel.shmmax = 2147483648
[root@server1 ~]# more /proc/sys/kernel/shmmax
2147483648
SQL> startup;
ORACLE instance started.
Total System Global Area 830930944 bytes
Fixed Size 2257800 bytes
Variable Size 524291192 bytes
Database Buffers 297795584 bytes
Redo Buffers 6586368 bytes
Database mounted.
Database opened.
再次查询共享内存段分配情况:
[oracle@server1 ~]$ ipcs -sa
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 2162691 oracle 640 4096 0
0x00000000 2195460 oracle 640 4096 0
0xba1697c4 2228229 oracle 640 4096 0
------ Semaphore Arrays --------
key semid owner perms nsems
0x4d96aff0 622594 oracle 640 154
------ Message Queues --------
key msqid owner perms used-bytes messages
三个共享内存段.
[oracle@server1 ~]$ ps -ef | grep smon
oracle 2918 1 0 00:06 ? 00:00:00 ora_smon_prod
[oracle@server1 ~]$ pmap 2918
0000000060000000 4K r--s- /dev/shm/ora_prod_2162691_0
0000000060001000 4092K rw-s- /dev/shm/ora_prod_2162691_0
0000000060400000 4096K rw-s- /dev/shm/ora_prod_2162691_1
....
....
0000000091800000 4096K rw-s- /dev/shm/ora_prod_2195460_195
0000000091c00000 4096K rw-s- /dev/shm/ora_prod_2228229_0
说明:
在数据库异常关闭情况下,可能会出现后台进程未正常退出,共享内存未及时释放,对于这种情况,可以通过ipcs命令找到共享内存段的段ID,然后通过ipcrm命令可以强制释放共享内存段资源,之后数据库则可以正常启动。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。