一. SGA
SGA管理的变迁
9i前,静态分配,修改完参数,重启数据库才能生效
db_block_buffers db_block_size
...
9i: 动态分配,即不重启数据库,修改可生效
各SGA组件单独指定
sga_max_size
db_cache_size
...
10g: 动态分配,
部分组件统一指定,各大小依据工作负载自动调整
sga_max_size
sga_target
11g: SGA和PGA都纳入了自动内存管理
memory_target
1.SGA组成和任务
sga_max_size
sga_target
db_cache_size
java_pool_size
large_pool_size
shared_pool_size
streams_pool_size
log_buffer
db_keep_cache_size
db_recycle_cache_size
db_nk_cache_size
sga_max_size
(sga_max_size+pga_aggregate_target)
Automatic Shared Memory Management (ASMM),
自动共享内存管理,
是10g中新增的特性,主要用来管理SGA中的内存组件,
它针对如下内存组件发挥作用:
Buffer cache池
共享池
大型池:shared server ,parallel execution ,
backup processes for disk I/O buffers
Java池:Java memory manager
流池:Streams in a database transfers
有一个专门的后台进程MMAN,负责完成这项任务。
启用ASMM:
SGA_TARGET>0
STATISTICS_LEVEL=TYPICAL (or ALL)
MMAN进程必须根据工作负载情况,调节各内存组件的大小
ps -ef |grep LH
ora_mman_LH
SELECT name, value
FROM v$parameter
WHERE name in ('db_cache_size',
'large_pool_size', 'java_pool_size',
'shared_pool_size', 'streams_pool_size', 'sga_target',
'sga_max_size', 'statistics_level')
alter system set db_keep_cache_size=12M;
select * from dba_tables where
owner='SCOTT' and table_name='EMP'
alter table EMP storage (buffer_pool keep);
获得该版本的显式参数
select * from v$parameter
获得该版本的隐式参数
SELECT a.ksppinm NAME, b.ksppstvl "value", a.ksppdesc DESCRIPTION FROM x$ksppi a, x$ksppcv b WHERE a.indx=b.indx AND substr(a.ksppinm,1,1)='_' ORDER BY a.ksppinm
select
i.ksppinm
name,
i.ksppdesc
description,
cv.ksppstvl
"value",
cv.ksppstdf
isdefault,
decode(bitand(cv.ksppstvf,7),1,'MODIFIED',4,'SYSTEM_MOD','FALSE')
ismodified,
decode(bitand(cv.ksppstvf,2),2,'TRUE','FALSE')
isadjusted
from sys.x$ksppi
i, sys.x$ksppcv cv
where i.inst_id=userenv('Instance')
and
cv.inst_id=userenv('Instance')
and
i.indx=cv.indx
and
i.ksppinm
like
'%pool_size%'
内存组件的真正大小:
SELECT name, bytes FROM v$sgainfo;
show sga
固定区域 fixed area
包含几千个变量和一些小的数据结构,
如latch和地址指针等,不受用户控制
通过x$ksmfsv查询 Kernel Service
layer,
Memory management,
addresses of Fixed Sga Variables
x$ksmmem记录了整个SGA的地址映射关系.
通过查询
x$ksmfsv和x$ksmmem,可以找出
fixed area 中每个变量的位置.
select * from x$ksmfsv
a,x$ksmmem b
where a.ksmfsadr=b.addr
and a.ksmfsnam like 'sga%'
select * from x$ksmfsv
a,x$ksmmem b
where a.ksmfsadr=b.addr --3705个
10gR2 variable size
包括 shared_pool_size,
java_pool_size,
large_pool_size等
2.转储SGA信息
SGA使用的内存空间
$ ps -ef|grep dbw
oracle 18318 ora_dbw0_LH
$ more /proc/18318/maps
20000000-2de00000
rw-s 十六进制
alter session set events 'immediate trace name
heapdump level n';
level 1: PGA汇总信息
level 2: SGA汇总信息
level 1025: PGA详细信息
level 2050: SGA详细信息
转储db buffer cache cd /opt/oracle/admin/LH/udump
rm *.trc
sqlplus sys/oracle as sysdba
sql>alter session set events 'immediate trace
name buffers
level 10'; 2-3minutes
sql>quit
lh_ora_23755.trc 387M
vi lh_ora_23755.trc
(1)buffer cache
granule是9i引入的一个新概念,是连续内存分配的单位,
增加内存大小的步长单位
其大小取决于SGA的大小(SGA_MAX_SIZE):
9i:
如SGA<128MB,则granule=4MB
否则为16MB(32位windows为8MB)
10g:
如SGA<1GB,则granule=4MB
否则为16MB(32位windows为8MB)
一个粒度 granule的大小由隐含参数
_ksmg_granule_size决定 select
i.ksppinm
name,
i.ksppdesc
description,
cv.ksppstvl
"value",
cv.ksppstdf
isdefault,
decode(bitand(cv.ksppstvf,7),1,'MODIFIED',4,'SYSTEM_MOD','FALSE')
ismodified,
decode(bitand(cv.ksppstvf,2),2,'TRUE','FALSE')
isadjusted
from sys.x$ksppi
i, sys.x$ksppcv cv
where i.inst_id=userenv('Instance')
and
cv.inst_id=userenv('Instance')
and
i.indx=cv.indx
and
i.ksppinm
=
'_ksmg_granule_size' 各内存组件所使用的 granule大小可以通过查询
v$sga_dynamic_components获得
select t.component,t.granule_size
from v$sga_dynamic_components t
db_cache_size
db_keep_cache_size
db_recycle_cache_size
db_nk_cache_size 在buffer cache中,ORACLE通过几个链表进行内存管理
LRU
List
Dirty List
(也称Write List) 同时链接到ckptq和fileq