ITPub博客

首页 > 数据库 > Oracle > Oracle 12c 新参数 PGA_AGGREGATE_LIMIT 限制 PGA 内存总大小

Oracle 12c 新参数 PGA_AGGREGATE_LIMIT 限制 PGA 内存总大小

原创 Oracle 作者:lhrbest 时间:2018-11-14 15:40:31 0 删除 编辑

Oracle 12c 新参数 PGA_AGGREGATE_LIMIT 限制 PGA 内存总大小


在自动 PGA 内存管理模式下, Oracle DB 尝试通过动态控制分配给工作区的 PGA 内存量遵从 PGA_AGGREGATE_TARGET 中指定的值。但是,有时候 PGA 内存使用量可能会因为以下原因超过 PGA_AGGREGATE_TARGET 指定的值:

•PGA_AGGREGATE_TARGET 是一个目标,而不是一个限制。

•PGA_AGGREGATE_TARGET 仅控制可优化内存的分配。

过多的 PGA 使用量可能会导致高交换率。如果出现 PGA 的使用量大大超过 PGA_AGGREGATE_TARGET 参数的值,就可能产生 SWAP ,从而影响整个系统的性能,更进一步导致 DB hang 住。因此在 Oracle 12c 中引入了新的参数 PGA_AGGREGATE_LIMIT ,其可以限制整体 PGA 使用量。 PGA_AGGREGATE_LIMIT 限制的是实例消耗的 PGA 的总量。是一个硬性限制。 PGA_AGGREGATE_LIMIT 参数是动态参数;修改该参数不需要重新实例。设置 PGA_AGGREGATE_LIMIT 的值时也不需要关心是否使用了自动内存管理。

如果发生 PGA 超量使用的 情况,请考虑使用 PGA_AGGREGATE_LIMIT 初始化参数限制整体的 PGA 使用量。 PGA_AGGREGATE_LIMIT 允许您针对 PGA 内存使用量指定硬限制。如果超过了 PGA_AGGREGATE_LIMIT 值,则 Oracle DB 将中止或终止使用最多不可优化 PGA 内存的会话或进程。行查询会被视为一个单元。

默认情况下, PGA_AGGREGATE_LIMIT 设置为 2GB PGA_AGGREGATE_TARGET 值的两倍,或者 3 MB PROCESSES 参数值的乘积中较大的一个。但是,它不会超过物理内存大小减去 SGA 总大小的 120% 。默认值写入预警日志。如果无法确定系统物理内存的量,则警告消息将写入预警日志。

SYS 和后台会话可以不受限制的影响,但是作业队列进程不可以。

 

Oracle 12c R1 之前,没有选项可以用来限制和控制 PGA 的大小。虽然你设置某个大小为 PGA_AGGREGATE_TARGET 的初始参数, Oracle 会根据工作负载和需求来动态地增大或减小 PGA 的大小。而在 12c 中,你可以通过开启自动 PGA 管理来对 PGA 设定硬性限制,这需要对 PGA_AGGREGATE_LIMIT 参数进行设置。因此,你现在可以通过设置新的参数来对 PGA 设定硬性限制以避免过度使用 PGA

SQL> ALTER SYSTEM SET PGA_AGGREGATE_LIMIT=2G;  

SQL> ALTER SYSTEM SET PGA_AGGREGATE_LIMIT=0; --disables the hard limit

Ø 重要提示

当超过了当前 PGA 的限制, Oracle 会自动终止 / 中止会话或进程以保持合适的 PGA 内存。

 




1 PGA_AGGREGATE_TARGET 参数

首先看下一下官网对PGA的描述:

