引子:
之前有很多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才會被分配。
