温馨提示×

linux oracle为何负载过高

小樊
36
2026-09-19 14:46:50
栏目: 云计算

在 Linux 上运行 Oracle 数据库时,负载过高(Load Average 高、CPU 忙、IO 等待大)通常不是单一原因,而是以下几类问题之一或叠加。下面按常见原因 → 排查方法 → 解决思路来说明。


一、CPU 相关原因

1. Oracle 并发 SQL 过多 / 执行计划差

  • 大量 SQL 全表扫描
  • 缺少索引
  • 执行计划突变(bind peek、统计信息过期)

排查:

top
# 看 %CPU 高的进程是否是 oracle

sqlplus / as sysdba
SELECT sql_id, executions, buffer_gets, cpu_time
FROM v$sql
ORDER BY cpu_time DESC;

解决:

  • 优化 SQL
  • 建索引
  • 收集统计信息
EXEC DBMS_STATS.GATHER_TABLE_STATS('USER','TABLE');

2. Oracle 参数设置不合理

  • SGA / PGA 过大或过小
  • 进程数过多(PROCESSES

排查:

SHOW PARAMETER processes;
SHOW PARAMETER sga_target;
SHOW PARAMETER pga_aggregate_target;

二、IO 相关原因(非常常见)

3. 磁盘 IO 瓶颈

  • redolog 写慢
  • 数据文件分散在慢盘
  • 归档开启但磁盘满

排查:

iostat -x 1

重点看:

  • %util → 接近 100% 说明磁盘忙
  • await / svctm
SELECT event, total_waits
FROM v$system_event
WHERE event LIKE '%db file%';

解决:

  • 使用 SSD / 分离 redo / data / arch
  • 增加 redo 大小
  • 调整异步 IO

三、内存与 Swap 问题

4. 内存不足导致 Swap

Oracle 最怕 Swap。

排查:

free -m
vmstat 1

si/so > 0 说明在 swap。

解决:

  • 减小 SGA/PGA
  • 增加物理内存
  • 关闭 swap(不推荐生产随意)

四、Oracle 自身问题

5. 锁等待 / 死锁

  • 应用并发写同一行
  • 未提交事务

排查:

SELECT * FROM v$lock WHERE block=1;
SELECT sid, event FROM v$session_wait;

6. 统计信息 / 归档问题

  • 归档满
  • 统计信息长期未收集
df -h
archive log list

五、Linux 系统层面原因

7. 系统参数不合理

  • nr_hugepages 未配置
  • 文件描述符不足
  • transparent_hugepage 开启(Oracle 不推荐)
cat /sys/kernel/mm/transparent_hugepage/enabled

建议:

  • 关闭 THP
  • 配置 hugepages

六、快速定位思路(实战)

top
iostat -x 1
vmstat 1

再看 Oracle:

SELECT event, count(*)
FROM v$session_wait
GROUP BY event
ORDER BY 2 DESC;

总结一句话

Linux 上 Oracle 负载高,90% 是 SQL + IO + 内存,不是系统本身问题。

如果你愿意,可以告诉我:

  • Oracle 版本
  • Linux 发行版
  • top / iostat 输出
  • 是 CPU 高还是 IO 等待高

我可以帮你精准定位是哪一类问题

0