你知道Oracle数据库除了SGA和PGA,还有MGA么?
出品丨TeacherWhat
题图:Glass plate facade edge@Madrid, Spain by Joel Filipe from unsplash
关键字:19c、MGA、Managed Global Area、PGA、数据库入门、Database
正文约1500字,建议阅读时间3分钟
目录结构:
1. 什么是MGA?
2. 关于MGA的一些知识要点
3. 19c注意事项
4. 其他参考
什么是MGA?
我们知道SGA(System Global Area)一般由所有服务进程和后台进程共享的内存区域,而PGA(Program Global Area)是由每个服务进程、后台进程专有的的内存,每个进程都有一个PGA。
那什么是MGA呢?
MGA是Managed Global Area的缩写,主要用于在一组进程之间共享内存,简单而言,可以理解为介于SGA和PGA的一种中间状态。
关于MGA (Managed Global Area) 的更为准确的定义,可参考Mike Dietrich's Blog中对Doc ID 2638904.1的引用。
▲引用自Mike Dietrich's Blog
MGA让“少量集合”的进程(甚至是所有进程)在它们的生命周期(通常是一个查询)内共享地址空间。例如,在并行查询中,参与QC进程操作的PQ进程可以共享来自QC进程的名称空间以共享结果。
关于MGA的一些知识要点
以下是关于MGA的一些要点,供参考。
特性版本
从Oracle 12.2.0.1开始推出这个特性,但是仅在Exadata RAC环境中使用, 从Oracle 18c开始, Non-Exadata 的RAC环境也会使用这个特性。
相关应用
目前主要应用为RAC环境的IPC通信,和并行(PX)处理。
相关等待事件
新的latch: MGA用于控制和保护对这段内存的访问,因此Oralce新追加了如下等待事件用于诊断相关性能问题。
latch: MGA shared context root latch
latch: MGA shared context latch
latch: MGA heap latch
关于Latch的相关内容可参考【高级OWI之Latch(闩锁)】
关于MGA大小
由于PGA和MGA是不同的内存区域,因此会从常规页分配PGA,通过/dev/shm领域分配MGA。但是MGA同样会被统计到PGA的使用中去,所以可以通过v$pgastat确认MGA的大小。另外,PGA和MGA的合计大小也将受到PGA_AGGREGATE_LIMIT的限制。
例:
--查看/dev/shm
$ ls -alrh /dev/shm/MGA
-rw-r----- 1 oracle oinstall 256M Oct 4 00:02 /dev/shm/ora_ffffffffb06a0994_5cd96_1_KSIPC_MGA_NMSPC_1_0_0.dat--MGA的大小
SQL> set linesize 200
SQL> col VALUE format 99999999999
SQL> select * from v$pgastat where NAME like '%MGA%';
NAME VALUE UNIT CON_ID
----------------------------- ------------ ------------ ----------
MGA allocated (under PGA) 268435456 bytes 0
maximum MGA allocated 268435456 bytes 0
HugePage的使用
通过设置_use_large_pages_for_mga参数为True,可以让MGA使用HugePage。
例:
SQL> select a.ksppinm "PARAMETER",b.ksppstvl "VALUE",a.KSPPDESC "DESCRIPTION"
from xksppia,xksppi a, xksppia,xksppcv b
where a.indx = b.indx
and a.ksppinm like '%_use_large_pages_for_mga%';
PARAMETER VALUE DESCRIPTION
------------------------------ ---------- ------------------------------------------------------------
_use_large_pages_for_mga FALSE MGA largepage enabled
19c注意事项
在19c的版本上如果PGA_AGGREGATE_LIMIT 参数被设置成了0(pga_aggregate_limit=0)的话,可能会遭遇Bug 30851951 ,产生过多的KSIPC_MGA.dat文件,进而超过OS的file-max限制导致实例崩溃或者挂起。 这个问题在19.8版本上得到修正。
所以,在19c版本上,设置pga_aggregate_limit=0请留意。
其他参考
目前关于MGA的一些公开参考资料并不多,主要可以参考以下内容。
MOS Note:
MGA (Managed Global Area) Reference Note (Doc ID 2638904.1)
官方在线文档:
Grid Infrastructure Installation and Upgrade Guide for Oracle Solaris https://docs.oracle.com/en/database/oracle/oracle-database/19/cwsol/configuring-additional-shared-memory-identifiers-limit.html#GUID-A655E968-61F2-441B-97B3-61BE6A6487C1
Configuring Additional Shared Memory Identifiers Limit Starting with 18c, on Oracle Solaris systems, Oracle Database uses a new method of sharing memory among a group of processes, also known as Managed Global Areas (MGA). ★ The operating system memory allocation mechanism for this new method is Optimized Shared Memory (OSM).
Blog:
https://mikedietrichde.com/2020/08/20/mga-issue-and-it-is-fixed-with-oracle-19-8-0-and-newer/
MGA Issue – and it is fixed with Oracle 19.8.0 and newer
https://chinaraliyev.wordpress.com/2019/04/29/parallel-shared-hash-join/
Parallel Shared Hash Join This is a new method which is used to share memory between processes. In addition new stats names appeared in v$pgastat (MGA allocated (under PGA),maximum MGA allocated). Also, to protect the new shared memory region new latches and appropriate wait events (like latch: MGA.. ) have been introduced.
https://www.doag.org/formes/pubfiles/10893399/2018-DB-Anil_Nair-Oracle_RAC_Performance_Internals-Praesentation.pdf
New memory pool: MGA (Managed Global Area) –IPC buffers are allocated in the MGA (used to be the PGA before Exafusion) –MGA allows a set of processes to efficiently share an address space –MGA is not SGA or PGA, but something in-between
——End——
- 可能是地球上最好用的 Mac 词典工具
- 经典Java面试题收集
- alert日志中的一条ora警告信息的分析(59天)
- golang 详解defer
- 猫哥网络编程系列:HTTP PEM 万能调试法
- 分析函数牛刀小试 (59天)
- 猫哥网络编程系列:详解 BAT 面试题
- SpringMVC中@RequestBody引起的400异常处理,返回校验失败具体信息
- 关于primary key和unique index的奇怪问题 (58天)
- 在centos7上安装Jenkins
- Spring resource bundle多语言,单引号format异常
- String的内存模型,为什么String被设计成不可变的
- Ubuntu安装Java8和Java9
- session跟踪失效的问题和分析(57天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- python3用ARIMA模型进行时间序列预测
- R语言马尔可夫转换模型研究交通伤亡人数事故预测
- scrapy爬虫框架和selenium的使用:对优惠券推荐网站数据LDA文本挖掘
- 使用R语言进行Metroplis-in-Gibbs采样和MCMC运行分析
- R语言中的马尔科夫机制转换(Markov regime switching)模型
- R语言ARMA-EGARCH模型、集成预测算法对SPX实际波动率进行预测
- nginx快速入门
- R语言中进行期权定价的Heston模型
- 使用R语言随机波动模型SV处理时间序列中的随机波动率
- 20个ES6面试高频问题
- i++和++i傻傻分不清楚?这里给你最清楚的解答
- android APT 使用
- Flutter异步编程async与await的基本使用
- 教大家一个万能PPT图片排版技巧,太赞了!
- 重复读取 HttpServletRequest 中 InputStream 的方法