温馨提示×

centos上oracle性能如何调优

小樊
33
2025-12-13 12:46:45
栏目: 云计算

CentOS 上 Oracle 性能调优实战指南

一 基线评估与瓶颈定位

  • 建立可复现的基线:在业务低峰创建快照,收集 AWR/ADDM,对比优化前后关键指标(如 DB Time、AAS、Top 5 Timed Events、SQL ordered by Reads/Writes)。示例生成 AWR 报告:
    SQL> exec dbms_workload_repository.create_snapshot();
    SQL> @?/rdbms/admin/awrrpt.sql
    重点关注 IO 相关事件:db file sequential/scattered read、direct path read/write、log file sync、log file parallel write,以及 CPU time。这些事件直接指向索引/SQL 策略、IO 子系统与日志写入路径问题。
  • 操作系统层确认 IO 健康度:用 iostat -x 1 10sar -d 观察 await、r_await、w_await、svctm、util。一般单次 IO 响应时间低于 10 ms 为佳,>20 ms 需优先排查(存储缓存、链路、磁盘故障、热点等)。
  • 会话与 SQL 层定位:
    • 查高 IO 与长时运行 SQL:V$SQLAREA 按 DISK_READS/ELAPSED_TIME 排序;V$SESSION_LONGOPS 查长操作。
    • 查系统级等待:V$SYSTEM_EVENT 取 Top 5;V$SESSION_WAIT 捕获实时阻塞与等待。
      以上步骤能快速识别是 SQL/索引内存命中IO 子系统 还是 并发/锁 成为主要瓶颈。

二 操作系统与存储层优化

  • 使用 Oracle 推荐的 tuned-profiles-oracle
    • 启用:tuned-adm profile oracle;验证:tuned-adm active。该配置会对 CPU 调度、内存分配、I/O 调度 等进行数据库友好优化,适合作为首选基线。
  • 内核与资源参数(/etc/sysctl.conf,按内存与负载计算后应用):
    • 共享内存与信号:
      • kernel.shmmax ≈ 物理内存的 85%(字节)
      • kernel.shmall = ceil(物理内存×0.85 / 4096)
      • kernel.sem = 250 32000 100 128
    • 文件句柄与 AIO:fs.file-max = 6815744;fs.aio-max-nr = 1048576
    • 网络:net.core.rmem_default/wmem_default = 262144;net.core.rmem_max/wmem_max = 4194304/1048576;net.ipv4.ip_local_port_range = 9000 65500
    • 内存回收:vm.swappiness = 10;脏页与回写:vm.dirty_ratio = 20;vm.dirty_background_ratio = 3;vm.dirty_writeback_centisecs = 100;vm.dirty_expire_centisecs = 500;vm.min_free_kbytes = 524288
      应用:sysctl -p。以上为常见安全起点,需结合压测微调。
  • 透明大页与 NUMA:
    • 启用 HugePages 减少页表开销、提升大内存访问效率;计算目标值后写入 vm.nr_hugepages,并预留足够连续内存。
    • NUMA 架构上,结合业务测试决定是否禁用 numa_balancing(部分负载下可提升稳定性/性能)。
  • 存储与文件系统:
    • 优先 SSD/NVMe;使用 条带化 RAID、多控制器与多路径;考虑 ASM 做 IO 负载均衡与条带化。
    • 选择支持 O_DIRECT/AIO 的文件系统(如 XFS/ext4),并合理挂载(如 noatime、barrier 依据存储可靠性权衡)。
    • 若采用文件系统缓存,确保存储层 写缓存 策略与业务一致性要求匹配。
      上述要点能显著降低 IO 等待、提升并发与稳定性。

