Linux 上 Oracle 数据库性能优化实战指南
一 内存与 HugePages
- 优先为 Oracle 启用 HugePages,减少页表项与 TLB 未命中,提升 SGA 访问效率,并避免 SGA 被换出。Oracle 官方建议在所有数据库服务器上禁用透明大页(Transparent HugePages, THP)。
- 计算与配置要点:
- 估算所需 HugePages 数量(以 2MB 页为例):HugePages ≈ ceil(SGA_MAX_SIZE / 2MB)。
- 在 /etc/sysctl.conf 设置 vm.nr_hugepages=N 并 sysctl -p 生效。
- 在 /etc/security/limits.conf 为 Oracle 用户设置 memlock(软/硬)≥ SGA_MAX_SIZE,执行 ulimit -l 验证。
- 若使用 AMM(MEMORY_TARGET/MEMORY_MAX_TARGET),请关闭后再启用 HugePages(AMM 与大页不兼容)。
- 重启实例后,通过告警日志或查询 v$sgastat/v$pgastat 验证大页分配与使用。
- 示例(仅示意):SGA_MAX_SIZE=64G → 需 HugePages≈32768(64G/2M);limits.conf 设置 memlock≥67108864。上述做法可显著降低页表开销并提升稳定性。
二 I/O 子系统与文件系统
- 存储优先选用 SSD/NVMe 或高性能阵列,结合条带化/RAID 提升并发与吞吐;将重 I/O的数据文件、重做日志、归档等与低 I/O对象分离布局。
- 文件系统与挂载:在 Oracle Linux(UEK)上,常用 XFS/EXT4,挂载选项建议包含 noatime,nodiratime,nobarrier;I/O 调度器优先 DEADLINE(UEK 默认)。示例:mount -t ext4 -o noatime,nodiratime,max_batch_time=0,nobarrier /dev/sdX /u01。
- 对齐与分区:对高性能块设备(如 PCIe Flash)建议按 1MB 边界对齐分区,减少跨块访问开销。
- Oracle 层 I/O 特性:启用 Direct I/O / Asynchronous I/O(filesystemio_options=SETALL 或 DIRECTIO/ASYNCH),减少双重缓存与等待。
- 可选加速:在受支持的 Oracle Linux + Oracle Database 环境中,可将 Sun Flash Accelerator PCIe 配置为文件系统并启用 Smart Flash Cache。
三 数据库内存与关键参数
- 内存目标与组件:
- 自动内存管理:设置 MEMORY_TARGET/MEMORY_MAX_TARGET(需充足物理内存与 HugePages 配合)。
- 手动管理:分别设置 SGA_TARGET(含 Buffer Cache、Shared Pool、Large Pool、Redo Log Buffer 等)与 PGA_AGGREGATE_TARGET(排序/哈希等私有内存)。
- 典型调整(示例值,需结合实际负载与 AWR/ASH 评估):
- ALTER SYSTEM SET sga_target=32G SCOPE=BOTH;
- ALTER SYSTEM SET pga_aggregate_target=8G SCOPE=BOTH;
- 必要时细化:shared_pool_size、large_pool_size、log_buffer。
- 连接与会话:合理设置 processes/sessions,避免无限制增长导致资源争用。
- 并行执行:在 OLAP/报表 场景按需设置表/会话级并行度(ALTER TABLE … PARALLEL … 或 /*+ PARALLEL */),避免 OLTP 场景滥用。
四 SQL 与执行计划优化
- 执行计划与访问路径:使用 EXPLAIN PLAN、AWR/ASH/ADDM 定位高成本操作,优先通过索引/分区裁剪避免全表扫描。
- SQL 编写与复用:避免 SELECT *,仅返回必要列;使用绑定变量降低硬解析;减少复杂子查询与笛卡尔积。
- 索引策略:为高频过滤/连接列建立B-Tree/位图索引;删除冗余/低效索引;必要时使用覆盖索引减少回表。
- 统计信息与计划稳定性:定期收集对象统计信息(如 DBMS_STATS.GATHER_SCHEMA_STATS),保证优化器选择更优计划。
- 分区与并行:对大表按时间/业务键分区,配合分区裁剪与并行查询提升吞吐。
五 操作系统与网络调优
- 内核与资源:关闭不必要的守护进程,合理设置 file-max 等句柄上限,减少资源竞争。
- TCP/IP 栈(适用于 Data Guard、RAC 及高吞吐场景):
- 增大套接字缓冲:net.core.rmem_default/wmem_default=262144;net.core.rmem_max/wmem_max=4194304/1048576。
- 设置窗口缩放:net.ipv4.tcp_rmem/tcp_wmem=4096 87380 8388608。
- 扩大本地端口范围:net.ipv4.ip_local_port_range=1024 65000。
- 高延迟/高带宽链路按 BDP 调整缓冲:socket buffer ≈ 3 × 带宽 × 时延(如 1000Mbps、20ms → ≈ 7.5MB),并在 Oracle Net 层设置 SEND_BUF_SIZE/RECV_BUF_SIZE。
- Oracle Net:在 sqlnet.ora 设置 DEFAULT_SDU_SIZE=32767(或在 tnsnames.ora/listener.ora 的连接描述符中设置),提升大块传输效率;必要时调优网络设备队列(如 netdev_max_backlog、txqueuelen)。