SAP HANA频繁出现OOM内存溢出时,通常分以下几个场景,分别进行分析处理:

1、内存使用突然增长导致的内存溢出

该情况是在执行查询时产生的大量中间结果导致的。

需要事先开启资源追踪:

1、global.ini文件中的resource_tracking部分:
enable_tracking = on
memory_tracking = on
2、将Expensive Statement Trace功能设置为Active。

之后使用M_EXPENSIVE_STATEMENTS.MEMORY_SIZE检查在发生OOM时语句的内存使用情况统计。之后根据分析结果对发现的有问题的查询执行优化(ABAP代码优化)。

2、内存使用持续增长导致的内存溢出

当内存使用持续增加时,需要检查是否有许多语句触发了内存溢出。

存储过程中的commit/rollback:

使用该语法时系统在执行完查询操作后,相关的事物处于挂起状态,系统不能自动回收内存,可能会导致内存溢出,需要移除语句中的commit/rollback(ABAP代码优化)。

程序错误导致的:

检查SAP HANA cockpit —>Overview—>Memory Usage中的Performance Monitor,确认内存使用是否在数据量没有明显增加的情况下持续增长。如果发现了可疑的组件一直在分配内存,给SAP创建一个support ticket,附上完整的system dump,mm trace, 以及_SYS_STATISTICS.HOST_HEAP_ALLOCATORS_BASE的输出内容。

3、列存储组件Allocators的使用率高导致的内存溢出

出现该情况,根本原因是内存不足。

检查OOM文件中 [MEMORY_OOM] 部分排名靠前的allocator,检查它们是否是列存储组件,且与"1999997 - FAQ: SAP HANA Memory"中第13部分描述的一致;

检查unload trace,确认是否有频繁的表卸载。

降低列存储中的数据量(删除不需要的数据),增加物理内存。

4、统计服务使用的内存较多导致的内存溢出

当系统存在大量的告警或者是可用内存明显小于统计服务实际需求时,会出现统计服务使用的内存较高的情况。

大量告警:

检查表_SYS_STATISTICS.STATISTICS_ALERTS_BASE,对它执行truncate操作。

参考:
SAP Note 2170779 - SAP HANA DB: Big statistics server table leads to performance impact on the system

Pool/Statistics allocator较大:

SAP Note 2147247 - FAQ: SAP HANA Statistics Server

5、共享内存使用率较高导致的内存溢出

共享内存中存储HANA系统信息以及行表。当它使用率较高时,根本原因是行表碎片化严重。

当发生于SAP BW的行存储表时: 

按顺序执行:
SAP Note 706478 - Preventing Basis tables from increasing considerably, 
SAP Note 1813245 - SAP HANA DB: Row store reorganization。

当发生于非SAP BW的行存储表时:

检查是否可以将行表转换为列表;
检查是否可以对老数据执行归档;
增加物理内存。