当前位置: 首页 > news >正文

智能内存管家:深度解析Oracle自动内存管理(AMM)机制与最佳实践

一、开篇:AMM是Oracle内存管理的进化


某DBA管理着30套测试数据库,每套数据库的内存需求随负载变化。<font color=#D32F2F>如果手动配置每套数据库的SGA和PGA,不仅工作量大,而且资源利用率低——有的数据库SGA空闲,有的却严重不足。</font>


<font color=#1976D2>Oracle 11g引入的AMM(Automatic Memory Management)解决了这个问题。通过一个参数MEMORY_TARGET,Oracle自动管理SGA和PGA的总大小,根据负载动态调整两者之间的分配,大大简化了内存管理。</font>


本篇文章从AMM的工作原理、与ASMM的区别、MMAN后台进程机制、内存抖动的诊断与解决,全面覆盖Oracle自动内存管理的知识体系。


二、AMM vs ASMM全景架构图


ASMM-自动共享内存管理

SGA_TARGET-手动设置

Shared Pool

Buffer Cache

Large Pool

Java Pool

PGA_AGGREGATE_TARGET-手动设置

Sort Area

Hash Area

AMM-自动内存管理

MEMORY_TARGET

SGA_TARGET-自动调整

PGA_AGGREGATE_TARGET-自动调整

Shared Pool

Buffer Cache

Large Pool

Java Pool


关键解读:

  • <font color=#D32F2F>红色(AMM):</font> MEMORY_TARGET统一管理SGA+PGA,两者自动调整。
  • <font color=#1976D2>蓝色(ASMM):</font> SGA_TARGET自动管理SGA内部,PGA手动设置。
  • <font color=#388E3C>绿色(PGA手动):</font> ASMM模式下PGA需要手动设置大小。


三、AMM的核心概念


1. <font color=#D32F2F>AMM的本质定义</font>


精确描述:

AMM(Automatic Memory Management)是Oracle 11g引入的内存管理机制,<font color=#1976D2>通过一个参数MEMORY_TARGET统一管理SGA和PGA的总大小,Oracle会根据负载动态在SGA和PGA之间分配内存。</font>


2. <font color=#1976D2>AMM的核心参数</font>


| 参数 | 含义 | 说明 |

|------|------|------|

| MEMORY_TARGET | SGA+PGA总目标大小 | 动态参数,可在线调整 |

| MEMORY_MAX_TARGET | SGA+PGA最大上限 | 静态参数,需重启生效 |

| SGA_TARGET | SGA目标大小 | AMM下通常设为0 |

| PGA_AGGREGATE_TARGET | PGA目标大小 | AMM下通常设为0 |


3. <font color=#F57C00>查看AMM配置状态</font>


-- 查看是否启用AMM SELECT name, value, isdefault FROM v$parameter WHERE name IN ('memory_target', 'memory_max_target', 'sga_target', 'pga_aggregate_target'); -- 判断逻辑: -- MEMORY_TARGET > 0 → AMM启用 -- MEMORY_TARGET = 0 且 SGA_TARGET > 0 → ASMM启用 -- MEMORY_TARGET = 0 且 SGA_TARGET = 0 → 手动管理


-- 查看AMM的内存分配历史 SELECT TO_CHAR(start_time, 'YYYY-MM-DD HH24:MI:SS') AS start_time, component, oper_type, initial_size/1024/1024 AS initial_mb, final_size/1024/1024 AS final_mb FROM v$memory_resize_ops ORDER BY start_time DESC FETCH FIRST 20 ROWS ONLY;


四、MMAN后台进程:AMM的“大脑”


1. <font color=#1976D2>MMAN的工作机制</font>


精确描述:

MMAN(Memory Manager)是AMM的核心后台进程。<font color=#D32F2F>它每隔一段时间会评估SGA和PGA的工作负载,根据需求预测来调整内存分配。</font>


PGA内存SGA内存MMAN进程PGA内存SGA内存MMAN进程反之亦然,SGA空闲则转移给PGA1.收集SGA各组件负载指标2.收集PGA内存使用率3.SGA需要更多内存4.PGA使用率<50%-有空闲5.从PGA转移内存给SGA6.调整PGA_AGGREGATE_TARGET


2. <font color=#F57C00>内存调整的粒度</font>


Granule(粒度单位):

AMM/ASMM以Granule为最小单位进行内存调整。<font color=#1976D2>Granule大小取决于SGA总大小。</font>


| SGA大小 | Granule大小 |

|---------|------------|

| SGA ≤ 1GB | 4MB |

| SGA > 1GB 且 ≤ 8GB | 16MB |

| SGA > 8GB 且 ≤ 64GB | 64MB |

| SGA > 64GB | 256MB |


-- 查看当前Granule大小 SELECT component, granule_size/1024/1024 AS granule_mb FROM v$sga_dynamic_components WHERE rownum = 1;


五、AMM的配置与调优


