AMM vs ASMM:自动内存管理对比

AMM vs ASMM:自动内存管理对比

适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

Oracle 提供三种内存管理方式[1]:

方式参数范围适用
手动管理各组件独立SGA + PGA 分别旧版兼容
ASMMSGA_TARGETSGA 内自动OLTP 推荐
AMMMEMORY_TARGETSGA + PGA 统一通用

2. 手动管理

每个内存组件手动设置:

ALTER SYSTEM SET db_cache_size=4G SCOPE=BOTH;
ALTER SYSTEM SET shared_pool_size=2G SCOPE=BOTH;
ALTER SYSTEM SET pga_aggregate_target=2G SCOPE=BOTH;
ALTER SYSTEM SET large_pool_size=256M SCOPE=BOTH;
ALTER SYSTEM SET java_pool_size=128M SCOPE=BOTH;
ALTER SYSTEM SET streams_pool_size=256M SCOPE=BOTH;

缺点

  • 配置繁琐
  • 难以适应负载变化
  • 容易造成浪费或不足

3. ASMM(Automatic Shared Memory Management)

3.1 启用

-- 设置 SGA_TARGET
ALTER SYSTEM SET sga_target=8G SCOPE=BOTH;
ALTER SYSTEM SET sga_max_size=8G SCOPE=SPFILE;

-- 子组件设为 0(自动)
ALTER SYSTEM SET db_cache_size=0 SCOPE=BOTH;
ALTER SYSTEM SET shared_pool_size=0 SCOPE=BOTH;
ALTER SYSTEM SET large_pool_size=0 SCOPE=BOTH;
ALTER SYSTEM SET java_pool_size=0 SCOPE=BOTH;
ALTER SYSTEM SET streams_pool_size=0 SCOPE=BOTH;
ALTER SYSTEM SET pga_aggregate_target=2G SCOPE=BOTH;

3.2 工作机制

ASMM 通过 MMAN 后台进程动态调整:

  • 每 3 分钟评估一次
  • 根据负载调整 Buffer Cache、Shared Pool 等
  • 保留必要的最小值

3.3 ASMM 优势

  • 减少手动调优工作量
  • 自适应负载变化
  • 兼容 HugePages(Linux 性能优势)
  • 控制粒度细

3.4 ASMM 限制

  • 不管理 PGA
  • 需单独设置 pga_aggregate_target
  • Linux 下与 HugePages 兼容

4. AMM(Automatic Memory Management)

4.1 启用

-- 设置 MEMORY_TARGET
ALTER SYSTEM SET memory_target=12G SCOPE=SPFILE;
ALTER SYSTEM SET memory_max_target=16G SCOPE=SPFILE;

-- SGA_TARGET 和 PGA 设为 0(自动)
ALTER SYSTEM SET sga_target=0 SCOPE=SPFILE;
ALTER SYSTEM SET pga_aggregate_target=0 SCOPE=SPFILE;

-- 重启生效
SHUTDOWN IMMEDIATE;
STARTUP;

4.2 工作机制

AMM 通过 MMAN 进程:

  • 动态调整 SGA 与 PGA 之间的分配
  • 各 SGA 子组件自动管理
  • 利用 /dev/shm(Linux 共享内存文件系统)

4.3 AMM 优势

  • 完全自动化
  • SGA 与 PGA 灵活切换
  • 配置简单

4.4 AMM 劣势

  • 不兼容 HugePages(Linux)
  • 使用 /dev/shm 可能性能下降
  • 控制粒度粗
  • 容器化环境兼容性差

5. ASMM vs AMM 对比

维度ASMMAMM
范围SGASGA + PGA
HugePages✓ 兼容✗ 不兼容
Linux /dev/shm不需要需要
控制粒度
性能一般
配置难度
推荐场景OLTP、生产通用、小规模

6. Linux 与 HugePages

6.1 为什么需要 HugePages

Linux 默认页大小 4KB,大 SGA 会有大量页表(Page Table),TLB miss 增加。HugePages(2MB)可减少页表项:

8GB SGA,4KB 页:2,097,152 页表项
8GB SGA,2MB 页:4,096 页表项(减少 512 倍)

6.2 配置 HugePages

# 1. 计算 HugePages 数量
# 假设 SGA=8GB,HugePages=2MB
# 需要 4096 个 HugePages(预留 10% 余量)

# 2. /etc/sysctl.conf
vm.nr_hugepages = 4500

