温馨提示×

Linux Oracle内存设置如何调整

小樊
42
2025-12-26 08:19:02
栏目: 云计算

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% 物理内存,再按负载特性在 OLTPDSS 之间分配: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_ADVICEV$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

0