参考了很多文章,做个简单总结自用,第一篇
Oracle Memory Structure:
(System/Shared Global Area)SGA ; (Program/Process Global Area)PGA
SGA: Allocated at instance startup, and is a fundamental component of an Oracle Instance
PGA: Allocated when the server process or background process is created
SGA consists of several memory structures:
Shared pool (Library cache, Row cache)
Database buffer cache
Redo log buffer
Large pool
Java pool
(Stream,flashback...)
PGA is a memory region that contains data
and control information for a single server process or a single background process.
1. private SQL area 私有SQL区域(分为固定区域和Run-time运行时区域,共享服务器模式时私有SQL区是在SGA中)
2. Session Memory 会话空间(共享服务器模式时,会话空间是共享的)
3. SQL Work Area
|- Sort Area
|- Hash Join Area
|- Bitmap Merge Area 位图合并连接
\- Create Bitmap Area 创建位图
(复杂的SQL会用到SQL Work Area,SQL工作区对系统的性能影响很大)
内存管理:
9i引入自动PGA内存管理
10g 自动SGA内存管理 ASMM (Automatic Shared Memory Management)
11g 自动内存管理 AMM (Automatic Memory Management)
/* PGA */
PGA的管理模式与设置
1、PGA分两种管理模式:
手动PGA内存管理:用户指定排序区和散列区所使用的内存,每个连接使用相同的内存。
自动PGA内存管理:告诉Oracle可以使用的PGA的总量,由Oraclce根据系统负载决定具体分配。即PGA内存可以动态扩大和回收
9iR1时默认为手动PGA内存管理,9iR2以后默认为自动PGA内存管理。
2、设置(参数workarea_size_policy)
设为MANUAL,使用手动管理方式。
设为AUTO,并且pga_aggregate_target不为0时,启用自动内存管理。
值得注意的: 参数pga_aggregate_target决定的是 所有服务器进程分配的PGA总和,被称为PGA合计(Aggregated PGA)
Oracle管理的原则是分配每个会话的PGA=min{(pga_aggregate_target * 5%),_pga_max_size} (并行操作是30%)
如果SQL执行过程中,出现了PGA排序区不足,那么系统会进行硬盘排序,而不会从PGA再分配空间
/* SGA */
ASMM只能自动调整5个内存池的大小:shared pool、buffer cache、large pool、java pool和stream pool。
不再需要设置shared_pool_size、db_cache_size、large,java,streams_pool_size这五个初始化参数。
如果你依旧设了,那么这会被当成自动调整相关组件的最小限制(与自动管理PGA不同,PGA的*_area_size全部忽略)
而其他的内存池,比如log buffer、keep buffer cache等仍然需要DBA手工进行调整。
设置:
相关参数: SGA_TARGET,SGA_MAX_SIZE,statistics_level
sga_target不为0,来启动ASMM,该参数定义了整个SGA的总容量。
同时,初始化参数statistics_level必须设置为typical或all才能启动ASMM,
否则如果设置为basic,则关闭ASMM。
因为MMON将无法有效分析内存的使用的统计信息从而驱动ASMM的自动调优,实际上我们不能同时设置
sga_target为非零值和statistics_level为BASIC.(MMON -请求-> MMAN -修改-> SGA)
如果使用了server parameter file即spfile的话,ASMM会在实例shutdown之前将当前实际的内存组件大小
(Oracle认为这是最优的,但实际上可能不是)保存到spfile中,如果你使用strings查看,他们都是以双下划线开头的参数
[oracle@localhost ~]$ strings /opt/oracle/112/dbs/spfilemyorcl11.ora
myorcl11.__db_cache_size=171966464
myorcl11.__java_pool_size=4194304
myorcl11.__large_pool_size=4194304
myorcl11.__oracle_base='/opt/oracle'#ORACLE_BASE set from environment
myorcl11.__pga_aggregate_target=104857600
myorcl11.__sga_target=436207616
myorcl11.__shared_io_pool_size=0
myorcl11.__shared_pool_size=243269632
myorcl11.__streams_pool_size=4194304
/* AMM */
AMM自动内存管理使得,PGA和SGA内存之间可以互相转换,根据当前的工作负载来自动设定PGA和SGA的大小。
这种间接的内存转换依赖于操作系统的共享内存的释放机制来获得内部实例的调优.
MEMORY_TARGET--操作系统的角度上 Oracle 所能使用的最大内存值。动态参数
MEMORY_MAX_TARGET--MEMORY_TARGET所能设定的最大值。非动态可调。
设置:
相关参数: memory_target,memory_max_target,lock_sga
如果lock_sga = true ,则AMM是不可用的
设置memory_target不为0,则开启AMM
同样的,如果sga_target,或pga_aggregate_targe设置了非0值,作为动态调整的最小值
如果设置MEMORY_TARGET不当,可能会出现ORA-00845: MEMORY_TARGET not supported on this system
这个问题是MEMORY_TARGET的设置超出了操作系统/dev/shm大小导致的。
Oracle中的AMM特性使用了/dev/shm (...详见后面)
解决这个问题有3个方法,
1. 修改初始化参数,使得初始化参数中 MEMORY_TARGET 的设置小于/dev/shm的大小, --这其实不是个办法...
2. 调整/dev/shm的大小
3. you can configure ASMM instead of AMM, i.e. set SGA_TARGET, SGA_MAX_SIZE and PGA_AGGREGATE_TARGET instead of
MEMORY_TARGET.
调整/dev/shm的大小
1. 查看当前/dev/shm
[oracle@localhost ~]$ df -h
Filesystem Size Used Avail Use% Mounted on
tmpfs 504M 404M 100M 81% /dev/shm
2. 修改/etc/fstab
#tmpfs /dev/shm tmpfs defaults 0 0
tmpfs /dev/shm tmpfs defaults,size=640M 0 0
3. 重新挂载
$ umount /dev/shm
$ mount /dev/shm
$ df -h /dev/shm
Filesystem Size Used Avail Use% Mounted on
tmpfs 640M 416M 225M 65% /dev/shm
/* 配置原则 */
一般的,可以考虑分配80%的可用内存给Oracle实例
OLTP系统中,典型PGA内存设置应该是总内存的较小部分(例如20%),剩下80%分配给SGA。
OLTP: SGA_TARGET = (total_mem * 80%) * 80%
PGA_AGGREGATE_TARGET = (total_mem * 80%) * 20%
DSS系统中,由于会运行一些很大的查询,典型的PGA内存最多分配70%的内存。
OLAP,DSS: SGA_TARGET = (total_mem * 80%) * 50%
PGA_AGGREGATE_TARGET = (total_mem * 80%) * 50% ~70%
小原则:对于主机物理内存小于1G的,并且部署的数据库类型是专有服务器模式 Dedicated
通常Oracle的SGA内存分配不要超过总内存的一半,否则很有可能因为内存紧张导致Oracle运行过程中出现瓶颈
/* _target 和 _max_target*/
MEMORY_TARGET , MEMORY_MAX_TARGET
SGA_TARGET , SGA_MAX_TARGET
_target代表你要求的设定值,并且可随时修改不需重启实例,Oracle会自动调整它下面各组件的大小
_max_target代表的是一些硬件的限制,控制能接受动态调整_target的最大值
/* Dynamic Performance V$ Views */
AMM:
V$MEMORY_DYNAMIC_COMPONENTS:描述当前所有内存组件的状态
V$MEMORY_RESIZE_OPS:循环记录最后800次的SGA大小调整请求
X$KMGSTFR:循环记录最后800次的SGA的转换地址
_MEMORY_MANAGEMENT_TRACING=23:对于所有的内存转换调整行为均记录保存为跟踪文件
SGA:
v$sgastat
v$sgainfo
V$SGA
V$SGA_DYNAMIC_COMPONENTS
V$SGA_DYNAMIC_FREE_MEMORY
V$SGA_RESIZE_OPS
V$SGA_CURRENT_RESIZE_OPS
V$SGA_TARGET_ADVICE
PGA:
v$pgastat
v$pga_target_advice
V$PROCESS
v$sql_workarea
v$sql_workarea_active
/* tmpfs */
/dev/shm/是一个设备文件,它使用就是tmpfs文件系统
(注意:在Centos和Redhat下,/dev/shm目录是一个链接,指向/run/shm目录,在Ubuntu系统下tmpfs文件系统对应的是/run/shm目录,可以使用df命令查看)
在Redhat/CentOS等linux发行版中默认大小为物理内存的一半。
tmpfs是一种基于内存的文件系统,创建时不需要使用mkfs等初始化。
它的存储空间在VM里面,VM(virtual memory)是由RM(Real Memory)和swap组成
RM的大小就是物理内存的大小,
而Swap的大小是由你自己决定的。Swap是通过硬盘虚拟出来的内存空间,因此它的读写速度相对RM要慢许多
我们为什么需要Swap呢?当一个进程申请一定数量的内存时,如内核的vm子系统发现没有足够的RM时,
就会把RM里面的一些不常用的数据交换到Swap里面,如果需要重新使用这些数据再把它们从Swap交换到RM里面。
如果你有足够大的物理内存,根本不需要划分Swap分区。
tmpfs使用的存储空间VM,因此tmpfs最大的存储空间可达(The size of RM + The size of Swap).
但是对于tmpfs本身而言,它并不知道自己使用的空间是RM还是Swap,这一切都是由内核的vm子系统管理的。
默认情况下,tmpfs会mount到/dev/shm目录。使用tmpfs,就是说你可以使用这个目录,这个目录就是tmpfs,如你写临时文件到此目录,这些文件实际上是在VM中
为防止tmpfs使用了全部VM,有时候要限制其大小。
tmpfs优点:
1. 基于内存的,速度快. 应用场合:oracle AMM ; 做web缓存,对web访问有很好的加速作用
2. 动态文件系统大小 (应用:oracle AMM )
tmpfs最初会只有很小的空间,但随着文件的复制和创建,tmpfs文件系统驱动程序会分配更多的 VM,
并按照需求动态地增加文件系统的空间。
而且,当 /mnt/tmpfs 中的文件被删除时,tmpfs 文件系统驱动程序会动态地减小文件系统并释放 VM 资源,
这样做可以将 VM 返回到循环当中以供系统中其它部分按需要使用。
因为 VM 是宝贵的资源,所以您一定不希望任何东西浪费超出它实际所需的 VM,tmpfs 的好处之一就在于这些都是自动处理的。
缺点: 由于它的数据是在VM里面,因此断电或者你卸载它之后,数据就会立即丢失,这也许就是它叫tmpfs的原故
使用:
#mount -t tmpfs -o size=20m tmpfs /mnt/tmp
分配了上限为20m的VM到/mnt/tmp目录下
重启后仍生效:
/etc/fstab 添加
tmpfs /dev/shm tmpfs defaults,size=640M 0 0
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28859270/viewspace-776429/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/28859270/viewspace-776429/