PDB资源管理之内存
- 介绍
在Oracle 12c的多租户环境中,PDB的SGA使用情况可能会很不均衡,有些PDB占用了大量的SGA内存,导致某些PDB得不到足够的SGA,进而影响性能。在Oracle 12.2的多租户环境中,可以控制和监控每个PDB的主机资源使用情况。要控制每个PDB的主机资源使用,以下两个条件需要满足:
1). CDBROOT中初始化参数MEMORY_TARGET没有设置或设置为0
- 管理PDB的SGA
1). SGA_TARGET参数控制PDB使用的最大SGA大小
在PDB中,SGA_TARGET必须要小于或等于CDB$ROOT中的SGA_TARGET
2). SGA_MIN_SIZE参数控制PDB最小SGA大小
SGA_MIN_SIZE参数的设置指导如下:
SGA_MIN_SIZE设置的值必须要小于CDB$ROOT中SGA_TARGET的值50%
SGA_MIN_SIZE设置的值必须要小于PDB中SGA_TARGET值的50%
所有PDB的SGA_MIN_SIZE值总和必须要小于CDB$ROOT中SGA_TARGET的值50%
注意:只有当CDB$ROOT中SGA_TARGET为非0值时,PDB中的SGA_TARGET和SGA_MIN_SIZE才生效。
alter session set container=pdbcndba;
ALTER SYSTEM SET SGA_TARGET = 1500M SCOPE = BOTH;
ALTER SYSTEM SET SGA_MIN_SIZE = 500M SCOPE = BOTH;
对于更细致的控制,可以设置PDB的DB_CACHE_SIZE和SHARED_POOL_SIZE。
- 管理PDB的PGA
在PDB级别上设置PGA_AGGREGATE_TARGET和PGA_AGGREGATE_LIMIT可以控制某个PDB的PGA使用情况。
PGA_AGGREGATE_TARGET是目标值,PGA_AGGREGATE_LIMIT是限制值。
如果PGA使用量达到PGA_AGGREGATE_LIMIT这个限制值,会话就会报错。
PGA_AGGREGATE_TARGET设置指导如下:
必须小于或等于CDB$ROOT的PGA_AGGREGATE_TARGET
必须小于或等于CDB$ROOT的PGA_AGGREGATE_LIMIT的50%
必须小于或等于PDB的PGA_AGGREGATE_LIMIT的50%
PGA_AGGREGATE_LIMIT设置PDB的最大PGA使用量,设置指导如下:
必须小于或等于CDB$ROOT的PGA_AGGREGATE_LIMIT
必须大于或等于PDB的PGA_AGGREGATE_TARGET × 2
在PDB上设置PGA参数如下:
alter session set container=pdbcndba;
ALTER SYSTEM SET PGA_AGGREGATE_LIMIT = 500M SCOPE = BOTH;
ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 100M SCOPE = BOTH;
- memory_target 跟 sga_target 的区别
memory_max_target/memory_target//sga_max_size/sga_target
1、memory_max_target 就是oracle实例的最大的内存大小
2、memory_target 就是oracle实例实际内存的大小,最大值不能超过memory_max_target
3、 sga_max_size 系统全局区 最大值
4、sga_target 系统全局区 实际值 不能超过 sga_max_size
5、pag_aggregate_target 进程全局区)
如果memory_target=0 表示数据库不启用自动内存管理,那么sga_target(系统全局区) 跟pag_aggregate_target(进程全局区)
各自管理,互不干扰
如果memory_target 大于0 表示数据库启用自动内存管理,相当于sga_target(系统全局区) 跟pag_aggregate_target(进程全局区)
各自管理,互不干扰
如果 sga_target=0 表示数据库不使用 自动共享内存管理 那么
db_buffer_cache_size,java_pool shared_pool,large_pool,stream_pool 都需要手动设置一个值
如果 sga_target大于0 表示数据库使用 自动共享内存管理 那么
db_buffer_cache_size,java_pool shared_pool,large_pool,stream_pool 不需要设置值,数据库会自动分配,内存使用率高
下面来讨论 一下 memory_target 跟sga_target 组合
memory_target=0 && sga_target=0 不是自动共享内存管理
那么 db_buffer_cache_size,java_pool shared_pool,large_pool,
stream_pool pag_aggregate_target 都需要手动设置一个值
memory_target=0 && sga_target>0 是自动共享内存管理 那么
db_buffer_cache_size,java_pool shared_pool,large_pool,stream_pool 可以设置也可以不设置
pag_aggregate_target必须要设置一个值
sga_target=db_buffer_cache_size+java_pool+shared_pool+stream_pool
memory_target>0 && sga_target>0 是自动内存管理 那么 sga_target 跟pag_aggregate_target 不需要设定值,
若设定了某个值,也表示 数据库启动的时候sga_target 跟pag_aggregate_target 最小不能低于设定的某个值
如 memory_target=1024 sga_target=800M 表示数据库最少要分配800M 给SGA
memory_target=sga_target+max(pag_aggregate_target,MAXIMUM PGA ALLOCATED)
当使用 dbca 创建默认创建实例的时候 如果系统内存小于4G 那么AMM 启用 大余4G AMM禁用 ASMM 启用,所以一般选择 高级安装
使用大表缓存 并行查询 在 RAC 或者单实例环境
DB_BIG_TABLE_CACHE_PERCENT_TARGET >0 &&PARALLEL_DEGREE_POLICY='AUTO' 或者PARALLEL_DEGREE_POLICY='ADAPTIVE'
使用大表缓存 窜行查询 只适用于单实例
DB_BIG_TABLE_CACHE_PERCENT_TARGET >0
监控 调优 内存管理, 就是说,内存管理设置那个值为最合理自动内存管理值建议
select * from v$memory_target_advice order by memory_size;
MEMORY_SIZE_FACTOR=1 表示当前数据库的内存, 通过ESTD_DB_TIME 来判断设置多大最合适
SGA 设置内存大小是按 颗粒度的整数倍 分配 查看数据库的颗粒度
select * from v$sgainfo
自动共享内存管理值建议
select * from v$sga_target_advice order by sga_size;
- 监控PDB的内存使用
以下两个视图用于监控PDB的资源使用
• V$RSRCPDBMETRIC
• V$RSRCPDBMETRIC_HISTORY
SQL> show parameter NONCDB_COMPATIBLE
NAME TYPE VALUE
------------------------------------ ----------- -------------------
noncdb_compatible boolean FALSE
SQL> show parameter MEMORY_TARGET;
NAME TYPE VALUE
------------------------------------ ----------- -------------------
memory_target big integer 1520M
SQL> alter system set MEMORY_TARGET=0 SCOPE = BOTH;
System altered.
SQL> show parameter MEMORY_TARGET;
NAME TYPE VALUE
------------------------------------ ----------- -------------------
memory_target big integer 0
SQL> alter session set container=pdbcndba;
Session altered.
SQL> ALTER SYSTEM SET SGA_TARGET = 500M SCOPE = BOTH;
System altered.
SQL> ALTER SYSTEM SET SGA_MIN_SIZE = 100M SCOPE = BOTH;
System altered.
SQL> ALTER SYSTEM SET PGA_AGGREGATE_LIMIT = 300M SCOPE = BOTH;
System altered.
SQL> ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 100M SCOPE = BOTH;
System altered.
SQL> COLUMN PDB_NAME FORMAT A10
SQL> SELECT r.CON_ID, p.PDB_NAME, r.SGA_BYTES, r.PGA_BYTES, r.BUFFER_CACHE_BYTES, r.SHARED_POOL_BYTES
FROM V$RSRCPDBMETRIC r, CDB_PDBS p WHERE r.CON_ID = p.CON_ID;
2
CON_ID PDB_NAME SGA_BYTES PGA_BYTES BUFFER_CACHE_BYTES SHARED_POOL_BYTES
---------- ---------- ---------- ---------- ------------------
3 PDBCNDBA29335384 5145798 1327759316057790
5 PDBCNDBA252131113 0 4190208010229033
SGA_BYTES – PDB当前SGA大小
BUFFER_CACHE_BYTES – PDB当前buffer cache大小
SHARED_POOL_BYTES – PDB当前shared pool大小
PGA_BYTES – PDB当前PGA大小
历史统计信息可以参考:DBA_HIST_RSRC_PDB_METRIC
- 控制PDB存储器的初始化参数
几个初始化参数可以控制PDB的内存使用情况。
当您使用PDB作为当前容器设置以下初始化参数时,这些参数将控制当前PDB的内存使用情况。当为PDB设置了一个或多个这些参数时,请确保CDB和其他PDB具有足够的内存用于其操作。
DB_CACHE_SIZE:
为PDB设置最小保证缓冲区缓存空间。
必须满足以下要求:
• 它必须小于或等于DB_CACHE_SIZECDB根目录设置的50%。
• DB_CACHE_SIZE所有PDB 的设置总和必须小于或等于DB_CACHE_SIZECDB根目录中设置的50%。
如果SGA_TARGET初始化参数在CDB根目录中设置为非零值,则这些要求不适用。
当SGA_TARGET初始化参数设置为非零,下列要求必须满足:
• DB_CACHE_SIZE的值加上SHARED_POOL_SIZE在PDB必须小于或等于该PDB的50%SGA_TARGET值。
• PDB中的DB_CACHE_SIZE加号值SHARED_POOL_SIZE必须小于或等于SGA_TARGETCDB级别值的50%。
• CDB中所有PDB 的DB_CACHE_SIZE加和总和SHARED_POOL_SIZE必须小于或等于SGA_TARGETCDB级别的50%。
SHARED_POOL_SIZE:
设置PDB的最小保证共享池空间。
必须满足以下要求:
•它必须小于或等于SHARED_POOL_SIZECDB根目录设置的50%。
•SHARED_POOL_SIZE所有PDB 的设置总和必须小于或等于SHARED_POOL_SIZECDB根目录中设置的50%。
如果SGA_TARGET初始化参数在CDB根目录中设置为非零值,则这些要求不适用。
当SGA_TARGET初始化参数设置为非零,下列要求必须满足:
•DB_CACHE_SIZE的值加上SHARED_POOL_SIZE在PDB必须小于或等于该PDB的50%SGA_TARGET值。
•PDB中的DB_CACHE_SIZE加号值SHARED_POOL_SIZE必须小于或等于SGA_TARGETCDB级别值的50%。
•CDB中所有PDB 的DB_CACHE_SIZE加和总和SHARED_POOL_SIZE必须小于或等于SGA_TARGETCDB级别的50%。
PGA_AGGREGATE_LIMIT:
设置PDB的最大PGA尺寸。
必须满足以下要求:
•它必须小于或等于PGA_AGGREGATE_LIMITCDB根目录中的设置。
•它必须大于或等于PGA_AGGREGATE_TARGETPDB中设置的两倍。
PGA_AGGREGATE_TARGET:
设置PDB的目标聚合PGA大小。
必须满足以下要求:
•它必须小于或等于PGA_AGGREGATE_TARGETCDB级别设定的值。
•它必须小于或等于PGA_AGGREGATE_LIMIT在CDB级设置的初始化参数值的50%。
•它必须小于或等于PGA_AGGREGATE_LIMITPDB中设置的值的50%。
SGA_MIN_SIZE:
设置PDB的最小SGA大小。
必须满足以下要求:
•它必须小于或等于SGA_TARGETCDB根目录设置的50%。
•它必须小于或等于SGA_TARGETPDB中设置的50%。
•SGA_MIN_SIZE所有PDB 的设置总和必须小于或等于SGA_TARGETCDB根目录中设置的50%。
如果SGA_TARGET初始化参数未设置或0在CDB根目录中设置为(零),则这些要求不适用。
最佳做法是将SGA_MIN_SIZE所有PDB 的值的总和限制为CDB的SGA大小的50%或更少。
SGA_TARGET:
设置PDB的最大SGA大小。
SGA_TARGET只有在SGA_TARGET初始化参数在CDB根目录中设置为非零值时,才会强制执行PDB中的设置。SGA_TARGETPDB中的设置必须小于或等于SGA_TARGETCDB根中的设置。