Linux下Oracle如何调优内存
导读:Linux下Oracle内存调优实操指南 一 内存架构与调优目标 明确内存边界:数据库可用内存应小于物理内存,需为操作系统、Page Cache、其他应用预留充足空间(经验上至少预留10%–20%)。Oracle内存由两部分构成: SG...
Linux下Oracle内存调优实操指南
一 内存架构与调优目标
- 明确内存边界:数据库可用内存应小于物理内存,需为操作系统、Page Cache、其他应用预留充足空间(经验上至少预留10%–20%)。Oracle内存由两部分构成:
- SGA(System Global Area):被所有进程共享,包含Database Buffer Cache、Shared Pool、Large Pool、Redo Log Buffer等。
- PGA(Program Global Area):每个服务器进程私有,包含会话状态、游标、排序区、哈希区等。
- 调优目标:让热点数据尽量留在Buffer Cache,减少物理I/O;让排序/哈希等算子尽量在内存中完成(避免multi-pass),提升响应时间与吞吐。
二 内存管理模式与关键参数
- 三种常用模式与取舍
- AMM(Automatic Memory Management):设置MEMORY_TARGET(动态可调)与MEMORY_MAX_TARGET(上限),Oracle自动在SGA与PGA间分配;简单但可能与HugePages不兼容,11g后可用。
- ASMM(Automatic Shared Memory Management):设置SGA_TARGET(动态)与PGA_AGGREGATE_TARGET(动态),SGA内部组件由Oracle自动分配;常用且稳定。
- 手动管理:分别设置DB_CACHE_SIZE、SHARED_POOL_SIZE、LARGE_POOL_SIZE、LOG_BUFFER等,精细但维护成本高。
- 关键参数与建议
- 启用自动PGA管理:设置PGA_AGGREGATE_TARGET(如1G–8G起步,视负载调整),并确认WORKAREA_SIZE_POLICY=AUTO;Oracle默认按SGA的约20%作为PGA工作区起点(最小10MB)。
- 工作区目标:尽量让大多数工作区运行在Optimal,> 90%(OLTP可追求≈100%),One-pass < 10%,Multi-pass 避免。
- 使用V$PGASTAT、V$PGA_TARGET_ADVICE、V$SGA_TARGET_ADVICE、V$SGA_RESIZE_OPS等视图评估与诊断;在OEM中使用Memory Advisor进行可视化调优与容量建议。
三 Linux系统层面的优化
- 启用HugePages(大页):减少页表开销、提升TLB命中率,对大SGA尤为明显。
- 计算HugePages数量(示例):HugePages ≈ SGA_MAX_SIZE / HugePage大小(常见HugePage为2MB或1GB)。
- 配置步骤:在**/etc/sysctl.conf中设置vm.nr_hugepages=N**,执行sysctl -p;在**/etc/security/limits.conf为Oracle用户设置memlock软硬限制≥SGA大小;重启实例后通过/proc/meminfo与v$sgastat**校验。
- 共享内存与内核参数(若使用SHM而非HugePages)
- 建议kernel.shmmax ≥ SGA_MAX_SIZE,让SGA尽量位于单个共享内存段,减少段数量带来的管理开销。
- 合理设置kernel.shmall(系统共享内存总页数)、kernel.shmmni(段数量上限)、fs.file-max(文件句柄上限)等,避免共享内存分配失败或资源受限。
- 其他系统项
- 选择XFS/ext4等合适文件系统,合理挂载选项;确保**透明大页(THP)**策略与数据库工作负载匹配(通常建议关闭或设置为madvise)。
四 调优步骤与常用SQL
- 基线采集与诊断
- 采集AWR/ADDM报告定位瓶颈(SQL、I/O、内存命中率等);在OEM中使用Memory Advisor获取SGA/PGA容量建议与历史趋势。
- 设置内存管理模式与容量
- 启用ASMM(示例):
- 查看与调整:SHOW PARAMETER sga_target; 、SHOW PARAMETER pga_aggregate_target;
- 动态设置:ALTER SYSTEM SET sga_target=4G SCOPE=BOTH; 、ALTER SYSTEM SET pga_aggregate_target=1G SCOPE=BOTH;
- 启用AMM(示例,需重启):
- ALTER SYSTEM SET memory_target=8G SCOPE=SPFILE;
- ALTER SYSTEM SET memory_max_target=8G SCOPE=SPFILE;
- 若需完全交由AMM管理,可将SGA_TARGET与PGA_AGGREGATE_TARGET设为0。
- 启用ASMM(示例):
- 监控与验证
- PGA:
- SELECT name, value FROM v$pgastat WHERE name=‘aggregate PGA target parameter’;
- SELECT * FROM v$pga_target_advice ORDER BY pga_target_factor;
- SGA:
- SELECT * FROM v$sga_target_advice ORDER BY sga_size_factor;
- SELECT component, current_size, target_size FROM v$sga_dynamic_components;
- 观察命中率与溢出:确保PGA工作区以Optimal为主,减少One-pass/Multi-pass;SGA命中率(如Buffer Cache命中)趋稳并符合业务目标。
- PGA:
五 典型场景与注意事项
- OLTP高并发短事务
- 以高Buffer Cache命中率与低PGA溢出为目标;PGA以Optimal为主,适度提高SGA_TARGET;必要时启用HugePages降低系统开销。
- DSS/报表与大量排序/哈希
- 适度提高PGA_AGGREGATE_TARGET,关注V$PGA_TARGET_ADVICE与V$PGASTAT中的溢出指标;避免Multi-pass导致响应时间急剧上升。
- 使用共享服务器模式
- UGA位于SGA的Large Pool中,需确保Large Pool配置合理,避免UGA竞争影响会话稳定性。
- 常见错误与快速排查
- ORA-27123 unable to attach to shared memory segment:多为SHMMAX过小或HugePages配置不当;增大SHMMAX或正确配置HugePages后重启实例。
- 修改SGA_MAX_SIZE通常需要重启实例;在ASMM下调整Total SGA Size可通过OEM Memory Advisor在线完成,但上限受SGA_MAX_SIZE约束。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Linux下Oracle如何调优内存
本文地址: https://pptw.com/jishu/749046.html
