2026.02.02

SAPメモリ(ABAP)

今回はSAPシステム(ABAP)のメモリ構成について、ご説明して行きたいと思います。

<ブログの内容>

1.はじめに

2.SAPメモリ構成
 2.1. SAP共有メモリ
 2.2. 拡張メモリ
 2.3. SAPバッファメモリ
 2.4. PROCメモリ
 2.5. PRIVメモリ

3.メモリの使われ方
 3.1. SAPメモリ割当順序
 3.2. 拡張メモリの実装
 3.3. ユーザセッション ( ユーザコンテキスト )
 3.4. ゼロ管理メモリ管理 ( Zero Administration Memory Management )

4.SAPメモリパラメータ

1.はじめに

SAP システムでは、安定した業務処理と高いパフォーマンスを実現するために、メモリ管理が非常に重要です。本記事では、SAP アプリケーションサーバ ( ABAP )のメモリ構成を中心に、代表的なメモリ領域や割当順序、拡張メモリの実装モデルについて解説します。
SAP メモリの仕組みを理解することで、パフォーマンス問題の原因分析や適切なチューニングにも役立ちます。

2.SAPメモリ構成

SAPシステムのメモリの構成は下記の通りとなります。

SAPシステムではSAPアプリケーションサーバインスタンス ( PAS / AAS ) が起動しているサーバOSの物理メモリとSWAPメモリを利用します。
SAPアプリケーションサーバでは、用途に応じたさまざまなメモリ領域が存在しており、それぞれ役割が異なります。
なお、SAP Kernel 7.40より古いバージョンでは「ロール領域 ( Roll Area ) 」というメモリ領域が存在しましたが、SAP Kernel 7.40からは廃止されています。
SAP Note 2085980 – New features in memory management as of Kernel Release 7.40

2.1. SAP共有メモリ ( SAP Shared Memory )

全てのワークプロセスで共有されるメモリ領域。
SAPバッファメモリや拡張メモリなどが含まれる。SAP共有メモリはOSの共有メモリに直接基づいており、ローカルセグメント、グローバルセグメントで構成されています。

2.2. 拡張共有メモリ

拡張メモリは下記の3つのメモリ領域で構成されています。
 ・拡張メモリ ( Extended Memory )
 ・グローバル拡張メモリ ( Global Extended Memory )
 ・拡張セグメントメモリ ( Extended Segments Memory )

■ 拡張メモリ ( Extended Memory )

SAPメモリ管理のコアとなり、全てのワークプロセスからアクセスできるユーザのセッションデータ ( ユーザコンテキスト ) を格納するメモリ領域。
各ワークプロセスの処理時にアクセスするユーザセッション ( ユーザコンテキスト ) のデータの大部分が保存されており、これによりユーザコンテキストの切替が高速化されます。拡張メモリは拡張セグメントメモリに基づいており、拡張セグメントメモリは拡張メモリの実装の基礎となります。

拡張メモリはさまざまな実装モデルがあります。実装モデルの詳細は「3.1. 拡張メモリの実装」を参照願いします。

■ グローバル拡張メモリ ( Global Extended Memory )

拡張メモリ ( Extended Memory ) ベースのメモリ領域。
ユーザセッションに属さないユーザ固有監視や統計などに使用されるデータ、データベースインタフェースのテーブルバッファ、ABAP共有オブジェクトが保存されており、全てのワークプロセスからアクセスが可能となります。

■ 拡張セグメントメモリ ( Extended Segments Memory )

拡張メモリ ( Extended Memory ) とグローバル拡張メモリ ( Global Extended Memory ) の基礎となるメモリ領域 ( セグメント ) 。
連続したメモリセグメントで構成されており、セグメントは1つ以上のブロックで構成されてます。拡張セグメントメモリは全てのワークプロセスからアクセスが可能となります。ユーザコンテキストが拡張メモリからメモリ領域を要求すると、拡張セグメントメモリから1つ上のブロックが拡張メモリに割当られます。
拡張セグメントメモリブロックは、OSの共有メモリセグメントに保存されます。

