引子:
之前有很多Developer’s Guide To protecting Memory。现在硬件内存都很大了,不知道现在的开发人员是否还考虑内存分配。
下面我们从系统管理员的角度谈谈SAP内存管理。
我们系统管理员偶尔会发现Dialog进程进入了PRIV模式,那么如何避免进程进入到PRIV模式呢?这就需要从SAP内存管理谈起。
PRIV缘由:
在SAP标准课程ADM315中,对SAP内存分配以及如何避免进入到PRIV模式有着详细的介绍。
DIA进程是先用Roll mem, 再 Extended mem 然后再是Heap mem, 一但DIA用到了Heap 就会出现PRIV的现象。
SAP的内存区域,主要分为共享内存和本地内存两部分。本地内存是给每个SAP工作处理进程而生成的,这部分内存包括SAP指针缓存;传输数据到数据库或者从数据库中传输数据的I/O缓存区。共享内存部分对所有的工作进程都是透明的,都可以被读取。一台物理服务器上可以有多个SAP实例,一个实例只能读取自己实例的共享内存,而不能读取其他实例的共享对象。
SAP虚拟内存是什么?
这里的虚拟内存是指操系统上所有可用的内存,一般是实际物理内存与交换分区的总和。
1。在共享内存中,SAP Buffer存放着所有用户以及工作进程的全局对象,例如程序,被缓存表的内容(在SAP系统管理中,可以对一些数据库表在应用服务器层面进行缓存)。这些缓存还包括PXA缓存,Nametab缓存,日历。
PXA是指ABAP程序缓存(SAP 程序也是放到数据库中的),命中率要在95%以上。
NameTab缓存指的是ABAP 数据字典缓存,包含了表DDNTT(表定义)以及DDNTF(字段定义)中的数据,NTAB的数据存放于四个缓存块中。
分别是:
TTAB:由参数rsdb/ntabe/entrycount决定其大小
FTAB:由参数rsdb/ntab/ftabsize决定其大小
IRBD:由参数rsdb/ntab/irdb决定其大小
SNTAB:由参数rsdb/ntab/sntabsize决定其大小
NTAB的命中率应该要在95%以上,低于这个指标,一定要找到原因,否则影响性能。
2。卷内存(Roll Buffer)包含了用户上下文的初始部分,例如用户的基本信息,以及用户主记录中的一些默认值。下图说明了Roll buffer的作用
3。扩展内存
主要存放用户的背景信息 从3.0版本开始,用户的背景信息大部分存放于此。因为这部分内存是Shared Memory,因此,所有的SAP工作进程可以直接编辑所存储的用户背景信息。因此,在Roll-in过程中不是整个用户信息都被复制到工作进程的本地内存中(可以参考Roll buffer的图),而只是复制指明在SAP扩展内存中用户背景信息位于何处的地址(也就是指针拉)。通过使用扩展内存可以最大的减少Roll-in和Roll-out中复制的数据量,使得卷处理总体上更快。SAP扩展内存是作为共享内存来分配的:
1)当SAP 实例启动的时候,所分配的SAP扩展内存的大小由参数em/initial_size_MB 定义
2)扩展内存在内部被分为块大小使用,参数em/blocksize_KB 默认是1024KB,建议不要改,除非有notes指出
3)ztta/roll_extension定义了在SAP扩展内存中一个用户背景信息的最大值。这个用来防止单个用户用一个高内存集中的交易而耗光整个扩展内存,而不给其他用户留下可用空间。
4。页面缓存 不要跟我们所说的操作系统级的页面交换搞混。它专门存放了调用专门ABAP命令得到的对象,如extract 数据抽取,与上下文相对独立的对象,。但它确实会跟操作系统进行交换,这也是为啥它叫页面缓存的原因了。
5。堆内存(heap Memory)与扩展内存存放的东西相同。只有在扩展内存被耗尽的时候,这部分内存才会启用。所以,它是按需要进行分配和释放的。也就是说它不是SAP系统启动时候就预先分配好的,只有当扩展内存被耗光并且仍然需要内存的时候,heap memory才会被分配。
特别声明:文章或部分素材来源于网络,仅供SAP、ERP从业伙伴们交流学习使用,如果侵犯了您的权益,请联系网站管理人员删除!