调整内核参数以提升系统对Oracle的支持,关键参数包括:
fs.aio-max-nr = 1048576(增大异步IO请求上限)、fs.file-max = 6815744(增加系统最大文件句柄数);kernel.shmmax = $(free|grep Mem|awk '{print int($2*1024*0.85)}')(设置为物理内存的85%,控制单个共享内存段最大值)、kernel.shmall = $(free|grep Mem|awk '{print int(($2*1024*0.85)/4096)}')(设置为共享内存总页数,每页4KB);vm.swappiness = 10(降低交换空间使用倾向,减少磁盘IO);net.ipv4.ip_local_port_range = 9000 65500(扩大本地端口范围,支持更多并发连接)、net.core.rmem_default/wmem_default = 262144(默认读写缓冲区大小)、net.core.rmem_max/wmem_max = 4194304/1048586(最大读写缓冲区大小)。sysctl -p使配置生效。noatime,nodiratime(禁用访问时间更新,减少元数据IO)、data=writeback(提升写入性能,适用于OLTP场景)。禁用防火墙(systemctl stop firewalld && systemctl disable firewalld)和SELinux(setenforce 0并修改/etc/selinux/config中SELINUX=disabled),减少系统资源消耗(若环境允许)。
vm.nr_hugepages = $(free -m|grep Mem|awk '{print int(($2*0.8*0.8)/2)}')(约为物理内存的64%,每页2MB);ALTER SYSTEM SET sga_target = 4G SCOPE=BOTH; ALTER SYSTEM SET pga_aggregate_target = 1G SCOPE=BOTH;(适用于中等负载场景)。parallel_query参数开启并行查询),提升并发处理能力;taskset命令将Oracle进程绑定到特定CPU核心,减少上下文切换开销。db_cache_size(数据缓冲区,建议占SGA的60%-70%)、shared_pool_size(共享池,缓存SQL/PLSQL,建议占20%-30%);OLAP侧重large_pool_size(大池,支持并行查询);pga_aggregate_target(PGA总大小),启用自动PGA管理(Oracle 11g及以上版本默认开启),避免手动分配繁琐。processes(最大进程数,建议200-500)和sessions(最大会话数,建议220-550,比processes多10%-20%)。例如:ALTER SYSTEM SET processes = 300 SCOPE=SPFILE; ALTER SYSTEM SET sessions = 330 SCOPE=SPFILE;;SELECT id,name FROM employees替代SELECT *);SELECT * FROM employees WHERE id = :1),降低CPU消耗(硬解析会生成新的执行计划,消耗大量CPU);INNER JOIN优先于外连接),确保JOIN条件使用索引(如ON e.department_id = d.id,其中department_id和id有索引)。CREATE INDEX idx_emp_name ON employees(name));ALTER INDEX idx_emp_name REBUILD ONLINE;(在线重建不影响业务),保持索引效率;DBA_INDEXES视图查看未使用的索引(user_updates > 0 AND user_seeks = 0),删除以减少维护开销。SELECT * FROM TABLE(DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_HTML(1,1,1,1));生成报告,分析top SQL、等待事件(如db file sequential read、enq: TX - row lock contention);SELECT * FROM V$ACTIVE_SESSION_HISTORY查看当前活跃会话,快速定位性能瓶颈。EXEC DBMS_STATS.GATHER_SCHEMA_STATS('SCHEMA_NAME');收集表/索引的统计信息,帮助优化器生成最佳执行计划;ALTER TABLE employees MOVE;(压缩数据,减少碎片),提升查询效率;DELETE FROM logs WHERE create_time < SYSDATE - 365;),减少表大小,降低IO压力。