基本チューニング
iDempiereはパラメータ設定を変更する事により、画面の表示速度を向上させたり、サーバー側の処理を軽減させる事ができます。iDempiereの初期状態が必ずしもパフォーマンス的に最適なパラメーター設定になっているとは限りませんので、特に下記の項目に注意してパラメータ設定を見直して下さい。
ひとつひとつの設定変更はとても小さな効果しかありませんが、チリも積もれば山となるで、総合してパラメータ設定を見直す事により、体感できるレベルでパフォーマンスを向上させる事も可能です。
【補足説明】日本語を主言語にする際は慎重な判断をして下さい。
2016年8月現在、日本語を主言語にする事によりいくつかの不具合が発見されています。そのため、日本語を主言語にする際は慎重な判断をして下さい。
【補足説明】JPiereではバージョン3.1より上記のパラメーター設定を見直して最適化しています。
オープンソースのERP iDempiereの日本商習慣対応ディストリビューションでプラグイン群であるJPiere(ジェイピエール)ではバージョン3.1より、上記で紹介しているパラメータ設定を見直し、最適化しています。ぜひ、iDempiereの初期設定の状態と比較して、パフォーマンスの違いを体感して下さい。
詳しくは"JPiereのパフォーマンス改善への取り組み"を参照して下さい。
JVMの起動には、クライアントモードとサーバーモードの2種類の起動モードがあります。クライアントモードでは起動時間を早くしメモリサイズを縮小するように調整されます。サーバーモードでは、プログラムの実行速度が最大になるように設計されています。iDempiereでは当然サーバーモードで起動すべきです。
JVMの起動モードの確認
どちらのモードで起動されているかは、「java -version」コマンドで確認する事ができます。
$java -version
java version "1.6.0_27"
OpenJDK Runtime Environment (IcedTea6 1.12.6) (6b27-1.12.6-1ubuntu0.12.04.2)
OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode)
クライアントモード
起動時間を短縮し、メモリサイズを縮小するように調整されます。VM起動時に「-client」オプションを付けて実行します。
サーバーモード
プログラム実行速度が最大になるように設計されている。VM起動時に「-server」オプションを付けて実行します。
iDempiereのServer起動時にJavaのオプションを指定してJavaのヒープ領域のチューニングを行います。使用するJVMによっていは初期値が小さく設定されており、iDempiereのパフォーマンス的に好ましくない設定になっている可能性があります。
Linux環境でiDempiereを”./idempiere-server.sh”で起動する場合には、直接idempiere-server.shに記述されている内容がオプション指定に使用されます。
idempiere-server.sh
◆初期設定
$JAVA -Dosgi.compatibility.bootdelegation=true -Dosgi.noShutdown=true -Dosgi.framework.activeThreadType=normal -XX:MaxPermSize=192m -jar plugins/org.eclipse.equinox.launcher_1.*.jar -console 12612 -application org.adempiere.server.application
◆チューニング例
$JAVA -Dosgi.compatibility.bootdelegation=true -Dosgi.noShutdown=true -Dosgi.framework.activeThreadType=normal -Xms1536m -Xmx1536m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=256m -XX:MaxPermSize=256m -jar plugins/org.eclipse.equinox.launcher_1.*.jar -console 12612 -application org.adempiere.server.application
赤字の部分がオプション指定になります。上記はあくまでも一例ですので、環境に応じて適切な設定を行って下さい。
【技術情報】Java8の「-XX:PermSize」と「-XX:MaxPermSize」
Java(HotSpot)8から「-XX:PermSize」と「-XX:MaxPermSize」は無視されるようになりました。そして、代わりのパラメータ設定として、「-XX:MetaspaceSize」と「-XX:MaxMetaspaceSize」が追加されています。詳しくは下記のサイトが参考になるかと思います。
パラメータの意味
◆-Xms
ヒープ全体(New領域+Old領域)のメモリ割り当ての初期値を指定します。たとえば、割り当てるメモリの初期値を128MBに設定する場合、”-Xms128m”と指定します。メモリ割り当ての初期値のデフォルト値は、JDK/JRE、OS、実行モード(32ビットor64ビット)などの環境により異なりますが、概ねJDK/JRE6では、5MB~10MBに設定されているようです。
◆-Xmx
ヒープ全体(New領域+Old領域)のメモリ割り当ての最大値を指定します。たとえば、割り当てるメモリの最大値を256MBに設定する場合、”-Xmx256m”と指定します。メモリ割り当ての最大値のデフォルト値は、JDK/JRE、OS、実行モード(32ビットor64ビット)などの環境により異なりますが、概ねJDK/JRE6では、64MB~84MBに設定されているようです。
◆-XX:NewSize
New世代領域のヒープサイズを指定します。たとえば、New世代領域のヒープサイズを128MBに設定する場合、”-XX:NewSize=128m”と指定します。
◆-XX:MaxNewSize
New世代領域の最大ヒープサイズを設定します。 たとえば、New世代領域の最大ヒープサイズを128MBに設定する場合、”-XX:MaxNewSize=128m”と指定します。
◆-XX:PermSize
Permanent世代領域の初期値を指定します。たとえば、Permanent世代領域の初期値を32MBに設定する場合、”-XX:PermSize=32m”と指定します。Permanent世代領域の初期値のデフォルト値は、JDK/JRE、OS、実行モード(32ビットor64ビット)などの環境により異なりますが、概ねJDK/JRE6では、12MB~20MBに設定されているようです。
◆-XX:MaxPermSize
Permanent世代領域の最大値を指定します。 たとえば、Permanent世代領域の最大値を128MBに設定する場合、”-XX:MaxPermSize=128m”と指定します。Permanent世代領域の最大値のデフォルト値は、JDK/JRE、OS、実行モード(32ビットor64ビット)などの環境により異なりますが、概ねJDK/JRE6では、64MB~84MBに設定されているようです。
- KB(キロバイト)を指定する場合:”k”または”K”
- MB(メガバイト)を指定する場合:”m”または”M”
設定が反映されている事をコマンドラインで確認する
◆Linuxでの確認
Ubuntu12.4LTSでの確認
$sudo jmap -heap <PID>
上記コマンドを実行すると、Heap Configurationとして、各種値が表示されますので、設定が反映されているかどうか確認する事ができます。※PIDは、psコマンド(例:ps -alx)を使用して一覧表示されるプロセスの「COMMAND」の項目に、"java -Dosgi.compatiblity.bootdel…"と表示されているプロセスのIDになります。もしくは、jpsコマンド(例:sudo jps -mlvV)を使用して確認して下さい。
設定が反映されている事をiDempiereの画面上で確認する
行った設定をiDempiereの画面上でも確認する事ができます。
PostgreSQLのチューニングについては、最低限でも"shared_buffers"と"work_mem"の設定は意識していおた方が良いと思います。
共有バッファ(shared_buffers)
PostgreSQLのshared_buffesの初期値はかなり少なめに設定されているようです。この値は、サーバー構築後に適切な値に設定して下さい。よく「実メモリの20%~30%」とするのが一つの目安として言われています。
shared_buffersの設定は、postgresql.confで行います。
Linux の場合は /proc/sys/kernel/shmmax に shared_buffers で使用する共有メモリサイズより大きい値を設定する必要があります。
ワークメモリー(work_mem)
work_memはサイズが大きい方が好ましいとされていますが、大きくしすぎるとpostgresプロセスが多くなった場合にメモリ領域を圧迫してスワップを発生させる可能性があります。適切な値を設定してください。