1. <font color=#1976D2>启用AMM</font>


-- 计算MEMORY_TARGET(SGA+PGA总和) -- 假设需要SGA=4G, PGA=2G ALTER SYSTEM SET MEMORY_TARGET = 6G SCOPE = SPFILE; ALTER SYSTEM SET MEMORY_MAX_TARGET = 6G SCOPE = SPFILE; -- 清空SGA和PGA参数(让AMM自动管理) ALTER SYSTEM RESET SGA_TARGET SCOPE = SPFILE; ALTER SYSTEM RESET PGA_AGGREGATE_TARGET SCOPE = SPFILE; -- 重启生效 SHUTDOWN IMMEDIATE; STARTUP;


2. <font color=#F57C00>设置组件下限</font>


-- 即使使用AMM,也可以设置SGA组件的下限 ALTER SYSTEM SET SHARED_POOL_SIZE = 1G SCOPE = BOTH; ALTER SYSTEM SET DB_CACHE_SIZE = 2G SCOPE = BOTH; -- 下限的作用:防止组件被压缩过小 -- 注意:下限设置过高会限制AMM的灵活性


3. <font color=#388E3C>监控AMM内存使用</font>


-- 查看AMM内存分配状态 SELECT component, current_size/1024/1024 AS current_mb, min_size/1024/1024 AS min_mb, max_size/1024/1024 AS max_mb, user_specified_size/1024/1024 AS specified_mb FROM v$memory_dynamic_components; -- 查看SGA和PGA的当前分配 SELECT (SELECT value/1024/1024 FROM v$parameter WHERE name = 'sga_target') AS sga_mb, (SELECT value/1024/1024 FROM v$parameter WHERE name = 'pga_aggregate_target') AS pga_mb FROM dual;


六、AMM vs ASMM:如何选择?


1. <font color=#D32F2F>核心区别对比</font>


| 对比维度 | <font color=#1976D2>ASMM</font> | <font color=#F57C00>AMM</font> |

|----------|-------------------------------|-------------------------------|

| 控制参数 | SGA_TARGET + PGA_AGGREGATE_TARGET | MEMORY_TARGET(一个参数) |

| 管理范围 | 仅SGA内部5个池 | SGA + PGA 统一管理 |

| SGA与PGA关系 | 各自固定,互不抢占 | <font color=#D32F2F>可以互相抢占内存</font> |

| PGA管理 | 手动设置PGA_AGGREGATE_TARGET | 自动调整 |

| Huge Pages | <font color=#388E3C>支持</font> | <font color=#D32F2F>不支持</font> |

| 生产环境推荐 | <font color=#388E3C>强烈推荐</font> | 测试/开发环境 |


2. <font color=#D32F2F>AMM与Huge Pages不兼容</font>


不兼容原因:

<font color=#D32F2F>AMM通过/dev/shm共享内存文件系统动态分配内存,而Huge Pages需要在启动时预先锁定大页内存。两者机制冲突。</font>


解决方案:

-- 使用Huge Pages时,禁用AMM,使用ASMM ALTER SYSTEM SET MEMORY_TARGET = 0 SCOPE = SPFILE; ALTER SYSTEM SET SGA_TARGET = 8G SCOPE = SPFILE; ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 2G SCOPE = SPFILE;


3. <font color=#1976D2>选择建议</font>


| 场景 | 推荐方案 | 原因 |

|------|----------|------|

| 生产OLTP系统 | <font color=#388E3C>ASMM + Huge Pages</font> | 性能稳定可控 |

| 测试/开发环境 | <font color=#F57C00>AMM</font> | 简化管理 |

| 内存 > 100GB | <font color=#388E3C>ASMM</font> | 避免AMM调整开销 |

| 需要Huge Pages | <font color=#388E3C>ASMM</font> | AMM不支持 |


七、内存抖动诊断与解决


1. <font color=#D32F2F>内存抖动的症状</font>


-- 查看SGA大小调整频率 SELECT component, COUNT(*) AS resize_count, MIN(start_time) AS first_resize, MAX(start_time) AS last_resize FROM v$sga_resize_ops WHERE start_time > SYSDATE - 1 GROUP BY component ORDER BY resize_count DESC;


<font color=#D32F2F>如果每小时调整超过60次,说明存在严重的内存抖动。</font>


2. <font color=#F57C00>内存抖动的原因</font>


  • SGA组件下限设置过高,限制了调整灵活性。
  • 物理内存不足,SGA+PGA总需求超过物理内存。
  • Buffer Cache和Shared Pool互相争抢。


3. <font color=#388E3C>解决方案</font>


-- 取消不必要的手动下限 ALTER SYSTEM RESET SHARED_POOL_SIZE; ALTER SYSTEM RESET DB_CACHE_SIZE; -- 设置合理的下限 ALTER SYSTEM SET SHARED_POOL_SIZE = 2G SCOPE = BOTH; ALTER SYSTEM SET DB_CACHE_SIZE = 4G SCOPE = BOTH; -- 如果抖动严重,考虑切换到ASMM ALTER SYSTEM SET MEMORY_TARGET = 0 SCOPE = SPFILE; ALTER SYSTEM SET SGA_TARGET = 8G SCOPE = SPFILE; ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 2G SCOPE = SPFILE;