2.3. SAPバッファメモリ ( SAP Buffer Memory )

頻繁に使用させるデータを格納するキャッシュ領域。
SAPアプリケーションサーバインスタンスごとにバッファメモリの領域が用意されており、SAPアプリケーションサーバはローカルのバッファメモリのデータが使用できます。バッファメモリによりデータベースへのアクセス数やデータベースサーバの負荷、ネットワークトラフィックを削減することができ、パフォーマンスが大幅に改善されます。
バッファメモリには、格納するデータによって使用するバッファが異なり、大きく下記のバッファが存在します。

■ プログラムバッファ ( ABAPバッファ / PXA )

ABAPプログラム ( ロード ) のコンパイル済実行可能バージョンを保存します。
バッファの内容は、テーブル D010L ( ABAP ロード )、D010T ( テキスト )、D010Y ( シンボルテーブル ) に保存されます。

■ リポジトリバッファ ( Nametabバッファ )

システムで有効化されているテーブルおよび項目定義を保存します。
一括有効化機能またはユーザ ( ABAPディクショナリ、Tr-CD:SE11を使用 ) がテーブルの有効化を依頼するとリポジトリバッファにエントリが作成されます。バッファの内容は、DDNTT ( テーブル定義 )、DDNTF ( 項目テキスト ) に保存されます。リポジトリバッファは下記の4つのバッファで構成されています。

TABバッファ ( テーブル定義を保存 )
FTABバッファ ( 項目テキストを保存 )
IRECバッファ ( 初期レコードレイアウトを保存 )
SNTABバッファ ( 短い名称テーブルを保存 )

■ テーブルバッファ

テーブルバッファには以下の2種類に分かれます。
部分テーブルバッファ
単一テーブルエントリ、つまり項目値を含む1つのレコードが格納されます。

ジェネリックテーブルバッファ
テーブルエントリの範囲 ( 項目値を含むレコードの範囲 ) を格納します。
このバッファでは、全てのエントリ ( レコード ) をテーブルに保存することもできます。これは、常駐 ( またはフル ) バッファリングと呼ばれます。

■ SAPguiバッファ

SAPguiバッファには以下の2種類に分かれます。
プレゼンテーションバッファ ( 画面バッファ )
生成されたDynproを保存します ( DYNPROロード ) 。

メニューバッファ ( CUAバッファ )
SAPGUIメニュー、押ボタン定義などのオブジェクトを格納します。
これらのオブジェクトはテーブルD345T ( CUA テキスト )、D342L ( CUAロード ) からのものです。バッファはディレクトリ構造を持ち、LRU置換をサポートします。

■ ロールバッファ / ページングバッファ

ロールバッファとページングバッファは、アプリケーションサーバのロール領域とページング領域のための優先領域となります。
メモリ上の領域とロールファイルとページングファイルとしてディスク上にあります。ロール領域にはユーザコンテキスト、ページング領域にはABAPプロセッサの特別なデータが格納されます。

■ カレンダバッファ

定義されたすべての稼働日カレンダおよび祝日カレンダが保存されます。
カレンダはテーブルTFACS、THOCSに保存されます。バッファはディレクトリ構造を持ちます。つまり、共有メモリの設定が小さすぎると、必要なデータのみがロードされます。バッファの内容のLRU置換は行われません。

■ エクスポート / インポートバッファ

インポート / エクスポートバッファは、複数のワークプロセスで使用可能である必要があるデータを保存するために使用されます。主にロジスティクスのATPロジックなどに使用されます。

■ OTRバッファ ( Online Text Repository )

オンラインリポジトリで管理されるテキストを保存します。

■ エクスポート / インポート共有メモリバッファ

共有メモリのオブジェクトを転送 ( エクスポート、インポート ) するためのバッファ領域。アプリケーションサーバ間で転送するデータを保存します。

