Oracle内存管理(之五)
时间:2022-03-10 18:13
【深入解析--eygle】学习笔记
1.4. 2其他内存组件
Large Pool-大池是SGA的一个可选组件,通常用于共享服务器模式(MTS)、 并行计算或
RMAN的备份恢复等操作。
Java Pool-Java池主要用于JVM等Java选件。
Streams Pool-Streams pool是Oracle10g引入的概念,为Oracle的Streams功能所使用,如果不定义该参数,这部分内存将从Shread Pool中分配
对于SGA各部分内存分配,可以从数据库的视图中查询得到:
17:46:03 sys@felix SQL>select * from v$sga;
NAME VALUE
--------------------------------------------------
Fixed Size 2228944
Variable Size 335547696
Database Buffers 75497472
Redo Buffers 4272128
18:00:20 sys@felix SQL>
在Oracle9i中,Variable Size 包括shared_pool_size,java_pool_size和large_pool_size部分,SGA_MAX_SIZE去除db_cache_size部分也被归入可变部分,所以很多时候我们看到的可变部分内存要远高于可变内存组件大小;
Redo Buffers指日志缓冲区分配的内存大小,这个参数值通常比log_buffers参数设置略大;因为Log Buffer并非按照数据块大小分配,在内存中通常需要设置保护页对Log Buffer进行保护。
18:00:20 sys@felix SQL>select * from v$sgainfo;
NAME BYTESRESIZE
-------------------------------------------------- ------
Fixed SGA Size 2228944 No
Redo Buffers 4272128 No
Buffer Cache Size 75497472 Yes
Shared Pool Size 171966464 Yes
Large Pool Size 4194304 Yes
Java Pool Size 4194304 Yes
Streams Pool Size 8388608 Yes
Shared IO Pool Size 0 Yes
Granule Size 4194304 No
Maximum SGA Size 417546240 No
Startup overhead in Shared Pool 65418776 No
Free SGA Memory Available 146800640
12 rows selected.
18:06:23 sys@felix SQL>
当前SGA的分配和使用具体信息我们还可以通过V$SGASTAT视图查询得到:
select *
FROM(SELECT *
FROM v$sgastat
WHERE pool = ‘shared pool‘
ORDER BY BYTES DESC)
WHERE ROWNUM<= 5
18:06:23 sys@felix SQL>select *
18:08:05 2 FROM (SELECT *
18:08:05 3 FROM v$sgastat
18:08:05 4 WHERE pool = ‘sharedpool‘
18:08:05 5 ORDER BY BYTES DESC)
18:08:05 6 WHERE ROWNUM <= 5;
POOL NAME BYTES
---------------------------------------------------------------- ----------
shared pool free memory 30868336
shared pool SQLA 21540248
shared pool KGLH0 19496600
shared pool row cache 7593704
shared pool PLMCD 6275624
18:08:07 sys@felix SQL>
1.4.3 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 实际上都是一个进程中的线程),所以不存在共享内存的问题,无需进行特殊设置。
以64位Linux平台为例来看一下shmmax参数对于数据库的影响。
[root@felix kernel]# uname -a
Linux felix 2.6.39-200.24.1.el6uek.x86_64 #1 SMPSat Jun 23 02:39:07 EDT 2012 x86_64 x86_64 x86_64 GNU/Linux
[root@felix kernel]#
[root@felix kernel]# pwd
/proc/sys/kernel
[root@felix kernel]# ls shm*
shmall shmmax shmmni
[root@felix kernel]# cat shmmax
4398046511104
[root@felix kernel]#
需要提醒的是,虽然Oracle9i中,Oracle提供了动态内存修改的功能,但是仍然建议在系统规划时做好设置,尽量避免运行时的动态调整。动态调整某些系统参数(如undo_retention 等)在繁忙的系统中可能触发bug而造成系统挂起。
Oracle内存管理(之五),布布扣,bubuko.com