Java

FishEye のチューニング

最近自宅サーバのファンが良く回ります。
top コマンドで調べてみると CPU 使用率が100%!!!
どうやら FishEye の Java プロセスが激しく動いているようです。
プロセス内のどのスレッドが CPU を使っているか調べるには・・・どうしたら良いのでしょう?Linux だと top -H -b で調べられるんですが、Mac OSX では -H -b オプションは効かないようです。

スレッドダンプと CPU 使用率の傾向をみると CPU 使用率が高いのはインデックスを作成している最中だけのようなのでひとまず無視することにしました。

続いて気になったのはプロセスサイズです。GCログから、ヒープサイズは 30mb もあれば十分なことがわかっていたので以下のように -Xmx38 と指定していました。

FISHEYE_OPTS="$FISHEYE_OPTS -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xmx38m -Xms38m -Xss180k -XX:MaxPermSize=120m"

しかしプロセスサイズは 300mb 近くに膨れあがっていました。パーマネント領域とネイティブ領域を考慮にいれても大きすぎです。
ps aux コマンドで確認してみるとなぜか最大ヒープサイズが 1024mb に設定されていました。なぜかFISHEYE_OPTSの設定が効いていません。

$ ps aux|grep java
yusukey 34261 91.8 12.5 1646800 163492 s000 R 12:51AM 0:46.93 /System/Library/Frameworks/JavaVM.framework/Home/bin/java -Xmx1024m -XX:MaxNewSize=128m -XX:MaxPermSize=256m -Dfisheye.library.path= -Dfisheye.inst=/Users/yusukey/server/fisheye -Djava.awt.headless=true -Djava.endorsed.dirs=/Users/yusukey/server/fisheye-2.0.6/lib/endorsed -jar /Users/yusukey/server/fisheye-2.0.6/fisheyeboot.jar start

起動スクリプトを追っていったところ、以下の行で FISHEYE_OPTS が上書きされていることがわかったのでコメントアウト。

FISHEYE_OPTS=$($JAVACMD -cp $FISHEYE_HOME/fisheyeboot.jar com.cenqua.fisheye.boot.OptsSetter)

続いて、以下のページを見て BlockSize パラメータを減らせばメモリフットプリントが減ることがわかりました。これはデフォルトの 400 から 100 に縮小。
Tuning FishEye – FishEye 2.0 – Atlassian Documentation – Confluence

そんなに負荷がかかるサービスではないのでスレッド数は少なくても良さそうですが、管理画面からはスレッド数を設定する項目が見つかりません。
config.xml のスキーマ、config.xsd を確認すると web-server 要素に指定できることがわかりました。デフォルトは最小1、最大20スレッドとなっているようです。

<xsd:complexType name=”webServerType”>
<xsd:all minOccurs=”1″>
<xsd:element name=”http” type=”fe:httpServerType” minOccurs=”0″ maxOccurs=”1″/>
<xsd:element name=”ajp13″ type=”fe:ajp13ServerType” minOccurs=”0″ maxOccurs=”1″/>
</xsd:all>
<xsd:attribute name=”site-url” type=”xsd:string” use=”optional”/>
<xsd:attribute name=”context” use=”optional” type=”xsd:string”/>

<xsd:attribute name=”min-threads” use=”optional” type=”xsd:nonNegativeInteger” default=”1″/>
<xsd:attribute name=”max-threads” use=”optional” type=”xsd:nonNegativeInteger” default=”20″/>
</xsd:complexType>

ざっくりと最小1スレッド、最大8スレッドとし、使っていない http ポートは削除、ajp13 ポートのみとしました。

<web-server context=”fisheye” min-threads=”1″ max-threads=”8″>

<ajp13 bind=”:8069″/></web-server>
<api enabled=”true”/>
<security allow-anon=”true” allow-cru-anon=”true”>
<usernames force-lowercase=”true”/><built-in>
<signup enabled=”false”/>
</built-in>

続いて、デフォルトでは HSQLDB を使っているようなので MySQL を使うように設定してみました。

$ ./mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 14605
Server version: 5.0.45 MySQL Community Server (GPL)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> create database fisheye206 character set utf8;
Query OK, 1 row affected (0.22 sec)

mysql> ^DBye

データベースを作成したら MySQL の JDBC ドライバは fisheye-2.0.6/lib/ 以下に配置 & FishEye 再起動。
そして FishEye > Admin > Database Configuration よりデータベースを設定。Test Connection > Save & Migrate Data でマイグレート完了。

この設定でだいぶメモリは節約できました。
ヒープサイズを大胆に減らしましたが、特に重くもなっていないので当面様子を見てみることにします。

関連記事:
Jira 4 へのアップグレード手順(バージョン 3.13.1 から) – 侍ズム
FishEye 2.0.6 のインストールとアップグレード – 侍ズム
Jira 3.13.1 へ FishEye プラグイン 2.3 をインストール
FishEye 1.6.3 のインストール – 侍ズム
Jira をバージョン 3.13.1 へアップデート
Jira をバージョン 3.12.3 へアップデート