好文档 - 专业文书写作范文服务资料分享网站

05内存管理 

天下 分享 时间: 加入收藏 我要投稿 点赞

第1章 章名章名章名章名章名

FROM (SELECT *

FROM v$sgastat

WHERE pool = 'shared pool' ORDER BY BYTES DESC) WHERE ROWNUM <= 5

POOL NAME BYTES ----------- -------------------------- ---------- shared pool session param values 4293530440 shared pool free memory 67550256 shared pool miscellaneous 27355660 shared pool XDB Schema Cac 3889744 shared pool library cache 3709176 5 rows selected.

这里的session param values消耗达到了4G,当然这不可能是真正的内存消耗,Oracle的某个Bug导致了显示异常,这个Bug在Oracle 10.2中被修正。所以通常v$sgastat不能用来作为计算Shared Pool的依据。

5.1.2 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 process 实际上都是一个进程中的线程),所以不存在共享内存的问题,无需进行特殊设置。

以32位Linux平台为例来看一下shmmax参数对于数据库的影响。 Linux上该参数的缺省值通常为32M。

[root@neirong root]# more /proc/sys/kernel/shmmax 33554432

本例的操作系统版本为:

[root@neirong root]# cat /etc/redhat-release

Red Hat Enterprise Linux AS release 3 (Taroon Update 2) [root@neirong root]# uname -r 2.4.21-15.ELsmp

可以通过ipcs命令查看此设置下共享内存的分配,我们可以看到Oracle分配了多个共享内存段以满足SGA设置的需要:

·31·

书名书名书名书名书名书名书名书名书名书名书名书名书名书名

[root@neirong root]# ipcs -sa

------ Shared Memory Segments --------

key shmid owner perms bytes nattch status 0x00000000 884736 oracle 640 4194304 14 0x00000000 917505 oracle 640 33554432 14 0x00000000 950274 oracle 640 33554432 14 0x00000000 983043 oracle 640 33554432 14 0x00000000 1015812 oracle 640 33554432 14 0x00000000 1048581 oracle 640 33554432 14 0x00000000 1081350 oracle 640 33554432 14 0x00000000 1114119 oracle 640 33554432 14 0x00000000 1146888 oracle 640 33554432 14 0x00000000 1179657 oracle 640 33554432 14 0x00000000 1212426 oracle 640 33554432 14 0x00000000 1245195 oracle 640 33554432 14 0x00000000 1277964 oracle 640 33554432 14 0x00000000 1310733 oracle 640 33554432 14 0x00000000 1343502 oracle 640 33554432 14 0x00000000 1376271 oracle 640 33554432 14 0x00000000 1409040 oracle 640 33554432 14 0x00000000 1441809 oracle 640 33554432 14 0x00000000 1474578 oracle 640 33554432 14 0x00000000 1507347 oracle 640 33554432 14 0x00000000 1540116 oracle 640 33554432 14 0x00000000 1572885 oracle 640 33554432 14 0x00000000 1605654 oracle 640 33554432 14 0x00000000 1638423 oracle 640 33554432 14 0x00000000 1671192 oracle 640 33554432 14 0x00000000 1703961 oracle 640 33554432 14 0x7a9c9900 1736730 oracle 640 4194304 56

------ Semaphore Arrays --------

key semid owner perms nsems 0xfcf02e10 229376 oracle 640 154

------ Message Queues --------

key msqid owner perms used-bytes messages

通过以上输出看到为了创建Oracle的SGA,系统共分配了27个共享内存段。接下来针对

·32·

第1章 章名章名章名章名章名

一个后台进程,使用pmap工具查看一下每个共享内存段的地址空间:

[root@neirong root]# ps -ef|grep dbw

oracle 3102 1 0 09:27 ? 00:00:26 ora_dbw0_hsmkt root 7018 6923 0 15:48 pts/1 00:00:00 grep dbw