The Program Global Area (PGA) is a private memory region that contains the data and control information for a server process. Only a server process can access the PGA. Oracle Database reads and writes information in the PGA on behalf of the server process. An example of such information is the run-time area of a cursor. Each time a cursor is executed, a new run-time area is created for that cursor in the PGA memory region of the server process executing that cursor.
Note:
Part of the run-time area can be located in the Shared Global Area (SGA) when using shared servers.
For complex queries (such as decision support queries), a big portion of the run-time area is dedicated to work areas allocated by memory intensive operators, including:
1)	Sort-based operators, such as ORDER BY, GROUP BY, ROLLUP, and window functions
2)	Hash-join
3)	Bitmap merge
4)	Bitmap create
5)	Write buffers used by bulk load operations
A sort operator uses a work area (the sort area) to perform the in-memory sorting of a set of rows. Similarly, a hash-join operator uses a work area (the hash area) to build a hash table from its left input.


在Oracle 10g和11g版本中,在AMM的管理下,可以通过配置PGA_AGGREGATE_TARGET参数来限制PGA的大小。 在自动化 PGA 内存管理模式下,Oracle 数据库通过动态控制分配工作区的 PGA 内存数量来尝试遵从PGA_AGGREGATE_TARGET值。

但有时因为某些原因,PGA 的使用量可能会超过 PGA_AGGREGATE_TARGET设置。

比如这个案例:

一次AIX系统swap使用过高的故障解决过程

http://www.cndba.cn/cndba/arealman/article/381

因此PGA_AGGREGATE_TARGET起到的是目标的作用,而非限制。PGA_AGGREGATE_TARGET仅控制可优化部分内存的分配。

如果出现PGA的使用量大大超过PGA_AGGREGATE_TARGET参数的值,就可能产生SWAP,从而影响整个系统的性能,更进一步导致DB hang 住。 

因此在Oracle 12c中引入了新的参数PGA_AGGREGATE_LIMIT ,其可以限制整体PGA使用量。

PGA_AGGREGATE_TARGET

http://docs.oracle.com/database/122/REFRN/PGA_AGGREGATE_TARGET.htm#REFRN10165

PGA_AGGREGATE_LIMIT

http://docs.oracle.com/database/122/REFRN/PGA_AGGREGATE_LIMIT.htm#REFRN10328

2 PGA_AGGREGATE_LIMIT参数

PGA_AGGREGATE_LIMIT限制的是实例消耗的 PGA的总量。是一个硬性限制。

PGA_AGGREGATE_LIMIT 参数是动态参数;修改该参数不需要重新实例。设置 PGA_AGGREGATE_LIMIT 的值时也不需要关心是否使用了自动内存管理。

该参数的默认值配置规则如下:

1)  如果设置了MEMORY_TARGET参数 ,那么PGA_AGGREGATE_LIMIT等于MEMORY_MAX_TARGET的值。

2)  如果没有设置MEMORY_TARGET参数,那么PGA_AGGREGATE_LIMIT 参数值是PGA_AGGREGATE_TARGET的2倍。

3)  如果MEMORY_TARGET参数没有设置,但PGA_AGGREGATE_TARGET参数被设置为0. 那么PGA_AGGREGATE_LIMIT值=90%* 物理内存 - SGA内存。

在所有的情况下,PGA_AGGREGATE_LIMIT参数值至少为2G,或者 3MB * PROCESSES参数值

如果PGA的使用量超过了 PGA_AGGREGATE_LIMIT 值,那么Oracle 按照以下顺序,中断使用了最多的不可优化 PGA 内存的会话或进程:

1)  中断使用最多不可优化 PGA 内存的会话调用(Calls)。

2)  如果 PGA 内存使用量仍超过 PGA_AGGREGATE_LIMIT,则终止使用最多不可优化 PGA 内存的会话(sessions)和进程(processes)。

注意:

1)这2个是不同的,一个是call,另一个是session和process。

2)在决定终止会话和进程时,并行查询将作为一个单元进行处理。。

除了Job 队列进程外的SYS 进程和后台进程不会受到限制的影响。相反,如果它们使用了最多的不可优化内存,则会定期将其 PGA 使用信息的摘要写入到跟踪文件中。

后台进程CKPT每三秒检查一次内存用量是否超过了 PGA_AGGREGATE_LIMIT 初始化参数的值。如果达到或超过了限制,则此进程中断使用最多不可优化 PGA 内存的会话调用。如果这些会话仍没有释放足够内存,则终止它们。

