Linux Oracle内存优化技巧
导读:Linux 上 Oracle 内存优化实用指南 一 内存架构与容量规划 明确内存边界:SGA 为实例内共享内存,包含 Database Buffer Cache、Shared Pool、Redo Log Buffer、Large Pool...
Linux 上 Oracle 内存优化实用指南
一 内存架构与容量规划
- 明确内存边界:SGA 为实例内共享内存,包含 Database Buffer Cache、Shared Pool、Redo Log Buffer、Large Pool 等;PGA 为每个进程私有内存,包含 Session/UGA、Sort Area、Hash Area 等。专用服务器模式下 UGA 位于 PGA,共享服务器模式下 UGA 位于 Large Pool。优先保证系统预留 约 20% 物理内存 给 OS 与其他进程,避免内存争用与抖动。容量初配可按负载类型划分:
- OLTP:SGA 约占可用内存的 80%,PGA 约占 20%;
- DSS/OLAP:PGA 可提升至 50%–70%(视并发与排序/哈希工作负载而定)。上线后用 V$SGA_TARGET_ADVICE、V$PGA_TARGET_ADVICE 做二次校准。
二 Oracle 层内存参数配置
- 自动内存管理(AMM):启用 MEMORY_TARGET/MEMORY_MAX_TARGET 后,Oracle 自动在 SGA 与 PGA 间分配内存;注意 MEMORY_TARGET 不可超过 /dev/shm 大小,否则实例启动报 ORA-00845。若需使用 AMM,确保挂载的 tmpfs /dev/shm 足够大。
- 自动共享内存管理(ASMM):设置 SGA_TARGET(动态可调),Oracle 在 DB_CACHE_SIZE、SHARED_POOL_SIZE、LARGE_POOL_SIZE 等组件间自动调优;SGA_MAX_SIZE 为上限,修改需重启。
- 手动管理:显式设置各组件(如 DB_CACHE_SIZE、SHARED_POOL_SIZE),并将 SGA_TARGET=0。
- PGA 自动管理:设置 WORKAREA_SIZE_POLICY=AUTO 与 PGA_AGGREGATE_TARGET(动态可调),Oracle 自动为排序/哈希等操作分配工作区。
- 常用命令范式:
- 查看:
SHOW PARAMETER memory_target; sga_target; pga_aggregate_target; - AMM:
ALTER SYSTEM SET MEMORY_TARGET=24G SCOPE=BOTH;(确保 /dev/shm ≥ 24G) - ASMM:
ALTER SYSTEM SET SGA_TARGET=16G SCOPE=BOTH; - 手动组件:
ALTER SYSTEM SET DB_CACHE_SIZE=8G SCOPE=BOTH; - PGA:
ALTER SYSTEM SET WORKAREA_SIZE_POLICY=AUTO SCOPE=BOTH;ALTER SYSTEM SET PGA_AGGREGATE_TARGET=4G SCOPE=BOTH;
注:修改 SGA_MAX_SIZE 通常需SCOPE=SPFILE并重启;使用 AMM 时 SGA_TARGET/PGA_AGGREGATE_TARGET 之和不应大于 MEMORY_TARGET。
- 查看:
三 Linux 层关键优化
- 启用 HugePages:减少 TLB Miss 与页表开销,提升大 SGA 场景稳定性与性能。规划步骤:
- 若使用 AMM(MEMORY_TARGET),建议先关闭(将 MEMORY_TARGET/MEMORY_MAX_TARGET 置 0),改用 ASMM 或手动;
- 使用 Oracle 提供的 hugepages_settings.sh 脚本(MOS 401749.1)计算所需 HugePages;
- 在 /etc/sysctl.conf 设置
vm.nr_hugepages=< 计算值>,执行sysctl -p生效; - 重启数据库验证 HugePages 分配与使用。
- 合理设置 /dev/shm:AMM 依赖 tmpfs /dev/shm,需保证其容量 ≥ MEMORY_TARGET;必要时调整挂载选项(如
size=...)。 - 内核与资源参数:结合负载设置 fs.file-max、kernel.shmall、kernel.shmmax 等,避免共享内存与文件句柄瓶颈。
- 内存回收策略:适度降低 vm.swappiness,减少不必要的换页,优先保障数据库工作集常驻内存。
四 监控与诊断要点
- Oracle 动态视图:
- SGA:
V$SGASTAT观察各组件命中与分配;V$SGA_TARGET_ADVICE评估 SGA 目标值调整收益。 - PGA:
V$PGASTAT查看 aggregate PGA target parameter、aggregate PGA auto target、over allocation count、cache hit percentage 等关键指标;V$PGA_TARGET_ADVICE评估 PGA 目标值。 - 命中率参考:Buffer Cache 命中率建议不低于 90%;Library Cache 命中率建议不低于 90%;Redo Log Buffer 的 redo log space requests 应接近 0。
- SGA:
- 操作系统工具:
free -g、top、vmstat、sar观察可用内存、换页、系统负载;检查 /dev/shm 使用与 HugePages 分配。 - 周期性报告:利用 AWR/ADDM 定位内存相关瓶颈(如 shared pool 抖动、direct path read、PGA 过度分配等),并据此微调目标值。
五 常见陷阱与规避
- 过度分配导致换页或 OOM:SGA+PGA 过大、连接数高时,进程页表与 OS 内存压力激增;经验上建议将 SGA+PGA 控制在物理内存的约 50% 以内,并控制 PGA 不超过 SGA 的约 20%(视业务而定)。
- 启用 AMM 却未调整 /dev/shm:易出现 ORA-00845;需确保 /dev/shm ≥ MEMORY_TARGET。
- 使用 AMM 同时强依赖 HugePages:二者在部分版本/配置下存在兼容性与锁定策略差异,通常建议 HugePages 配合 ASMM/手动 使用。
- 仅增大 SGA 忽略 SQL 与访问路径:硬解析、缺失索引、全表扫描会抵消内存收益;应并行推进 SQL 优化、索引/分区、统计信息 等。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Linux Oracle内存优化技巧
本文地址: https://pptw.com/jishu/755794.html