# 3. 应用配置
sysctl -p

****** 4. 验证
grep Huge /proc/meminfo

# 5. /etc/security/limits.conf
oracle soft memlock unlimited
oracle hard memlock unlimited

# 6. 重启数据库使用 HugePages

6.3 验证使用

-- 查看是否使用 HugePages
SELECT name, value 
FROM v$parameter 
WHERE name = 'use_large_pages';

-- use_large_pages = TRUE: 使用
-- use_large_pages = ONLY: 强制使用,不用启动失败
# OS 层验证
grep Huge /proc/meminfo

# 警报日志检查
grep "HugePages" $ORACLE_BASE/diag/rdbms/orcl/orcl/trace/alert_orcl.log

7. 内存管理建议器

-- SGA 建议器
SELECT 
  sga_size/1024/1024 AS sga_mb,
  estd_db_time,
  estd_physical_reads
FROM v$sga_target_advice;

-- PGA 建议器
SELECT 
  round(pga_target_for_estimate/1024/1024) AS pga_mb,
  estd_pga_cache_hit_percentage AS hit_pct,
  estd_overalloc_count
FROM v$pga_target_advice;

-- Memory 建议器(AMM 模式)
SELECT 
  memory_size/1024/1024 AS mem_mb,
  estd_db_time,
  estd_disk_reads
FROM v$memory_target_advice;

8. 常见坑与排错

8.1 AMM 不使用 HugePages

现象:启用 AMM 后,HugePages 利用率为 0。

原因:AMM 使用 /dev/shm,不兼容 HugePages。

修复:改用 ASMM + HugePages。

8.2 /dev/shm 空间不足

现象:启动 AMM 报 ORA-00845: MEMORY_TARGET not supported on this system

修复

# 增大 /dev/shm
# /etc/fstab
tmpfs /dev/shm tmpfs defaults,size=16G 0 0

# 重新挂载
mount -o remount /dev/shm

8.3 ASMM 调整失败

现象v$sga_dynamic_components 显示组件不变。

原因:某些子组件被手动设置。

修复

-- 所有 SGA 子组件设为 0
ALTER SYSTEM SET db_cache_size=0 SCOPE=BOTH;
ALTER SYSTEM SET shared_pool_size=0 SCOPE=BOTH;
-- ...

8.4 内存不足导致启动失败

现象ORA-27102: out of memory

排查

# 检查 OS 内存
free -m

# 检查 Oracle 内存参数
sqlplus / as sysdba
SHOW PARAMETER memory
SHOW PARAMETER sga

修复

  • 减小 MEMORY_TARGET / SGA_TARGET
  • 增加 OS swap
  • 关闭其他占用内存的进程

8.5 容器化环境 AMM 问题

现象:Docker 容器中 AMM 启动失败。

修复

  • 容器中优先使用 ASMM
  • 挂载足够大的 /dev/shm
  • 或使用 use_large_pages=FALSE

9. 最佳实践

9.1 Linux 生产推荐

ASMM + HugePages

ALTER SYSTEM SET sga_target=8G SCOPE=BOTH;
ALTER SYSTEM SET sga_max_size=8G SCOPE=SPFILE;
ALTER SYSTEM SET pga_aggregate_target=2G SCOPE=BOTH;
ALTER SYSTEM SET use_large_pages=ONLY SCOPE=SPFILE;
-- 所有 SGA 子组件 = 0

9.2 小型环境推荐

AMM

ALTER SYSTEM SET memory_target=12G SCOPE=SPFILE;
ALTER SYSTEM SET memory_max_target=16G SCOPE=SPFILE;
-- sga_target 和 pga_aggregate_target 设为 0

9.3 通用建议

  1. 监控内存使用:定期检查 v$sgainfov$pgastat
  2. 使用建议器v$sga_target_advicev$pga_target_advice
  3. 保留 OS 余量:Oracle 内存 ≤ OS 内存 70%
  4. 避免手工调子组件:让 ASMM/AMM 自适应
  5. 定期监控 swap:避免使用 swap

10. 参考资料

[1] Oracle Database Administrator’s Guide 19c, “Memory Management” https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/managing-memory.html

[2] Oracle Database Concepts 19c, “Memory Architecture” https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/memory-architecture.html

[3] Oracle Support Note 361649.1, “HugePages on Linux” https://support.oracle.com/epmos/faces/DocumentDisplay?id=361649.1