如果达到了 PGA_AGGREGATE_LIMIT 值,则将报告如下错误。

ORA-04036: PGA memory used by the instance exceeds PGA_AGGREGATE_LIMIT
Cause: Private memory across the instance exceeded the limit specified in the PGA_AGGREGATE_LIMIT initialization parameter. The largest sessions using Program Global Area (PGA) memory were interrupted to get under the limit.
Action: Increase the PGA_AGGREGATE_LIMIT initialization parameter or reduce memory usage.

CKPT 跟踪日志中的信息:

PGA LIMIT: pid 317111 is ineligible for an ORA-4036 interrupt
System processes and most background processes cannot receive ORA-4036
interrupts. When they are contributing to the instance exceeding
PGA_AGGREGATE_LIMIT, they will periodically dump their PGA usage.
PGA LIMIT: pid 317124 is a top contributor to going over PGA_AGGREGATE_LIMIT
PGA LIMIT: pid 317124 is ineligible for an ORA-4036 interrupt
PGA LIMIT: pid 317120 is a top contributor to going over PGA_AGGREGATE_LIMIT
PGA LIMIT: pid 317120 is ineligible for an ORA-4036 interrupt

新特性往往伴随着bug,该参数也不例外:


 

其中Bug 25773856 : PGA_AGGREGATE_LIMIT EXCEEDED IN JAVAVM_MAIN LABELS 还是12.2.0.2 版本中的。 所以新版的还是要谨慎一点。

关于该参数的更多说明参考MOS文档:

Limiting process size with database parameter PGA_AGGREGATE_LIMIT (文档 ID 1520324.1)


3 示例修改

--在CDB中修改:
[oracle@dave.cndba.cn ~]$ sqlplus / as sysdba
SQL*Plus: Release 12.2.0.1.0 Production on Mon Apr 17 05:29:27 2017
Copyright (c) 1982, 2016, Oracle.  All rights reserved.
Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
SQL> show pdbs
    CON_ID CON_NAME			  OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
	 2 PDB$SEED			  READ ONLY  NO
	 3 DAVE 			  READ WRITE NO
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
SQL> show parameter pga
NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_limit		     big integer 2G
pga_aggregate_target		     big integer 0
SQL> alter system set pga_aggregate_limit=3g;
System altered.
SQL> show parameter pga
NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_limit		     big integer 3G
pga_aggregate_target		     big integer 0
SQL>   
--在PDB中修改:
[oracle@dave.cndba.cn admin]$ cat tnsnames.ora 
# tnsnames.ora Network Configuration File: /u01/app/oracle/product/12.2.0/dbhome_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
LISTENER_CNDBA =
  (ADDRESS = (PROTOCOL = TCP)(HOST = single)(PORT = 1521))
CNDBA =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = single)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = cndba)
    )
  )
dave =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = single)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = dave)
    )
  )
[oracle@dave.cndba.cn admin]$ sqlplus system/oracle@dave
SQL*Plus: Release 12.2.0.1.0 Production on Mon Apr 17 05:38:02 2017
Copyright (c) 1982, 2016, Oracle.  All rights reserved.
Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
SQL> show con_name
CON_NAME
------------------------------
DAVE
SQL>
SQL> show parameter pga
NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_limit		     big integer 3G
pga_aggregate_target		     big integer 0
SQL> alter system set pga_aggregate_limit=2g;
System altered.
SQL> show parameter pga
NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_limit		     big integer 2G
pga_aggregate_target		     big integer 0
SQL>
--此时查看CDB中的参数,还是3G:
SQL>  show parameter pga
NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_limit		     big integer 3G
pga_aggregate_target		     big integer 0
SQL>








来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26736162/viewspace-2219952/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
【QQ:646634621】【微信:db_bao】【微信公众号:DB宝】【11g、12c OCM】【QQ群:230161599、618766405】【《数据库笔试面试宝典》作者】【OCP、OCM、高可用(RAC+DG+OGG)、MySQL培训班已开讲,只讲实用内容】

注册时间:2012-09-23

  • 博文量
    1594
  • 访问量
    9243053