SAP 메모리에 대한 전체적인 구조와 관리 방법에 대해서 서술한다.
SAP 메모리는 크게 다음과 같은 유형이 있다.
Memory Type | Phys. Assign | Lifetime | addr. Stability | User-Specific |
---|---|---|---|---|
SAP Shared Memory (SHM) | All Workprocesses | ABAP Instance | No | No |
Extended Segments Memory (ES) | All Workprocesses | ABAP Transactions | Yes | - |
Extended Memory (EM) | All Workprocesses | ABAP Transactions | Yes | Yes |
Global Extended Memory (EG) | All Workprocesses | ABAP Instance | Yes | No |
PRIV Memory (HEAP) | Process-specific | ABAP Transactions | Yes | Yes |
PROC Memory | Process-specific | ABAP Instance | Yes | No |
자세한 내용은 help.sap.com 에서 확인 가능하다.
SHM 은 모든 Workprocesses(작업 프로세스) 에서 공유되는 공유 메모리를 제공한다.
SHM 은 운영체제의 Shared Memory 를 기반으로 하며, Local SHM Segment 와 Global SHM Segment 로 구성된다.
Local SHM Segment : 하나의 AP Instance 의 모든 Workprocess 에서 사용될 수 있다.
Global SHM Segment : 동일한 Host 에서 실행되는 모든 Instance 의 모든 Workprocess 에서 사용될 수 있다.
ES 는 EM 과 EG 의 기초를 형성하는 단위이다.
ES 는 Segment 로 구성되며, AP Instance 의 모든 Workprocess 에서 사용될 수 있다.
ES Segment 는 동일한 크기의 ES Block 으로 구성되며, 기본값은 4MB 이다.
EM 은 여러 Workprocess 가 엑세스하는 사용자 세션(사용자 컨텍스트) 의 대부분의 데이터가 저장된다.
시스템과 사용자의 상호작용이 대부분 처리되는 곳이다.
NW 7.4 부터는 ROLL 영역이 EM 과 통합되었다.
자세한 내용은 다음 Notes 참조하기 바란다.
- SAP Notes 2085980 - New features in memory management as of Kernel Release 7.40
운영체제에 따라 Workprocess 유형(Dialog, Non-Dialog) 의 EM 메모리 영역을 할당하는 순서가 달라진다.
<Unix, Linux 의 경우>
<Window, AIX 경우>
ztta/roll_extension* 할당 크기는 em/initial_size_MB 보다 작아야 한다.
기본적으로 Dialog 작업에서는 빠른 사용자 컨텍스트 전환을 보장하기 위해, Workprocess 에 EM 을 먼저 할당한다.
이 후, 메모리 사용량이 EM 최대 할당량에 도달하면, HEAP 을 할당한다.
Non_Dialog 작업의 경우, Unix(AIX 제외), Linux 에서는 HEAP 을 먼저 할당한다. 이 후, HEAP 이 최대 할당량에 도달하면 추가로 EM 을 할당한다.
Non-Dialog 작업에 대해서 HEAP -> EM 순으로 할당하는 이유에 대해서, SAP 에서는 Non-Dialog 작업에서는 빠른 사용자 컨텍스트가 필요하지 않으므로 후에 EM을 할당한다고 설명하고 있다.
Global Extended Memory 는 EM 의 일부이다.
여기에는 사용자별 데이터가 포함되어 있으며, 모든 작업 프로세스에서 엑세스할 수 있다.
EG 는 글로벌 데이터(사용자 또는 작업 프로세스와 연결되지 않는 데이터) 용으로 예약된 EM 의 일부이며, SAP 커널 구성 요소들 간의 내부 통신에서 발생하는 관리 데이터만 EG 로 저장된다.
일반적인 EG 의 크기는 EM 의 5% 크기이며,
SAP 에서도 EG의 크기를 EM의 5~10% 크기를 추천한다. (물론 운영 환경에 따라 변경 할 수 있다.)
HEAP 메모리는 할당되면 사용자 세션이 종료되어 컨텍스트가 Workprocess 를 해제할 때까지 현재 사용자 컨텍스트를 처리하기 위해서만 사용된다.
HEAP 메모리를 할당받게 되면 Workprocess 는 PRIV 모드로 들어가게 되며, 이동안 다른 사용자 컨텍스트를 처리할 수 없게 된다.
abap/heap_area_dia, nondia 값은 total 보다 높으면 적용되지 않는다. 따라서, 각 파라미터 값은 total 보다 작아야 한다.
즉, total 보다 높은 값으로는 메모리를 할당할 수 없으며, HEAP total 은 모든 Workprocess 에서 총 HEAP 메모리를 제한한다.
기본적으로 Dialog 작업에서 EM 최대 할당량을 초과할 경우 HEAP 이 추가로 할당되는데,
이때 HEAP 최대 크기인 heap_area_total 의 여유량에 따라, heap_area_dia 내에서 메모리가 할당된다.
만약 HEAP 여유가 없다면, 추가로 할당할 메모리가 없으므로 Workprocess 가 EM 최대 할당량에 도달할 경우, 추가로 HEAP 메모리를 할당받지 못하고 메모리 DUMP 와 함께 작업이 종료된다.
이를 방지하기 위해 추가로 HEAP 파라미터를 설정할 수 있다.
HEAP 추가 파라미터
abap/heaplimit : Workprocess 에서 사용한 HEAP 크기가 해당 파라미터 값을 초과한다면, 현재 프로그램 실행을 종료한 다음 해당 Workprocess 를 재시작한다. (OS SWAP 해제를 위해서 작동)
rdisp/max_priv_time : Workprocess 가 PRIV 모드에서 수핼될 수 있는 최대시간.
단위지정이 없다면 기본단위는 초 단위이다.
rdisp/wppriv_max_no : PRIV 모드로 실행하는 Workprocess 최대 숫자
이 제한이 있다면, 다음 PRIV Workprocess 가 들어올때, 가장 오랫동안 PRIV 모드에 있었던 Workprocess 가 종료된다.
rdisp/wppriv_max_no 파라미터가 rdisp/max_priv_time 보다 우선순위가 높다
0 설정 시, PRIV 모드로 전환되는 모든 Workprocess 가 종료된다.
(즉 HEAP 메모리를 쓰지 않는다.)
PROC 메모리는 HEAP 과 달리 사용자 세션에 관계없이 각 Workprocess 에 필요한 데이터(Temporary, Heap buffer 등등) 에 사용된다.
사용자 컨텍스트에는 사용자 세션에 속하는 데이터가 포함되어있다.
사용자 세션에서 ABAP 프로그램은 서버 Workprocess 에 의해 실행되고, EM 에 저장된 사용자 컨텍스트가 필요하다.
사용자 컨텍스트에는 다음 데이터가 포함되어 있다.
사용자가 SAPGUI 를 통해 As ABAP 시스템에 로그인하면 별도의 User Session 이 시작된다.
사용자가 새 SAPGUI창을 열면 해당 User Session 내에 새 ABAP Session이 열린다.
사용자가 ABAP 프로그램을 실행하면 ABAP Session 내에서 새로운 내부 Session이 열린다.
해당 내부 Session 에는 다양한 메모리 유형의 메모리 영역을 프로그램에 할당한다. 여기에는 프로그램 실행에 필요한 데이터가 포함된다.
사용자가 수행한 ABAP 프로그램은 서버 내 Workprocess 에서 실행된다.
Workprocess 는 사용자 Session Memory 에서 EM 메모리를 할당받는다.
사용자가 수행한 ABAP 프로그램이 할당 받은 메모리(EM) 를 전부 사용하면, HEAP 여유가 있을때, HEAP 메모리를 추가로 할당받는다.
따라서 메모리 부여 순서에 대해 정리하면 다음과 같다. (Linux, Dialog 작업 예시)
사용자가 작업(ABAP 프로그램) 을 수행하면, Dispatcher 가 요청을 받아받은 후 Queue 로 요청을 넣는다.
이후 DIspatcher Queue에서 해당 작업의 순서가 되면, 유휴 Workprocess 로 작업을 할당하고, Workprocess 는 User Context 에서 권한을 확인 한 뒤, 사용자 세션으로부터 메모리(Dialog 작업이므로 EM)를 할당받아 수행한다.
작업량에 따라, ztta/short_area 크기 단위로 EM 최대치까지 메모리를 부여 받는게 가능하다.
부여받은 메모리가 EM 최대 할당치까지 도달하고도 메모리가 더 필요하다면, HEAP 메모리를 부여한다. (HEAP 여유가 있다면)
EM 최대 할당량 + HEAP 최대 할당량까지 사용해도 메모리가 더 필요하다면, 더 이상 메모리를 부여하지 않고, DUMP 를 생성하고 작업을 종료한다.