なお、最新のSAP S/4HANAでは、リポジトリバッファ ( Nametabバッファ ) はカタログバッファに置き換わります。テーブルバッファは新しくなり、部分テーブルバッファ、ジェネリックテーブルバッファの区別が無くなりました。ロールバッファ ( ロール領域 ) は使用されなくなりました。
SAP Note 2103827 – Profile parameters for table buffer as of SAP Kernel Release 7.40
SAP Note 3085975 – Catalog profile parameters as of SAP Kernel Release 781

2.4. PROCメモリ ( PROC Memory )

ユーザセッション ( ユーザコンテキスト ) に割り当てられていないデータを格納するワークプロセスのためのメモリ領域。
ワークプロセス個別にPROCメモリが割り当てられます。個々のワークプロセスでPROCメモリの領域がそれぞれ存在するのではなく、1つのメモリ領域を全ワークプロセスで使用します。

2.5. プライベート ( ヒープ ) メモリ ( PRIV Memory )

ユーザセッション ( ユーザコンテキスト ) に割り当てられたデータを格納するワークプロセスのためのプライベートなメモリ領域。
ヒープメモリは各ワークプロセスごとに割り当てられます。ワークプロセスの処理が終了するまでヒープメモリは使用され続け、処理が終了すると解放されます。このため常時、ワークプロセスの数だけヒープメモリの個々の領域が予約される訳ではありません。

3.メモリの使われ方

ここでは、SAPアプリケーションサーバでのメモリの使い方を説明して行きます。

3.1. SAPメモリ割当順序

SAPシステムでは、SAPアプリケーションサーバインスタンスが実行されているプラットフォームによって、ワークプロセスが使用するメモリタイプの順序が異なります。また、ダイアログワークプロセスと非ダイアログワークプロセスでも使用するメモリタイプの順序が異なります。

■ Windows / AIX の場合

Windows / AIXでSAPアプリケーションサーバインスタンスを実行している場合のメモリ領域の使用順序は以下の通りとなります。
<ダイアログワークプロセス / 非ダイアログワークプロセス共通>

■ UNIX / Linux の場合

UNIX / LinuxでSAPアプリケーションサーバインスタンスを実行している場合のメモリ領域の使用順序は以下の通りとなります。
<ダイアログワークプロセス>
Windows / AIXプラットフォームと同じ順序でメモリを使用

<非ダイアログワークプロセス>

拡張メモリの最大クォータ、PRIVメモリの最大サイズはSAPプロファイルパラメータで制御します。プロファイルパラメータについては、「4. SAPメモリパラメータ」を参照。
上記の通り、ワークプロセスで使用できるメモリサイズは、拡張メモリ ( ワークプロセスで利用可能なサイズのみ ) とPRIVメモリの合計となります。このメモリの合計を超えるとワークプロセスの処理はメモリ不足でエラー終了します。

3.2. 拡張メモリの実装

現在のSAPシステムでは拡張メモリ ( EM ) および拡張グローバルメモリ ( EG ) は拡張セグメントメモリ ( ES ) のセグメントに基づいています。拡張セグメントメモリのセグメントの実装は拡張メモリの実装の基礎となります。拡張セグメントメモリの実装には3種類の実装モデルが用意されています。

■ マップ実装 ( Map implementation )

拡張メモリセグメントはメモリマッピングファイルによって実装されます。ユーザコンテキストはWP専用の拡張セグメント領域にマッピングされ、他のWPからブロックされます。WPの処理が終了する拡張セグメントメモリ領域とのマッピングが解除されます。
実装方法は下記のSAPプロファイルパラメータを設定することで実装できます。
 ( Windowsの場合 ) es/implementation=view / ( Linuxの場合 ) es/implementation=map

■ フラット実装 ( Flat implementation )

