日々常々

ふつうのプログラマがあたりまえにしたいこと。

Tomcat6とOpenJDKとCentOSと

引き続きServersMan@VPSについて。概ね機嫌よく使っています。とは言っても、環境設定が中心というか、初期化ばっかりやっているのですが。

初期化してみよう

MyDTIからログインして、契約中サービス→確認・変更→各種初期化とボタンを押していくと、サーバの初期化が出てきます。そこでOSとパッケージを選らんでサーバの初期化ボタンを押すだけ。手軽なもんなので、体当たり的に設定をかえたりしています。シンプルセットへの初期化は5分前後で終わりました。早い。
エンジニアセットからシンプルセットに変えても、またエンジニアセットにすれば元通りになります。シンプルセットにすると一旦消えるサーバ管理ツールとかもちゃんと戻りました。

シンプルセットとJVM

前回はよく判らなかったので、Standardプランのエンジニアセットにしていたのですが、よく考えると用途が限られているので、色々あるよりも無い方がいいと思いました。そう思ってしまったので、シンプルセットに初期化することにしました。
エンジニアセットだとHotSpot*1が入っているのですが、シンプルセットには入っていません。自分でインストールしなければならないのですが、yumでHotSpotは出て来てくれません。ちょっと調べてみたら少し手間そうだったのと、いい機会なのでOpenJDKを触ってみることにします。OpenJDKは特に設定とか無くインストールできました。それから再びTomcat6のインストール。エンジニアセットだとTomcat5が最初から入っていたのですが、Tomcat6を混在させても特に問題なく動かせました。勿論片方ずつ。今回はTomcat5は入っていないので特に気にしない感じで。

OpenJDKでのTomcat6の起動と停止

OpenJDKとTomcat6をインストールしたので、Tomcat6を起動します。特に問題なさそうです。起動したし、とりあえず停止。問題ありそうです。

# service tomcat6 start
Starting tomcat6:                                          [  OK  ]
# service tomcat6 stop
Stopping tomcat6:                                          [FAILED]
#

なんだよーって気分です。投げやりツイートするくらい。エンジニアセットで動かしてたときは普通に起動も終了も出来ていたので、何かしらの環境不備かもしれません。色々調べてみて、ホスト名が未設定だと云々とかあったのですが、それは無関係でした。こういう問題が発生したときは、とりあえず問題の切り分けです。前との違いを列挙し、それらをひとつひとつ潰していきます。*2

  • 環境が違う:エンジニアセットとシンプルセット(設定も色々違う)
  • JVMが違う:HotSpotとOpenJDK

シンプルセット→エンジニアセットの変更に興味があったことも手伝って、さくっとサーバの初期化をすることにしました。色々作業した後では初期化するのも躊躇しそうなので、今のうちにやりまくっておこうと言う作戦です。

体当たり調査

と、言うことでエンジニアセットに変更。10分弱で出来ました。初期化完了後、Tomcat6のインストールを行い、起動/停止を行ってみます。問題なし。ではOpenJDKをインストールし、Tomcat6の起動/停止をすると、同様に失敗しました。つまるところOpenJDKを使用した場合の問題と当たりをつけます。次にOpenJDKでTomcat5の起動/停止をしてみましたが、これは成功。もちろんHotSpotでTomcat5の起動/停止は成功しました。この過程でJavaの切り替えのコマンドを知ったのでメモ。インストールしているJavaの一覧が表示され、振られている番号を入力するだけで切り替えられます。便利。

# update-alternatives --config java

首を捻りながら、よくよく起動/停止時のスクリプトを見ていると、どうも起動時だけでなく終了時もJavaVMを起動しているみたい。起動の時は兎も角、停止の時に別口で起動しているなんてしらず、「なんだと?」と言う感じでした。おっかなびっくり、OpenJDKで起動したTomcat6をHotSpotで停止してみると、停止しました。また、HotSpotで起動したTomcat6をOpenJDKで停止しようとした際も失敗しました。これで焦点がOpenJDKによる停止に絞られます。

ログを見る

「体当たりしていないでいい加減ログ見ろ」と脳みそが囁いて来たので*3、仕方なくログを開く事にしました。ログは /usr/share/tomcat6/logs からいけましたのでそれで。眺めると、明らかに怪しげなものがあります。

Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.

tailで観察しながら停止してみると、ぴったりこれが出ました。停止時のJVMが起動できずに失敗になっていると言うわけです。初期設定のまま動かしている私も悪いのかもしれませんが、Tomcat6ってそんなメモリ食うものなのかなーと思いながら、freeで使用量を確認しながらやてみました。

# free
             total       used       free     shared    buffers     cached
Mem:       1048576      18656    1029920          0          0          0
-/+ buffers/cache:      18656    1029920
Swap:            0          0          0
# service tomcat6 start
Starting tomcat6:                                          [  OK  ]
# free
             total       used       free     shared    buffers     cached
Mem:       1048576     662000     386576          0          0          0
-/+ buffers/cache:     662000     386576
Swap:            0          0          0
# service tomcat6 stop
Stopping tomcat6:                                          [FAILED]

見た感じ、512MBと言う感じでしょうか。ServersMan@VPSのStandardプランはメモリ最大1GBですが、これはあくまで最大。保証サイズは512MBになります。さすがにTomcat6だけで512MB食われると厳しいものがあるなーとか思いながら、ふとJVMを起動してみました。

# java -version
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.

さすがに驚きました。Version表示すら出来ません。そりゃ停止もできませんわ。と言うことで、JAVA_OPTSに"-Xmx128m"とか入れて停止。これで素直に停止してくれました。

OpenJDKの初期メモリサイズがどうなっているのかはとりあえず置いておきます。Tomcat6自体はメモリ馬鹿食いするわけでもなく、128MBでも十分動いています。Tomcatの停止に失敗した場合は、停止時のメモリサイズを指定してあげればうまくいくかもしれませんよ的な締めにしておこうと思います。

*1:SunのJavaって言い方で良いのかな

*2:実はログ見れば一発だったのは秘密です。

*3:契機は"寝ておきたら"です。tweetの時間もそんな感じです。