下面从 Linux 操作系统层 + Oracle 数据库层 两个维度,系统性讲一下 Linux 下 Oracle 性能调优 的常见配置和优化思路。内容偏实战,适合生产环境参考。
Oracle 依赖大量共享内存和信号量,必须配置。
# 共享内存
kernel.shmmax = 68719476736 # 单段最大共享内存(如 64G)
kernel.shmall = 16777216 # 共享内存总页数(shmmax/PAGE_SIZE)
kernel.shmmni = 4096
# 信号量
kernel.sem = 250 32000 100 128
# 文件句柄
fs.file-max = 6815744
# 网络
net.ipv4.ip_local_port_range = 1024 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
# 交换行为(避免频繁 swap)
vm.swappiness = 10
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
应用:
sysctl -p
Oracle 用户必须放开限制:
oracle soft nofile 65536
oracle hard nofile 65536
oracle soft nproc 16384
oracle hard nproc 16384
oracle soft stack 10240
oracle hard stack 32768
# 关闭 numad(数据库服务器建议)
systemctl stop numad
systemctl disable numad
BIOS / GRUB 中可关闭 NUMA(大内存机器有时更稳定)
✅ 推荐:
/dev/sdb1 /u01 xfs defaults,noatime,nodiratime 0 0
IO 调度器(SSD 用 none / mq-deadline):
echo mq-deadline > /sys/block/sdb/queue/scheduler
避免 SGA 被 swap:
grep Huge /proc/meminfo
计算所需大页数:
# SGA大小 / 2MB
配置:
vm.nr_hugepages = 30000
并在 oracle 用户 limits 中允许锁定内存:
oracle soft memlock unlimited
oracle hard memlock unlimited
-- 查看
SHOW PARAMETER sga_target;
SHOW PARAMETER pga_aggregate_target;
-- 建议(物理内存 64G 示例)
ALTER SYSTEM SET sga_target=40G SCOPE=SPFILE;
ALTER SYSTEM SET pga_aggregate_target=8G SCOPE=SPFILE;
经验:
ALTER SYSTEM SET memory_target=0 SCOPE=SPFILE;
ALTER SYSTEM SET sga_target=40G SCOPE=SPFILE;
-- Redo 日志至少 500MB
SELECT * FROM v$log;
-- Undo 保留
ALTER SYSTEM SET undo_retention=1800;
EXEC DBMS_STATS.GATHER_DATABASE_STATS;
常见慢 SQL 处理:
SELECT *SHOW PARAMETER processes;
ALTER SYSTEM SET processes=2000 SCOPE=SPFILE;
适度使用并行:
ALTER SESSION ENABLE PARALLEL DML;
# OS
top, vmstat 1, iostat -x 1, sar -u
# Oracle
SELECT * FROM v$session_wait;
SELECT * FROM v$sysstat;
SELECT * FROM v$sql ORDER BY elapsed_time DESC;
如果你能告诉我:
我可以给你一套 针对性参数模板。