拡張セグメントメモリはメモリ保護でマッピングされたメモリファイルによって実装されます。最初に全てのユーザコンテキストが保護されて、拡張セグメントメモリ領域にマッピングされます。WPの処理が開始するとユーザコンテキストの保護が解除され、処理が終了すると再度保護されます。ユーザコンテキストは異なるWPで処理することが可能となります。
実装方法は下記のSAPプロファイルパラメータを設定することで実装できます。
 ( Windowsの場合 ) es/implementation=flat / ( UNIX / Linuxの場合 ) es/implementation=std

■ ESSMH実装 ( ESSMH implementation )

拡張セグメントメモリはSAP共有メモリ全体として実装されます。完全なユーザコンテキストはOSのSAP共有メモリセグメントにあり、拡張セグメントメモリにマッピングされるとSAP共有メモリセグメント全体が拡張セグメントメモリのセグメントに添付されます。
実装方法は下記のSAPプロファイルパラメータを設定することで実装できます。
 ( AIXの場合 ) ES/TABLE=SHM_SEGS

プラットフォームによって使用可能な実装モデルおよびデフォルトの実装モデルが変わります。Windowsのデフォルトは「マップ実装」、UNIX / Linuxのデフォルトは「フラット実装」、AIXのデフォルトは「ESSMH実装」となります。

3.3. ユーザセッション ( ユーザコンテキスト )

SAPシステムではユーザがログオンするとユーザセッションが作られます。このユーザセッションはログオンしているユーザ毎に作成されます。
ユーザセッションにはABAPセッションと呼ばれる領域が作成されます。このABAPセッションはSAPGUIで「新規GUIウィンドウ」ボタンを押して、複製されたセッションごとにABAPセッションが作られます。ABAPセッションにはSAPGUIセッションのデータが格納されます。
ABAPセッションの最大数はSAPプロファイルパラメータ「rdisp/max_alt_modes」で設定されていおり、デフォルトでは最大16個のABAPセッションを作成することが可能となります。
SAP Note 12466 – Logon restrictions in R/3

さらに、ABAPセッション内に最大9個(※)の内部セッションを作成することができます。内部セッションにはプログラムの実行に必要なデータが格納されます。
※内部セッションの最大数はハードコーディングされているため変更できません。
SAP Note 2382232 – [Basis] Maximum number of internal sessions reached

また、ユーザがログオンするとユーザ毎にユーザセッションが作成されて、ABAPセッションや内部セッションが作成されますが、それらはユーザコンテキストとして管理されます。ユーザコンテキストにはセッションデータ以外に下記のユーザ固有のデータも格納されます。
 ・ユーザデータ
 ・権限データ
 ・ABAP変数
 ・ABAPオブジェクト
 ・内部テーブル

ユーザコンテキストの構造は下記の通りとなります。

ユーザコンテキストは、拡張メモリ、ヒープメモリなど様々なSAPメモリ領域を利用します。

3.4. ゼロ管理メモリ管理 ( Zero Administration Memory Management )

Windowsプラットフォームでは、Zero Administration Memory Management ( ZAMM ) という拡張メモリ ( EM ) の動的拡張機能が追加されています。
ゼロ管理メモリ管理では、SAPパラメータ「PHYS_MEMSIZE」の設定値を基準に拡張メモリの各SAPパラメータの設定値が自動で計算されるようになります。PRIVメモリ ( ヒープメモリ ) は自動計算の対象外となります。
SAP Note 88416 – Zero administration memory management for the ABAP server
SAP Note 2085980 – New features in memory management as of Kernel Release 7.40

ゼロ管理メモリ管理により、メモリ関連のSAPプロファイルパラメータのデフォルト値がサーバリソースから自動で算出されるため初期インストール時にメモリ関連のパラメータを明示的に設定する必要がありません。後続の各種テストや稼働後のEWAレポートなどでメモリ不足が検出されるまでは明示的にパラメータを設定する必要はありません。
SAPカーネルリリース7.40以降では、UNIX、Linux、AIXプラットフォームでもゼロ管理メモリ管理機能が利用可能となっています。

