Linux 上 Oracle 资源合理分配实操指南
一 内存分配 SGA 与 PGA
- 规划原则:在仅运行数据库的场景,建议将物理内存的约1/2~1/3分配给 SGA,其余留给 PGA 与 OS(含文件系统缓存、网络、监控等)。计算公式:SGA + PGA + OS < 物理内存。SGA 由 Database Buffer Cache、Shared Pool、Large Pool、Redo Log Buffer 等组成;PGA 为会话私有,承载排序、哈希、会话内存等。目标是提高缓冲命中、减少物理 I/O 与 PGA 溢出。
- 自动与手动管理:
- 启用自动内存管理(AMM):设置 MEMORY_TARGET/MEMORY_MAX_TARGET,由实例在 SGA/PGA 间动态调配(适合大多数环境)。
- 启用自动共享内存管理(ASMM):设置 SGA_TARGET(动态可调),并可为关键组件设定最小大小;常用组件如 DB_CACHE_SIZE、SHARED_POOL_SIZE、LARGE_POOL_SIZE、JAVA_POOL_SIZE 支持动态调整;LOG_BUFFER、STREAMS_POOL、DB_KEEP/RECYCLE_CACHE_SIZE 等需手动设置。
- 手动管理:分别设定 SGA_TARGET/SGA_MAX_SIZE 与 PGA_AGGREGATE_TARGET,适合对资源边界有严格控制的场景。
- 快速估算示例(仅作起点,需结合实际负载调优):
- 若物理内存为 32GB,预留 6GB 给 OS,实例可用 26GB:
- OLTP:SGA 约 16–20GB,PGA 约 3–5GB(PGA 约占总实例内存的20%)。
- DSS/分析型:SGA 约 10–14GB,PGA 约 10–12GB(PGA 可占总实例内存的**50%**左右,因排序/哈希工作量大)。
- 监控与校验要点:
- 缓冲命中率:1 − physical reads / (db block gets + consistent gets),OLTP 建议不低于95%,低于 90% 通常应增大 DB_CACHE_SIZE。
- 共享池命中:Library Cache 命中率 = (sum(pins) − sum(reloads)) / sum(pins),建议不低于90%;数据字典命中 = (sum(gets) − sum(getmisses) − usage − fixed) / sum(gets),建议不低于90%。
- PGA:通过 V$PGASTAT 观察 over allocation count(>0 表示 PGA 不足,应增大 PGA_AGGREGATE_TARGET)、cache hit percentage(越高越好)。
二 CPU 与并行度管理
- 使用 Oracle Resource Manager(资源管理器)在数据库侧对 CPU 进行“计划/组/消费者组”的配额与调度,避免 OS 仅按进程公平调度导致关键业务被“淹没”。常用方法:
- EMPHASIS:按优先级层级(1–8,1 最高)分配 CPU 百分比,未用份额可下发给下一层级,避免低优先级“饿死”。
- RATIO:按比率分配 CPU,适合简单比例场景。
- 可同时约束会话并发、并行度、UNDO、空闲时间、执行时间等,保障关键业务在高峰期获得稳定 CPU 份额。
- 并行度建议:OLTP 以低并行(如 DOP ≤ CPU 物理核心数 或更低)减少争用;DSS/分析型可按资源计划放开并行,结合 并行度上限 与 资源组配额 防止过度并行拖垮系统。
- 高 CPU 排查路径:
- 生成 AWR 报告定位 Top SQL 与热点对象,结合执行计划优化(索引、改写、统计信息、分区/分桶等)。
- 检查解析压力(硬解析过多)、锁与热点更新、统计信息缺失等常见根因,优先从 SQL 与访问路径优化入手。
三 存储 I O 与 Linux 系统参数
- 使用 HugePages(大页) 减少页表开销、提升大内存访问效率(尤其搭配 AMM/ASMM 的 SGA)。步骤要点:
- 计算所需大页数(考虑 SGA 大小、页大小与保留内存),在 /etc/sysctl.conf 设置 vm.nr_hugepages,执行 sysctl -p 生效;确保 memlock 限制足够;重启实例后通过 V$PGASTAT/V$SGAINFO 与系统监控核对大页使用情况。
- 选择合理 I/O 调度器:数据库工作负载优先 deadline/mq-deadline;避免 noop 在机械盘上造成抖动。
- 文件系统与挂载:优先 XFS/ext4,开启 noatime/nodiratime,控制 stripe/条带 与 RAID 写缓存策略(写回需电池/超级电容保护)。
- Linux 内核与资源基线(示例值,需结合业务与压测微调):
- 交换倾向:vm.swappiness=10(尽量减少换页,避免数据库抖动)。
- 脏页回写:vm.dirty_background_ratio=3、vm.dirty_ratio 适度(如 10–20),避免一次性大回写冲击 I/O。
- 共享内存/IPC(Oracle 安装校验常用):kernel.shmmax、kernel.shmall 按 SGA 规模配置;fs.file-max 提升文件句柄上限;修改可用 sysctl -w 临时生效,永久写入 /etc/sysctl.conf 并执行 sysctl -p。
- tuned 调优:RHEL/OEL 可使用 tuned-profiles-oracle 一键应用面向 Oracle 的 CPU、内存与 I/O 调度优化(实施前建议在测试环境验证)。
四 部署架构与容量规划
- 单机多实例 vs 集群:当单实例资源吃紧或存在明显峰谷差异时,考虑 Oracle RAC 将负载分布到多节点,按业务周期在节点间“弹性”分配资源,提升整体利用率与可用性。
- 容量与隔离:关键业务与报表/批处理使用 Resource Manager 计划 隔离;必要时通过 服务(Service)+ 实例亲和/反亲和 实现负载与故障域的隔离;对 I/O 密集型负载,结合 存储 QoS/分层 避免相互影响。
五 实施步骤与验收清单
- 基线采集:记录 CPU、内存、I/O、AWR/ASH、V$SYSSTAT/V$PGASTAT/V$SGAINFO 的基线指标与峰值特征。
- 内存规划:按“SGA 1/2~1/3 物理内存、SGA+PGA+OS 小于物理内存”的原则设定 MEMORY_TARGET/SGA_TARGET/PGA_AGGREGATE_TARGET,启用自动管理并保留关键组件最小值的“护栏”。
- HugePages:按 SGA 计算并配置 vm.nr_hugepages,设置 memlock,重启实例后核对大页命中与 SGA 绑定情况。
- CPU 计划:创建 Resource Manager 计划/消费者组/映射,为关键业务设定 EMPHASIS 层级或 RATIO,并限制并行度与会话并发。
- 系统与存储:设置 swappiness、dirty_ratio/background_ratio、I/O 调度器、挂载选项,完成存储条带与缓存策略优化。
- 压测与验收:在接近生产的数据量与并发下压测,核对缓冲命中率(≥95% OLTP)、共享池命中(≥90%)、PGA over allocation=0、AWR Top SQL 优化效果与 CPU 曲线稳定性;持续监控并滚动微调。