centos oracle内存配置技巧
小樊
45
2025-12-31 03:47:26
CentOS 上 Oracle 内存配置技巧
一 内存总体规划
- 保留给操作系统的内存:建议预留约 20%的物理内存,避免数据库与其他系统服务争用导致抖动。数据库可用内存≈物理内存×0.8。
- 工作负载类型与分配比例:
- OLTP:SGA 约占数据库可用内存的80%,PGA 约占20%。
- DSS/OLAP:初始建议 SGA 与 PGA 各占50%,再根据实际负载用视图调优。
- 快速估算公式(以物理内存 total_mem 为例):
- OLTP:SGA_TARGET ≈ (total_mem × 0.8) × 0.8;PGA_AGGREGATE_TARGET ≈ (total_mem × 0.8) × 0.2
- DSS:SGA_TARGET ≈ (total_mem × 0.8) × 0.5;PGA_AGGREGATE_TARGET ≈ (total_mem × 0.8) × 0.5
- 上线后依据实际负载,使用 Oracle 的 V$SGA_TARGET_ADVICE 与 V$PGA_TARGET_ADVICE 视图进行二次校准。
二 操作系统层关键设置
- 共享内存参数(确保 SGA 能被单个共享内存段容纳,且系统共享内存总量充足):
- 获取页大小:getconf PAGE_SIZE(常见为4096 字节)。
- 计算页总数:shmall_pages = ceil(SGA_MAX / PAGE_SIZE)。
- 设置:
- kernel.shmmax ≈ 期望的 SGA_MAX(通常设为物理内存的**70%**或更高,但不超过物理内存-1 字节)
- kernel.shmall = 上面计算的 shmall_pages
- kernel.shmmni = 4096(通常足够)
- 资源与文件句柄:
- fs.file-max = 6815744
- fs.aio-max-nr = 1048576
- 大页 HugePages(推荐用于大 SGA,减少 TLB miss 与页表开销):
- /etc/security/limits.conf 为 oracle 用户设置 memlock(单位 KB),建议略大于目标 SGA:
- oracle soft memlock
- oracle hard memlock
- 计算 HugePages 数量:HugePages ≈ ceil(SGA / Hugepagesize),Hugepagesize 通常为2 MB(x86_64)。
- sysctl 设置:vm.nr_hugepages = 计算值;重启后检查 /proc/meminfo 的 HugePages_Total/Free。
- 使用 HugePages 时务必禁用 AMM(即 memory_target/memory_max_target),改用 ASMM(sga_target/pga_aggregate_target);否则 SGA 可能无法锁定到大页。
- 交换分区(Swap)容量建议:RAM 1–2 GB 时 Swap=1.5×RAM;2–16 GB 时 Swap=RAM;>16 GB 时 Swap=16 GB。
三 Oracle 层内存参数配置
- 启用自动内存管理策略:
- 工作区策略:ALTER SYSTEM SET workarea_size_policy=auto SCOPE=BOTH;
- PGA 目标:ALTER SYSTEM SET pga_aggregate_target=目标值 SCOPE=BOTH;
- SGA 目标:ALTER SYSTEM SET sga_target=目标值 SCOPE=BOTH;
- 若需固定上限:ALTER SYSTEM SET sga_max_size=目标值 SCOPE=SPFILE;(重启生效)
- 使用 AMM 与 HugePages 互斥:启用 HugePages 时必须关闭 AMM(删除或清零 memory_target/memory_max_target,改用 sga_target/pga_aggregate_target)。
- 动态修改与重启要点:
- sga_target 不得大于 sga_max_size;通常建议两者相等以避免启动失败。
- 修改 sga_max_size 需以 SCOPE=SPFILE 重启实例;pga_aggregate_target 与 workarea_size_policy 多数场景可在线生效。
- 上线后依据负载,查询 V$SGA_TARGET_ADVICE、V$PGA_TARGET_ADVICE 进行细调。
四 验证与常见错误
- 快速验证清单:
- OS 层:
- 共享内存:ipcs -m;检查 shmmax/shmall 是否足够。
- 大页:grep -i Huge /proc/meminfo(关注 HugePages_Total/Free/Rsvd);Oracle 告警日志应出现 “Large Pages Information”。
- limits:su - oracle -c “ulimit -l”(应≥目标 SGA)。
- DB 层:
- show parameter sga; show parameter pga; show parameter workarea_size_policy;
- 命中率与健康度:Library Cache 命中率建议≥90%(结合 v$librarycache 计算);必要时细化 shared_pool_size、db_cache_size。
- 常见报错与处理:
- ORA-27102 / Linux Error 28(No space left on device):多为 shmall 过小,按 SGA_MAX 重新计算并增大 kernel.shmall。
- 启用 HugePages 后实例无法启动或 SGA 未落入大页:确认已关闭 AMM,memlock 设置足够大,HugePages 数量充足,并重启主机。