■ 動的拡張メモリ

ゼロ管理メモリ管理の機能では、Windowsプラットフォームでかつ拡張メモリの実装モデルが「マップ実装」の場合に拡張メモリを動的に変更することが可能となります。
拡張メモリのサイズが十分ではない場合、メモリ ( パラメータ PHYS_MEMSIZE の設定値 ) の半分以下または、パラメータem/max_size_MBで指定したサイズまで拡張することができます。なお、ゼロ管理メモリ管理の対象となるため、明示的にパラメータを設定する必要はありません。拡張可能な拡張メモリはメモリサイズに合わせて自動的に調整されます。

4.SAPメモリパラメータ

SAPメモリ構成で説明した各メモリタイプのサイズはSAPプロファイルパラメータで定義されています。
各メモリタイプのサイズを定義するプロファイルパラメータは下記の通りとなります。

各メモリタイプの主なプロファイルパラメータは下記の通りとなります。

PHYS_MEMSIZE

SAPアプリケーションサーバインスタンスで使用できるメモリサイズ ( MB ) 。デフォルト値はサーバのメインメモリのサイズ。ゼロ管理メモリ管理での各パラメータの初期値の基準として使用される。

em/initial_size_MB

ユーザコンテキストを含む拡張メモリの全サイズ ( MB ) 。デフォルト値は512MB <= ( PHYS_MEMSIZE × 0.7 ) 。

em/max_size_MB

( Windowsのみ ) 動的拡張メモリの最大サイズ ( MB ) 。デフォルト値は512MB <= ( PHYS_MEMSIZE × 1.5 ) 。

em/global_area_MB

グローバル拡張メモリの最大サイズ ( MB ) 。デフォルト値は (em/initial_size_MB × 0.05 ) <= 32,000 。

em/blocksize_KB

拡張メモリセグメントのブロックサイズ ( KB ) 。

em/address_space_MB

ユーザコンテキスト用に予約された拡張メモリ内のワークプロセスの仮想アドレス領域のサイズ ( MB ) 。デフォルト値はWindows ( 64bit ) の場合はem/initial_size_MBと同じ、Windows ( 32bit ) の場合は2GB、その他OSの場合は4,096MB。

ztta/roll_extension

1つのダイアログワークプロセス・非ダイアログワークプロセスで割当可能な拡張メモリのサイズ ( Byte ) 。デフォルト値はLinuxの場合は4,000,000,000 Byte ( 4GB ) 、その他OSの場合は2,000,000,000 Byte ( 2GB ) 。以下のパラメータを使用すると、それぞれのワークプロセスを別々に設定することが可能。
 ダイアログワークプロセス:ztta/roll_extension_dia
 非ダイアログワークプロセス:ztta/roll_extension_nondia

ztta/roll_extension_dia

1つのダイアログワークプロセスで割当可能な拡張メモリのサイズ ( Byte ) 。デフォルト値はztta/roll_extensionと同じ。

ztta/roll_extension_nondia

1つの非ダイアログワークプロセスで割当可能な拡張メモリのサイズ ( Byte ) 。デフォルト値はztta/roll_extensionと同じ。

abap/heap_area_total

SAPアプリケーションサーバインスタンスのダイアログワークプロセスと非ダイアログワークプロセスで割当可能なPRIV ( ヒープ ) メモリの合計サイズ ( Byte )。デフォルト値はWindowsの場合はPHYS_MEMSIZEと同じサイズ、その他OSの場合はPHYS_MEMSIZEの10% またはabap/heap_area_diaの2倍の大きい方。

abap/heap_area_dia

1つのダイアログワークプロセスで割当可能なPRIV ( ヒープ ) メモリの最大サイズ ( Byte ) 。デフォルト値は2,000,000,000 Byte ( 2GB ) 。