八、总结:记住这个“财务总管”类比就够了


<font color=#1976D2>【AMM是家庭财务总管】</font>


  • MEMORY_TARGET:<font color=#D32F2F>家庭总预算(SGA+PGA总和)。</font>
  • SGA_TARGET:<font color=#1976D2>日常生活预算(Shared Pool + Buffer Cache等)。</font>
  • PGA_AGGREGATE_TARGET:<font color=#F57C00>个人零花钱(排序区、哈希区)。</font>
  • AMM:<font color=#D32F2F>总管根据实际情况,在日常生活预算和个人零花钱之间动态调整。</font>
  • ASMM:<font color=#1976D2>日常生活预算内部可以调整,但总预算固定。</font>
  • 内存抖动:<font color=#D32F2F>总管频繁调整预算分配,导致家庭成员不安。</font>


<font color=#1976D2>AMM简化了Oracle内存管理,但生产环境建议使用ASMM + Huge Pages以获得最佳性能和稳定性。无论使用哪种方式,定期监控内存使用情况和命中率,及时发现内存抖动问题,是DBA日常运维的基本功。</font>


你的生产环境使用AMM还是ASMM?是否遇到过内存抖动的问题?欢迎评论区分享你的经验。

http://www.cnnetsun.cn/news/3320452.html

相关文章:

  • NVM 与 fnm 深度对比:Node.js 版本管理器的 5 个关键指标实测
  • 如何快速部署Qwythos-9B推理模型:完整实践指南
  • 如何在Mac上实现完美歌词同步:LyricsX终极使用指南
  • IntelliJ IDEA 2023.1 + Gradle 8.7 配置 Android SDK 34:3步解决环境变量与路径冲突
  • ComfyUI云端部署完整教程:10分钟搭建专业AI绘画平台
  • 意义地球:让唯一的家园被看见,让存在的根脉被铭记——从“居住的星球”到“宇宙的孤本”,从麻木到觉醒的存在回归
  • GitHub Desktop 3.x 版本跨平台部署:Windows/macOS/Linux 3系统配置与5个常见问题排错
  • Kubernetes 故障注入:用 Chaos Mesh 模拟 GPU 节点宕机
  • 【独家首发】Midjourney 6.1新增--color-profile参数深度测评:ICC配置文件注入实录,色准提升47%(附可复用的sRGB/P3双模模板)
  • ChatGPT写心理咨询记录真能用?临床督导亲测:92%的初稿需重构,这5类伦理漏洞99%从业者忽略
  • EndNote X9 样式深度定制:3步实现中英文文献分区排序与5种常见样式适配
  • CCF-CSP 202212-2 训练计划:拓扑排序双图解法,15ms 100分代码详解
  • IntelliJ IDEA 2026.1 插件开发实战:3步构建首个Hello World插件并发布
  • Polars vs pandas 实战对比:新框架的语法能省多少代码
  • AIGC(生成式AI)试用 37 -- shell脚本(辅助生成)
  • NBTExplorer:3分钟掌握我的世界数据编辑,解锁游戏无限可能
  • Vue 3 + ECharts 5 数据大屏性能优化:100+图表渲染时间从 5s 降至 500ms
  • 终极实践指南:使用Evidently AI构建企业级ML/LLM数据质量监控系统
  • Visual C++ 6.0 与 2015-2022 运行库:2类安装场景与5个常见误区解析
  • FastAsyncWorldEdit 日志与回滚系统:如何监控和恢复玩家的编辑操作?
  • 面向对象方法 OOM 实战解析:从 5 大特征到 3 种复用设计模式
  • SAP IBP 2024 供应链规划实战:从业务顾问视角看 3 大核心场景配置
  • 7种测试用例设计方法实战:从QQ登录到公交卡充值的3个完整案例
  • Word 域代码全解析:F9与Ctrl+A的2种更新策略与5个应用场景
  • Word 2021/2024 多级列表与题注实战:3步解决‘表0-1’编号错误
  • 【AI Agent多智能体协作实战指南】:20年架构师亲授5大协同范式与3个避坑红线
  • 为什么92%的开发者部署DeepSeek失败?——本地运行DeepSeek的5个致命误区与3种稳定架构选型
  • 终极性能优化:NVIDIA gpt-oss-120b-Eagle3-v3的Eagle推测解码技术原理
  • 金属锈蚀、丝绸褶皱、液态玻璃…Midjourney质感生成失败?这5类材质必须规避的8个语义冲突陷阱,立即自查!
  • 为什么你总用不好ChatGPT?揭秘新手最常忽略的4层认知断层与即时生效的思维校准法