在 Ubuntu + Oracle Database 环境下进行调优,通常可以从 操作系统(OS)层、Oracle 实例参数层、SQL 层、存储层 四个维度来做。下面给你一套比较实用、可落地的调优思路(以 Oracle 11g/12c/19c 常见场景为例)。
编辑 /etc/sysctl.conf,常见优化项:
# 共享内存(Oracle SGA 依赖)
kernel.shmmax = 4294967296
kernel.shmall = 1048576
kernel.shmmni = 4096
# 信号量
kernel.sem = 250 32000 100 128
# 文件句柄
fs.file-max = 6815744
# 网络
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_max = 4194304
net.core.wmem_max = 1048576
生效:
sysctl -p
Oracle 用户需要足够资源:
vi /etc/security/limits.conf
oracle soft nofile 65536
oracle hard nofile 65536
oracle soft nproc 16384
oracle hard nproc 16384
oracle soft memlock unlimited
oracle hard memlock unlimited
systemctl disable snapd
systemctl disable bluetooth
避免干扰 IO 和 CPU。
echo none > /sys/block/sda/queue/scheduler
SHOW PARAMETER sga_target;
SHOW PARAMETER pga_aggregate_target;
一般经验:
示例(16G 内存):
ALTER SYSTEM SET sga_target=8G SCOPE=SPFILE;
ALTER SYSTEM SET pga_aggregate_target=3G SCOPE=SPFILE;
SHOW PARAMETER processes;
SHOW PARAMETER sessions;
ALTER SYSTEM SET processes=500 SCOPE=SPFILE;
ALTER SYSTEM SET memory_target=10G SCOPE=SPFILE;
⚠ 注意:SGA + PGA 与 memory_target 不要混用。
ALTER SYSTEM SET log_checkpoint_interval=0;
ALTER SYSTEM SET fast_start_mttr_target=300;
SELECT * FROM v$sql ORDER BY elapsed_time DESC;
@?/rdbms/admin/awrrpt.sql
SELECT *EXEC DBMS_STATS.GATHER_TABLE_STATS('USER','TABLE');
SELECT group#, bytes/1024/1024 FROM v$log;
一般 512MB~1GB 比较合适
top / htopiostat -x 1vmstat 1sqlplus)| 现象 | 可能原因 |
|---|---|
| CPU 高 | 慢 SQL / 缺少索引 |
| IO 高 | 全表扫描 / redo 小 |
| 内存不足 | SGA 设置不合理 |
| 连接慢 | processes 不够 |
如果你能告诉我:
我可以给你一套 针对性参数配置方案。