[root@neirong root]# pmap 3102 ora_dbw0_hsmkt[3102]

08048000 (37308 KB) r-xp (68:06 1525072) /opt/oracle/product/9.2.0/bin/oracle 0a4b7000 (8804 KB) rw-p (68:06 1525072) /opt/oracle/product/9.2.0/bin/oracle 0ad50000 (380 KB) rw-p (00:00 0)

50000000 (4096 KB) rw-s (00:04 884736) /SYSV00000000 51000000 (32768 KB) rw-s (00:04 917505) /SYSV00000000

注意:这里的884736、917505等就是ipcs里所看到的共享内存ID(shmid)。

53000000 (32768 KB) rw-s (00:04 950274) /SYSV00000000 55000000 (32768 KB) rw-s (00:04 983043) /SYSV00000000 57000000 (32768 KB) rw-s (00:04 1015812) /SYSV00000000 59000000 (32768 KB) rw-s (00:04 1048581) /SYSV00000000 5b000000 (32768 KB) rw-s (00:04 1081350) /SYSV00000000 5d000000 (32768 KB) rw-s (00:04 1114119) /SYSV00000000 5f000000 (32768 KB) rw-s (00:04 1146888) /SYSV00000000 61000000 (32768 KB) rw-s (00:04 1179657) /SYSV00000000 63000000 (32768 KB) rw-s (00:04 1212426) /SYSV00000000 65000000 (32768 KB) rw-s (00:04 1245195) /SYSV00000000 67000000 (32768 KB) rw-s (00:04 1277964) /SYSV00000000 69000000 (32768 KB) rw-s (00:04 1310733) /SYSV00000000 6b000000 (32768 KB) rw-s (00:04 1343502) /SYSV00000000 6d000000 (32768 KB) rw-s (00:04 1376271) /SYSV00000000 6f000000 (32768 KB) rw-s (00:04 1409040) /SYSV00000000 71000000 (32768 KB) rw-s (00:04 1441809) /SYSV00000000 73000000 (32768 KB) rw-s (00:04 1474578) /SYSV00000000 75000000 (32768 KB) rw-s (00:04 1507347) /SYSV00000000 77000000 (32768 KB) rw-s (00:04 1540116) /SYSV00000000 79000000 (32768 KB) rw-s (00:04 1572885) /SYSV00000000 7b000000 (32768 KB) rw-s (00:04 1605654) /SYSV00000000 7d000000 (32768 KB) rw-s (00:04 1638423) /SYSV00000000 7f000000 (32768 KB) rw-s (00:04 1671192) /SYSV00000000 81000000 (32768 KB) rw-s (00:04 1703961) /SYSV00000000 83000000 (4 KB) r--s (00:04 1736730) /SYSV7a9c9900 83001000 (644 KB) rw-s (00:04 1736730) /SYSV7a9c9900

33·

·书名书名书名书名书名书名书名书名书名书名书名书名书名书名

830a2000 (4 KB) r--s (00:04 1736730) /SYSV7a9c9900 830a3000 (3444 KB) rw-s (00:04 1736730) /SYSV7a9c9900 。。。。。。。。。。。。。。。。。。。

mapped: 881332 KB writable/private: 12056 KB shared: 827392 KB

为了避免多个共享内存段,可以修改shmmax内核参数,使SGA存在于一个共享内存段中。通过修改/proc/sys/kernel/shmmax参数可以达到此目的。

以下是一个生产环境中的设置:

[root@danaly root]# echo 1610612736 > /proc/sys/kernel/shmmax [root@danaly root]# more /proc/sys/kernel/shmmax 1610612736

这里修改为1.5G。对于shmmax文件的修改,系统重新启动后会复位。可以通过修改 /etc/sysctl.conf 文件使更改永久化。在该文件内添加以下一行,这个更改在系统重新启动后生效:

kernel.shmmax = 1610612736

修改shmmax之后,需要重起数据库使更改生效。

