Hitachi

Cosminexus V11 アプリケーションサーバ 機能解説 拡張編


5.8.2 HTTPセッションの属性情報のサイズの見積もり

セッションフェイルオーバ機能が使用するデータベースのディスク容量を確保する際,HTTPセッションの属性情報の最大サイズが必要になります。

HTTPセッションの属性情報のサイズをWebアプリケーションの内容から計算して求めることは困難です。そのため,アプリケーションサーバではHTTPセッションの属性情報のサイズ見積もり機能を提供しています。HTTPセッションの属性情報のサイズ見積もり機能を使用すると,実際にアプリケーションを実行し,HTTPセッションに登録した属性のシリアライズ後のサイズ情報をメッセージとして出力できます。

ここでは,HTTPセッションの属性情報のサイズ見積もり機能およびHTTPセッションの属性情報のサイズを求める計算式について説明します。

また,FullGCの抑止をする場合のメモリの確保についても説明します。

〈この項の構成〉

(1) HTTPセッションの属性情報のサイズの見積もり機能

HTTPセッションの属性情報のサイズ見積もり機能を使用すると,出力されたサイズ情報を参考にして,HTTPセッションの属性情報の最大サイズに適切な値を見積もることができます。

なお,この機能は見積もり時に使用する機能です。データベースへのグローバルセッションの格納は実施されないため,データベースへの接続は発生しません。

注意事項

HTTPセッションの属性情報のサイズの見積もり機能は,運用環境で使用しないでください。この機能を使用した場合,データベースセッションフェイルオーバ機能は無効となり,グローバルセッション情報がデータベースに冗長化されません。

(a) HTTPセッションの属性情報のサイズの見積もり機能を有効にするための設定

簡易構築定義ファイルの論理J2EEサーバ(j2ee-server)の<configuration>タグ内で,次のパラメタに「on」を指定してください。

  • webserver.dbsfo.check_size.modeパラメタ

簡易構築定義ファイル,および指定するパラメタの詳細は,マニュアル「アプリケーションサーバ リファレンス 定義編(サーバ定義)」の「4.3 簡易構築定義ファイル」を参照してください。

HTTPセッションの属性情報のサイズの見積もり機能を有効にすると,データベースセッションフェイルオーバ機能に関するほかの設定はすべて無効になります。

なお,HTTPセッションの属性情報のサイズの見積もり機能を使用する場合,「5.4.2 前提となる設定」で示しているHttpSessionオブジェクト数の上限値の指定機能を有効にしなくても動作します。

(b) HTTPセッションの属性情報のサイズを通知するメッセージ

HTTPセッションの属性情報のサイズ見積もり機能が有効の場合,Webアプリケーションのリクエスト処理完了時にHTTPセッションの属性情報のサイズを通知する次のメッセージがErrorレベルで出力されます。

表5‒9 HTTPセッションの属性情報のサイズを通知するメッセージ

メッセージID

内容

サイズの情報に含まれる内容

KDJE34330-IまたはKDJE34416-I

リクエストごとに作成したHTTPセッションの属性情報のサイズ

HTTPセッションに登録されている属性をシリアライズした結果の合計サイズ(KDJE34331-IまたはKDJE34417-Iで出力するサイズの合計)※1

KDJE34331-IまたはKDJE34417-I

シリアライズが完了した属性1個分のサイズ

  • 属性名をシリアライズした結果(バイト配列)のサイズ

  • 属性値をシリアライズした結果(バイト配列)のサイズ

  • java.io.ObjectOutputStreamクラスが書き込むマジックナンバー※2

  • java.io.ObjectOutputStreamクラスが書き込むバージョン情報のデータ分のサイズ※2

注※1 HTTPセッションに属性が登録されていない場合,java.io.ObjectOutputStreamクラスが書き込むマジックナンバーおよびjava.io.ObjectOutputStreamクラスが書き込むバージョン情報のデータ分のサイズです。

注※2 最初にシリアライズされた属性のサイズにだけ含まれます。

登録されている属性が「Attribute1」,および「Attribute2」であるHTTPセッションから,HTTPセッションの属性情報を作成した場合のメッセージの出力例を次に示します(データベースセッションフェイルオーバ機能の場合)。

KDJE34331-I  An attribute was serialized. (J2EE application = App01, context root = /test, request URL = http://host01/test/TestServlet, attribute name = Attribute1, class name = app.MyObject1, size(bytes) = 36, HTTP session ID = 01234567aaaabbbbccccddddeeeeffff)
KDJE34331-I  An attribute was serialized. (J2EE application = App01, context root = /test, request URL = http://host01/test/TestServlet, attribute name = Attribute2, class name = app.MyObject2, size(bytes) = 25, HTTP session ID = 01234567aaaabbbbccccddddeeeeffff)
KDJE34330-I  The attribute information was created. (J2EE application = App01, context root = /test, request URL = http://host01/test/TestServlet, size(byte) = 61, HTTP session ID = 01234567aaaabbbbccccddddeeeeffff)

(2) HTTPセッションの属性情報のサイズを求める計算式

HTTPセッションの属性情報の最大サイズは次の式で求めることができます。

ここでは,一つのHTTPセッションに対し,一つのjava.io.ObjectOutputStreamのオブジェクトを使用してシリアライズしているものとします。

HTTPセッションの属性情報の最大サイズ(バイト)=
    HTTPセッションに登録されたすべての属性の属性名をシリアライズしたバイト配列のバイト数の合計
   +HTTPセッションに登録されたすべての属性の属性値をシリアライズしたバイト配列のバイト数の合計

また,HTTPセッションにn個のオブジェクトを属性として登録して,登録した属性をそれぞれ属性1〜属性nとする場合,HTTPセッションの属性情報の最大サイズは次の式で求めることができます。

HTTPセッションの属性情報の最大サイズ(バイト)=
    属性1の属性名をシリアライズしたバイト配列のバイト数 
   +属性1の属性値をシリアライズしたバイト配列のバイト数
   +属性2の属性名をシリアライズしたバイト配列のバイト数 
   +属性2の属性値をシリアライズしたバイト配列のバイト数
     :(中略)
   +属性nの属性名をシリアライズしたバイト配列のバイト数 
   +属性nの属性値をシリアライズしたバイト配列のバイト数

属性名をシリアライズしたバイト配列のバイト数,および属性値をシリアライズしたバイト配列のバイト数は次の式で求めることができます。

属性名をシリアライズしたバイト配列のバイト数

属性名をシリアライズしたバイト配列のバイト数=
 属性名の文字数×3×1.2

属性値をシリアライズしたバイト配列のバイト数

属性値をシリアライズしたバイト配列のバイト数=
 属性値のオブジェクトが持つすべてのフィールドの値のバイト数の合計×1.2

なお,フィールドの値のバイト数は次の式で求めることができます。

注意事項

HTTPセッションの属性情報のサイズを求める計算式で算出できる値は概算です。最終的にHTTPセッションの属性情報の最大値を求める際には,HTTPセッションの属性情報のサイズの見積もり機能を使用してください。

(3) FullGCの抑止をする場合のメモリの確保

HTTPセッションの属性情報のサイズはシリアライズ後のサイズであるため,HTTPセッションに登録した属性オブジェクトのメモリ上でのサイズとは異なります。そのため,FullGCの抑止で必要となる外部ヒープ領域のメモリサイズの見積もりは別途実施して,適切な値を設定する必要があります。

FullGCの抑止についての詳細は「7. 明示管理ヒープ機能を使用したFullGCの抑止」を参照してください。