【报错】
接到告警电话,查看alert 日志报错如下:
Thu Jun 20 22:17:11 2024
Errors in file /oracle/diag/rdbms/coredb/coredb/trace/coredb_j003_23800.trc (incident=288071):
ORA-04030: out of process memory when trying to allocate 432 bytes (kxs-heap-c,kprbalo temp memory)
Use ADRCI or Support Workbench to package the incident.
See Note 411.1 at My Oracle Support for error and packaging details.
End automatic SQL Tuning Advisor run for special tuning task “SYS_AUTO_SQL_TUNING_TASK”
Thu Jun 20 22:17:13 2024
Sweep [inc][288071]: completed
【分析】
当操作系统请求内存或其他资源,而系统资源不足时,就会报错 ORA-4030,这里我们可以看到 kxs-heap-c,kprbalo temp memory 是内存的问题,也就是PGA内存不足了。
1、如果 ORA-4030 报错没有对应的trace详细信息,可以手动开启
## 开启trace ALTER SYSTEM SET EVENTS '4030 trace name heapdump level 536870917;name errorstack level 3'; ## 等ORA-4030错误再次出现之后,关闭trace ALTER SYSTEM SET EVENTS '4030 trace name context off; name context off';
2、查看trace文件:/oracle/diag/rdbms/coredb/coredb/trace/coredb_j003_23800.trc
*** 2024-06-20 22:00:04.116
*** SESSION ID:(406.2663) 2024-06-20 22:00:04.116
*** CLIENT ID:() 2024-06-20 22:00:04.116
*** SERVICE NAME:(SYS$USERS) 2024-06-20 22:00:04.116
*** MODULE NAME:(DBMS_SCHEDULER) 2024-06-20 22:00:04.116
*** ACTION NAME:(ORA$AT_SQ_SQL_SW_3355) 2024-06-20 22:00:04.116
status=(pst=ERROR)
status=(pst=ERROR)
status=(pst=ERROR)
…
Incident 273219 created, dump file: /oracle/diag/rdbms/coredb/coredb/incident/incdir_273219/coredb_j003_23800_i273219.trc
ORA-04030: out of process memory when trying to allocate 432 bytes (kxs-heap-c,kprbalo temp memory)
Incident 273220 created, dump file: /oracle/diag/rdbms/coredb/coredb/incident/incdir_273220/coredb_j003_23800_i273220.trc
ORA-04030: out of process memory when trying to allocate 169040 bytes (pga heap,kgh stack)
ORA-04030: out of process memory when trying to allocate 432 bytes (kxs-heap-c,kprbalo temp memory)
Incident 273221 created, dump file: /oracle/diag/rdbms/coredb/coredb/incident/incdir_273221/coredb_j003_23800_i273221.trc
ORA-04030: out of process memory when trying to allocate 82456 bytes (pga heap,control file i/o buffer)
ORA-04030: out of process memory when trying to allocate 432 bytes (kxs-heap-c,kprbalo temp memory)
从上面的日志可以看到是DBMS_SCHEDULER 定时任务调用的 ORA$AT_SQ_SQL_SW_3355 模块导致 4030 报错,这个是Oracle定时执行的Automatic SQL Tuning job。
## 查看trace文件:/oracle/diag/rdbms/coredb/coredb/incident/incdir_273219/coredb_j003_23800_i273219.trc
这里可以看到 pid 145 这个进程执行了一个存储过程占用了90%的内存。
查看pid 145的详细信息,确实是ORA$AT_SQ_SQL_SW_3355 模块。
这里可以看到32G的内存,剩下232M 可用,基本消耗完了。
到这里,我们已经确认是Oracle每天晚上定时执行的 Automatic SQL Tuning job 导致内存耗尽的,可以选择关闭定时任务解决问题。
## 关闭job BEGIN dbms_auto_task_admin.disable( client_name => 'sql tuning advisor', operation => NULL, window_name => NULL); END; /
3、如果不想关闭这个定时任务,进一步分析日志
从上面的trace日志可以看到,还有另外两个错误提示:
(pga heap,kgh stack)
(pga heap,control file i/o buffer)
参考MOS文档:
PLSQL Procedure Causing ORA-04030: (pga heap,control file i/o buffer) And ORA-04030: (koh-kghu sessi,pmuccst: adt/record) or ORA-04030: (koh-kghucall ,pmucalm coll) Errors (Doc ID 1325100.1)
该文章提到即使PGA已经设置大于4GB,当一个进程使用内存达到4GB,就会报这个错误。
## 查看trace文件:/oracle/diag/rdbms/coredb/coredb/incident/incdir_273221/coredb_j003_23800_i273221.trc
可以看到trace日志中,确实内存使用达到4GB就被限制了。
为什么会有4GB这个限制呢?
## 查看trace文件的 Process Map Dump,内存dump信息
从日志看出,进程的内存map记录数是 70986-5453+1=65534 条。
查看系统最大内存记录数65530(默认应该是65536),上面那个进程的记录数已经超过系统限制了
more /proc/sys/vm/max_map_count
默认的内存分配器(realfree allocator)页大小是64KB(65536),所以64K 条记录 64KB * 64K 就是4GB,所以单进程使用达到4GB内存的限制,就报错了。
【解决】
我们可以从系统层面 或 数据库层面修改这个限制。
- 操作系统修改内存最大记录数为256K(262144),即 64KB * 256K = 16GB
more /proc/sys/vm/max_map_count ## 临时生效 sysctl -w vm.max_map_count=262144 ## 永久生效 echo "vm.max_map_count=262144" >> /etc/sysctl.conf sysctl -p
- 数据库修改内存分配器的页大小256KB(262144),即256KB * 64K = 16GB
## 11.2.0.4 及以下版本: _use_realfree_heap=TRUE _realfree_heap_pagesize_hint = 262144 ## 12.1 及以上版本: _use_realfree_heap=TRUE _realfree_heap_pagesize = 262144
对于多租户数据库,只要修改CDB的参数即可,PDB会继承该参数。
注意:
请修改OS 或 DB 其中一个即可,因为一个修改的是记录数,一个修改的是页大小,如果同时修改,那么限制就是 256KB * 256K = 64GB了。
【其他】
参考文档:FAQ: ORA-4030 (Doc ID 399497.1)
该案例只是其中一种情况,导致 ORA-4030 的原因很多,典型的原因有:
- 系统内存或swap空间达到限制;
- 系统达到内核或用户shell等限制,限制用户级或进程级的内存使用;
- 系统内存地址限制(32位系统),SGA占用了所有地址,导致PGA无法分配地址;
- 触发内部未公开的Bug:3130972
- 应用设计问题导致限制;
- 内存空间溢出或内存堆溢出等bug
Diagnostic Tools Catalog (Doc ID 559339.1)
MOS上面有很多诊断工具
可以使用 ORA-4030-Troubleshooting Tool
## 新建一个issue
## 支持上次TFA、IPS、RDA 3种工具收集的日志,选择其一上传即可
## 上传之后,如果是一个有已知问题,会给出现象、原因以及解决方案。如果是一个未知的问题,会给出相关文档以及内存监控工具,便于继续分析或提交SR。
也可以使用RDA工具检查系统配置,内存使用情况等
./rda.sh T hcve
## 检查修复检查结果为 FAILED 的
参考:
Primary Note for Diagnosing OS Memory Problems and ORA-4030 (Doc ID 1088267.1)
FAQ: ORA-4030 (Doc ID 399497.1)
no comment untill now