abap/heap_area_nondia

1つの非ダイアログワークプロセスで割当可能なPRIV ( ヒープ ) メモリの最大サイズ ( Byte ) 。デフォルト値はWindowsの場合は0 Byte、その他OSの場合は2,000,000,000 Byte ( 2GB ) 。

abap/heaplimit

PRIVメモリのしきい値となるサイズ ( Byte ) 。デフォルト値は150,000,000 Byte ( 150 MB ) 。ワークプロエスのPRIVメモリの使用量が、このしきい値を超えると現在のプログラムステップの実行を終了し、ワークプロセスが再実行される。このパラメータは100,000,000 Byte ( 100 MB ) <= 2,000,000,000 ( 2GB ) の間である必要がある。

em/proc_max_size_MB

SAPアプリケーションサーバインスタンスの全てのワークプロセスで割当可能なPROCメモリの最大サイズ ( MB ) 。デフォルト値は0 ( 制限なし ) 。

rdisp/PG_SHM

ページングバッファのサイズ ( 8KBのブロック単位で指定 ) 。デフォルト値はゼロ管理メモリ管理にて自動計算された値。

rdisp/PG_MAXFS

SAPページングファイルのサイズ ( 8KBのブロック単位で指定 ) 。デフォルト値はゼロ管理メモリ管理にて自動計算された値。

abap/buffersize

プログラムバッファのサイズ ( KB ) 。デフォルト値はゼロ管理メモリ管理にて自動計算された値。

rsdb/tbi_buffer_area_MB

テーブルバッファのサイズ ( MB ) 。デフォルト値は下記の計算式から算出された値。
バッファサイズ = ( ( rttb/buffer_length × 1024 ) + ( zsca_table_buffer_area × 1024 × 1024 ) ) × 1.1

rsdb/cua/buffersize

メニュー ( CUA ) バッファのサイズ ( KB ) 。デフォルト値は3,000 KB ( 3MB ) 。

zcsa/presentation_buffer_area

プレゼンテーション ( 画面 ) バッファのサイズ ( Byte ) 。デフォルト値は40,000,000 Byte ( 38MB ) 。

rsdb/obj/buffersize

エクスポート / インポートバッファのサイズ ( KB ) 。デフォルト値は下記の計算式から算出された値。
バッファサイズ = ( max ( 4096, $( PHYS_MEMSIZE ) × 1024 × 0.01 ) )

rsdb/esm/buffersize_kb

エクスポート / インポート共有メモリバッファのサイズ ( KB ) 。デフォルト値は4,096 KB ( 4MB )。

zcsa/calendar_area

カレンダバッファのサイズ ( Byte ) 。デフォルト値は600,000 Byte 。

rsdb/otr/buffersize_kb

オンラインテキストリポジトリバッファのサイズ ( KB ) 。デフォルト値は4,096 KB ( 4MB ) 。

catalog/cache_entries

カタログバッファ内の管理対象オブジェクト数。デフォルト値は下記の計算式から算出された値。
オブジェクト数 = ( min ( 1,000,000, ceil ( $( em/initial_size_MB ) × 0.08 × 1024 × 1024 ÷ $( catalog/cache_average_entry_size ) ) ) )

catalog/cache_empty_entries

カタログバッファ内の管理された空の ( 見つからない ) エントリの数。
エントリ数 = ( $( catalog/cache_entries ) ÷ 8 )

catalog/cache_average_entry_size

カタログバッファエントリの平均データサイズ ( Byte ) 。デフォルト値は6,500 Byte 。

<参考>
 SAPヘルプ – SAPメモリ管理 (BC-CST-MM)

SAP製品の導入・移行・運用保守に関して、お気軽に相談下さい。
レイエントシステムではSAP製品の新規導入からシステム移行、運用保守までご対応します。
お問い合わせ

RECRUIT

エンジニアが主役となり、未来を明るく照らしていく100年企業へ。

採用情報へ