AMM vs ASMM:自动内存管理对比
AMM vs ASMM:自动内存管理对比
适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
Oracle 提供三种内存管理方式[1]:
| 方式 | 参数 | 范围 | 适用 |
|---|---|---|---|
| 手动管理 | 各组件独立 | SGA + PGA 分别 | 旧版兼容 |
| ASMM | SGA_TARGET | SGA 内自动 | OLTP 推荐 |
| AMM | MEMORY_TARGET | SGA + 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 对比
| 维度 | ASMM | AMM |
|---|---|---|
| 范围 | SGA | SGA + 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 通用建议
- 监控内存使用:定期检查
v$sgainfo、v$pgastat - 使用建议器:
v$sga_target_advice、v$pga_target_advice - 保留 OS 余量:Oracle 内存 ≤ OS 内存 70%
- 避免手工调子组件:让 ASMM/AMM 自适应
- 定期监控 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