Linux 上 Oracle 内存设置调整指南
一 内存管理模式与总体原则
- Oracle 在 Linux 上的内存分为两部分:SGA(System Global Area) 与 PGA(Program Global Area)。SGA 由多个后台进程共享,典型组件包含 Database Buffer Cache、Shared Pool、Large Pool、Java Pool、Streams Pool;PGA 是每个服务器进程私有的内存,主要承载排序、哈希、会话栈等。SGA 支持自动管理(ASMM,参数 SGA_TARGET),PGA 支持自动管理(参数 PGA_AGGREGATE_TARGET)。启用 ASMM 需将 STATISTICS_LEVEL 设为 TYPICAL/ALL,并将 SGA_TARGET 设为非零值;SGA 的硬上限由 SGA_MAX_SIZE 决定(不可动态修改)。若使用自动内存管理(AMM,参数 MEMORY_TARGET),则无需手工调 SGA 各组件。一般建议为操作系统预留约 20% 内存,SGA+PGA 合计占用约 40%–60% 物理内存,再按负载特性在 OLTP 与 DSS 之间分配:OLTP 倾向 SGA 较大(如≈80%)、PGA 较小(如≈20%),DSS/大查询可适当提高 PGA 占比(可至 ≈50%–70%)。
二 在 Oracle 内调整 SGA 与 PGA 的步骤
- 确认当前内存管理模式与参数
- 查看:show parameter target、show parameter sga、show parameter pga
- 场景 A:使用 ASMM(推荐,便于自动调优)
- 启用/调整 SGA_TARGET(动态):alter system set sga_target=16G scope=both;
- 必要时提高上限(需重启):alter system set sga_max_size=32G scope=spfile;
- 重启:shutdown immediate; startup
- 场景 B:使用 AMM(自动内存管理)
- 设置总内存:alter system set memory_target=24G scope=spfile;(可选)alter system set memory_max_target=24G scope=spfile;
- 重启后生效
- 场景 C:手动管理 SGA 组件(不启用 SGA_TARGET)
- 典型:alter system set db_cache_size=8G scope=both; alter system set shared_pool_size=2G scope=both;
- 注意:手动模式下 SGA_TARGET 必须为 0
- 调整 PGA(自动管理)
- 开启自动工作区:alter system set workarea_size_policy=AUTO scope=both;
- 设置总量:alter system set pga_aggregate_target=4G scope=both;(无需重启)
- 多实例/RAC
- 在所有实例上设置:alter system set sga_target=16G scope=spfile sid=‘*’;(同参同理于 pga/memory_target)
三 Linux 系统层面的关键配置
- 启用 HugePages(大页,建议 SGA≥8GB 时使用,且与 AMM 互斥)
- 关闭/重置 AMM:alter system set memory_target=0 scope=spfile; alter system set memory_max_target=0 scope=spfile;(重启)
- 计算并配置大页数(示例):nr_hugepages ≈ ceil(SGA_TOTAL / HugePage_Size)。如 SGA=16G、HugePage=2MB,nr_hugepages≈8192
- 生效:echo 8192 > /proc/sys/vm/nr_hugepages;或写入 /etc/sysctl.conf:vm.nr_hugepages=8192 并执行 sysctl -p
- 验证:grep Huge /proc/meminfo;Oracle 启动日志应显示 “HugePages usage count …”
- 共享内存与内核参数(/etc/sysctl.conf)
- 建议:kernel.shmmax ≈ 物理内存-1;kernel.shmall = ceil(总共享内存页需求);kernel.shmmni=4096
- 示例(64GB 内存):kernel.shmmax=68719476735;kernel.shmall=16777216(以 4KB 页计)
- 其他常用:fs.file-max、fs.aio-max-nr、kernel.sem、net.core.rmem_default/wmem_default、net.core.rmem_max/wmem_max、net.ipv4.ip_local_port_range
- 使配置生效:sysctl -p
- /dev/shm(仅在使用 AMM 时)
- AMM 使用 /dev/shm 作为内存后备存储,需确保其大小 ≥ memory_target(如:mount -o remount,size=32G /dev/shm)
- 资源限制(/etc/security/limits.conf 或 systemd 服务)
- oracle soft/hard memlock 适当增大(锁定 SGA 于物理内存,避免换页)
- 文件句柄与进程数:fs.file-max、nofile、nproc 等按需提升
四 容量规划与验证
- 容量与边界
- 确保:OS 预留(≈20%)+ SGA + PGA ≤ 物理内存;避免内存过度分配导致 swap 与性能劣化
- SGA 粒度(granule):SGA<1GB 时粒度 4MB,SGA≥1GB 时粒度 16MB;粒度在实例启动时固定,影响组件尺寸对齐
- 动态建议与监控
- SGA:查询 V$SGA_TARGET_ADVICE,依据命中率与建议调整 SGA_TARGET
- PGA:查询 V$PGA_TARGET_ADVICE 与 V$PGASTAT,关注 PGA 命中率、over allocation count 等指标,必要时上调 PGA_AGGREGATE_TARGET
- 常用查询:show parameter sga/pga;select * from v$sgastat; select * from v$pgastat; select * from v$version
五 常见问题与快速排查
- ORA-04031(共享内存不足)
- 可能原因:SGA 目标过大、未启用大页、系统共享内存参数过小、碎片
- 处理:适度降低 SGA_TARGET 或启用 HugePages;检查 kernel.shmall/shmmax;必要时增大物理内存
- ORA-04030(进程内存不足)
- 可能原因:PGA 目标过小、排序/哈希操作过多
- 处理:提高 PGA_AGGREGATE_TARGET;检查 V$PGASTAT 的 over allocation count 与命中率
- 修改未生效
- 检查参数作用域(scope=both/spfile);涉及上限(如 SGA_MAX_SIZE)需重启;RAC 需加 sid=‘*’
- 使用 AMM 但 /dev/shm 不足
- 扩大 /dev/shm 或改用 HugePages + ASMM