查看一下这个Oracle10g生产环境的共享内存分配情况,Oracle用户主要分配了两个共享内存段,这两个内存段分别为ASM实例和数据库实例所使用:

[root@danaly ~]# ipcs -sa

------ Shared Memory Segments --------

key shmid owner perms bytes nattch status 0x4fb9f94c 98304 oracle 640 85983232 12 0x6e9259ec 196609 oracle 640 945815552 30 ------ Semaphore Arrays --------

key semid owner perms nsems 0xb1ab1ddc 491520 oracle 640 44 0x975a71dc 884737 oracle 640 154 ------ Message Queues --------

key msqid owner perms used-bytes messages

可以找到两个实例的一个后台进程用于分析:

[root@danaly ~]# ps -ef|grep dbw

oracle 7091 1 0 Aug14 ? 00:00:01 asm_dbw0_+ASM oracle 8201 1 0 Aug14 ? 01:01:06 ora_dbw0_danaly root 17309 16630 0 16:19 pts/2 00:00:00 grep dbw

数据库实例DBWR的进程地址空间使用如下所示:

[root@danaly ~]# more /proc/8201/maps

0041c000-0042e000 r-xp 00000000 68:03 75361 /lib/libnsl-2.3.4.so 0042e000-00430000 rw-p 00011000 68:03 75361 /lib/libnsl-2.3.4.so ................

009c2000-009c4000 rw-p 009c2000 00:00 0 ·34·

第1章 章名章名章名章名章名

08048000-0cb72000 r-xp 00000000 68:06 968117 /opt/oracle/product/10.2.0/bin/oracle 0cb72000-0cbc3000 rw-p 04b2a000 68:06 968117 /opt/oracle/product/10.2.0/bin/oracle 0cbc3000-0cc53000 rw-p 0cbc3000 00:00 0

20000000-58600000 rw-s 00000000 00:06 196609 /SYSV6e9259ec (deleted) ......................

bfff8000-c0000000 rwxp bfff8000 00:00 0 ffffe000-fffff000 ---p 00000000 00:00 0

这里的196609正是ipcs中看到的一个共享内存段,也就是数据库实例所使用的共享内存。这段进程地址空间从20000000-58600000,大约是902M的空间,这正好是数据库的SGA使用的内存空间:

SQL> show sga

Total System Global Area 943718400 bytes Fixed Size 1222744 bytes Variable Size 109053864 bytes Database Buffers 826277888 bytes Redo Buffers 7163904 bytes SQL> select 943718400/1024/1024 from dual; 943718400/1024/1024 ------------------- 900

另外一块共享内存分配给了ASM实例:

[root@danaly ~]# more /proc/7091/maps|grep deleted

20000000-25200000 rw-s 00000000 00:06 98304 /SYSV4fb9f94c (deleted)

这段地址空间是82M,也正是ASM实例所使用的内存空间:

[oracle@danaly ~]$ export ORACLE_SID=+ASM [oracle@danaly ~]$ sqlplus \

SQL*Plus: Release 10.2.0.1.0 - Production on Mon Sep 17 16:33:29 2007 Copyright (c) 1982, 2005, Oracle. All rights reserved. SQL> show sga

Total System Global Area 83886080 bytes Fixed Size 1217836 bytes Variable Size 57502420 bytes ASM Cache 25165824 bytes SQL> select 83886080/1024/1024 from dual; 83886080/1024/1024 ------------------ 80

通常,如果没有修改shmmax参数,Oracle在启动过程中就会在告警日志文件中记录如下警告:

·35·

05内存管理 

第1章章名章名章名章名章名FROM(SELECT*FROMv$sgastatWHEREpool='sharedpool'ORDERBYBYTESDESC)WHEREROWNUM<=5POOLNAME
推荐度:
点击下载文档文档为doc格式
6ymt28v4r86x2111f20r4n7xz5ee5l00bif
领取福利

微信扫码领取福利

微信扫码分享