さくらのVPS セットアップ備忘録 (6) - TomcatからMySQLへのコネクションが激遅なのに対処

Tomcatのstart/stop/restartにエライ時間がかかるという問題に2日間悩みました。

DeployしているウェブアプリではMySQLに接続しているのですが、その初回の接続処理に数分単位の時間がかかってしまっています。その調査で


$jps -l
4722 org.apache.catalina.startup.Bootstrap
4751 sun.tools.jps.Jps
$jstack 4722

でcatalina.outにスタックトレースを吐き出させて調べたところ、start時にはjava.net.PlainSocketImpl.initProto(Native Method)、stop時にはjava.net.PlainSocketImpl.socketAccept(Native Method)で長時間待たされています。待たされる時間がだいたい一定(3分ぐらい)なので、何らかのタイムアウト処理を待っているような感じ・・・という所までは想像できたのですが、どうにも心当たりがありません。

いろいろググリながらさまよい続け、最終的にヒントになったのは"opening Socket take long time java6"での検索結果。あっ!そうか!ホスト名でSocketを開く際、IPv6アドレスに接続しようとしていたのか!で、タイムアウトした時点でIPv4に行く、と。

タネがわかれば対策は簡単です。Tomcatに使うJavaVMのIPv6対応を抑制します。


$vi /usr/local/tomcat/bin/catalina.sh

...
JAVA_OPTS="$JAVA_OPTS -Djava.net.preferIPv4Stack=true"
...

ビンゴ!これで普通にTomcat再起動できるようになりました。