2014年8月14日木曜日

JavaServletサーバ設定

JavaのServletサーバを構築することがあったので、ついでに設定についてまとめておきます。

サーバの構成はレガシーです。


  • tomcat:Webアプリケーションサーバ
  • Jersey:JAX-RSの実装
  • Doma:ORM、DAO
  • DBCP:DB接続プール
  • MySQL:RDB


裏側、DBとアプリケーションの接続からまとめます。

DBCPを使ってDB接続プールを保持する場合の設定です。

ここでは、WEBアプリケーション直下にMETA-INFディレクトリを作成し、context.xmlを格納する方法を使い、以下のように記述します。


設定値は以下の意味を持ちます。
  • factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory" #dbcpのコネクションプーリングを使用する
  • initialSize="5" #プールの初期状態に確保するコネクション数
  • minIdle="1" #未使用の接続を保持する最小数
  • maxIdle="10" #未使用の接続を保持する最大数
  • maxActive="50" #最大接続数
  • maxWait="5000" #接続が取得出来るまでwaitする秒数
  • validationQuery="SELECT 1" #コネクションの有効性検証用クエリ
  • validationQueryTimeout="5" #検証クエリが失敗した場合に、再接続するまでの秒数
  • testOnBorrow="true" #trueの場合、プールからコネクションを取得する際に検証を行う
  • testWhileIdle="true" #trueに設定すると、監視スレッドがアイドル状態のコネクションの生存確認を行う際に、有効性確認も行う。検証に失敗した場合、プールから削除する。
  • timeBetweenEvictionRunsMillis="1800000" #指定した間隔で監視スレッドを起動する。監視スレッドはコネクションの生存確認を行う。デフォルトは 30 分以上アイドル状態のコネクションをプールから削除する。(設定値は30分)
  • numTestsPerEvictionRun="5" #プール無いで生存を確認するアイドル接続数
  • minEvictableIdleTimeMillis="86400000" #アイドル接続するミリ秒数 (設定値は24時間)
  • removeAbandoned="true" #クローズ漏れコネクションの自動切断
  • removeAbandonedTimeout="600" #クローズ漏れとみなすまでの秒数 (設定値は10分)


これら以外に設定することを悩んだパラメータがあります。


  • preparedStatementのキャッシュ(非採用)
poolPreparedStatements="false"がデフォルトです。設定しませんでした。理由は、統計情報によりキャッシュクエリを保持するため、有効になるかどうかは博打を打つようなもので、緊急の手段として用いるものです。

これで、DBCPによるコネクションプーリングが出来ました。最大接続数はアプリケーションの特性に合わせて決定すべきです。


続けて、表側のtomcatの設定をします。

その前に、JVMのメモリ領域について整理しましょう。

JVMのメモリ領域の種類

○ヒープ
New領域:インスタンス化されたオブジェクトの情報
Old領域:寿命の長いオブジェクトの情報

○非ヒープ
Permanent領域:JVMにロードされたクラスやメソッドの情報(基本GC対象外だが、ユーザ定義のクラスローダーが存在する場合は、ロード情報はGCされる。)

□New領域
Eden領域:オブジェクトがインスタンス化されてはじめて配置される領域
From領域:Scavenge GC時のオブジェクト退避領域1
To領域:Scavenge GC時のオブジェクト退避領域2

FromとToを合わせてSurvivor領域と呼ぶことがあります。

□GC
Scavenge GC:New領域のみを対象とするGC。比較的短時間。
 トリガーはEden領域が一杯になった時。
 Scavenge GCが実行されたら、不要なオブジェクトは破棄、必要なオブジェクトはTo領域へ。
 既にToに入っているオブジェクトはFrom領域へ、FromからはToへ移動する。
 To、From間の移動がMaxTenuringThreashold(default 32)を超えると、Old領域へ移動。

Full GC:Old領域及びPermanent領域を対象とするGC。処理時間は長い。
 トリガーはOldまたはPermanent領域が不足した時。実施中はシステムがほぼ停止状態になる。

OldとPermanetが肥大化しないように注意する。
  • オブジェクトをあまり使いまわさないことや、新しいオブジェクトを大量に使用するな、Newを大きくして、Oldに移動しにくくなるようにする。
  • Permanent領域については、staticメソッドを多用しないこと。

サーバーモード

○起動サーバモード
起動時に -server オプションを指定する。:サーバモードを有効化する。
 サーバーモード:プログラム実行速度が最大化するように調整される。
 クライアントモード:起動時間を退縮し、メモリサイズを縮小するように調整される。

○Permanent領域
-XX:MaxPermSize:Permanent領域の最大値。
-XX:PermSize:Permanent領域の初期値、MaxPermSizeと同じ値を設定。

Permanentサイズの設定は、OutOfMemoryエラー対策になる。デフォルトは64MBと小さいので、
必ず設定すること。

○New、Old領域
-XX:NewRatio:New領域とOld領域の比を設定する、サーバVMの場合、デフォルトが 2 である。つまり、New:Old = 1:2 となる。

-XX:SurvivorRatio:EdenとSurvivorの比。デフォルトはEden:8、From:1、To:1 である。


初期設定は以下。負荷試験によって変更すると良い。

-Xms2048m -Xmx2048m -XX:NewRatio=2 -XX:SurvivorRatio=8 -XX:PermSize=512m -XX:MaxPermSize=512m -server

0 件のコメント:

コメントを投稿