三 数据库内存与关键参数

  • 内存总体策略:
    • 建议留出 20% 内存给 OS,其余用于数据库;在 OLTP 场景常见分配为 SGA:PGA ≈ 80%:20%,在 DSS 场景可提高 PGA 占比(如至 ~50%)。
    • 优先启用自动内存:MEMORY_TARGET(或 SGA_TARGET + PGA_AGGREGATE_TARGET),避免手工细粒度过度配置。
  • SGA 组件要点:
    • Database Buffer Cache:命中率目标 ≥90%;过低则增大 DB_CACHE_SIZE 或整体 SGA。
    • Shared Pool:关注 Library Cache 与 Row Cache 命中率(目标 ≥90%);硬解析高时考虑增加 SHARED_POOL_SIZE、使用 绑定变量、定期清理无效对象。
    • Log Buffer:常规 3–5 MB 起,若 redo log space requests 频繁或 log file sync 偏高,再适度增大。
    • Large Pool:共享服务器、并行查询、RMAN 备份等场景适当增大(常见 20–30 MB 起步)。
  • PGA 与 Workarea:
    • 启用自动 PGA:workarea_size_policy = AUTO;设置 PGA_AGGREGATE_TARGET
    • V$PGASTAT/V$PGA_TARGET_ADVICE 评估命中率与 over-allocation,逐步调整到 ESTD_OVERALLOC_COUNT ≈ 0PGA cache hit % 高。
  • 典型设置示例(需按环境校准):
    • ALTER SYSTEM SET sga_target = 4G SCOPE=BOTH;
    • ALTER SYSTEM SET pga_aggregate_target = 1G SCOPE=BOTH;
    • ALTER SYSTEM SET log_buffer = 64M SCOPE=BOTH;
      以上方法能在不牺牲稳定性的前提下,最大化内存命中率并降低磁盘 IO。

四 SQL 与索引及对象级优化

  • SQL 优化优先级最高:
    • 消除 全表扫描(合理索引、分区裁剪、谓词推进);减少 **SELECT ***;使用 绑定变量 降低硬解析;用 EXPLAIN PLANSQL Monitor 验证计划。
    • 针对 Top SQL 进行重写、改写连接方式(如 Hash/Nested Loop 选择)、减少 SORT/Aggregation/Hash Join 的 IO 与内存占用。
  • 索引策略:
    • 为高频过滤/连接/排序列建立 B-Tree/位图/函数索引;避免 过度索引(增删改代价上升)。
    • 对大表按业务键 分区(范围/列表/哈希),配合 分区索引 降低扫描与维护成本。
  • 维护与统计:
    • 定期收集统计信息:EXEC DBMS_STATS.GATHER_SCHEMA_STATS(ownname=>‘SCHEMA’, estimate_percent=>DBMS_STATS.AUTO_SAMPLE_SIZE);
    • 对高碎片对象按需 重组/重建(如分区拆分、压缩、LOB 重组),避免盲目全库重建。
  • 并发与事务:
    • 合理设置 PROCESSES/SESSIONS,避免连接风暴;控制 事务大小与持有时间,降低 锁争用日志同步 压力。
      这些手段往往能以最小代价获得最大吞吐提升。

五 监控验证与回退

  • 持续监控与复盘:
    • 定期生成 AWR/ADDM,对比 DB Time、AAS、Top Events、SQL 读写 的变化;结合 ASH 做细粒度时段分析。
    • 操作系统侧持续观察 iostat/sarawait、util 与吞吐,确认 IO 优化成效。
  • 变更管控:
    • 任何参数调整遵循“评估—备份—灰度—压测—回退”流程;参数修改前备份 spfile/pfilesysctl.conf
    • HugePages、内核参数、SGA/PGA 等变更,务必在测试环境充分验证,避免生产震荡。
  • 验收标准示例:
    • 关键 SQL 执行时间/逻辑 IO 下降;Buffer Cache/Library Cache 命中率达标;log file syncdb file sequential/scattered read 等待显著下降;存储 await < 10–20 msutil 不过载。
      通过闭环的监控与验证,确保每次优化都可量化、可回退、可持续。

0