Raspberry Pi と Rundeck と JVM のパフォーマンス

ジョブスケジューラの Rundeck を Raspberry Pi で動かせるかどうかを実際にインストールして試してみました.また,OpenJDK と Oracle の Java SE でパフォーマンスに顕著な違いが見られたので,簡単にパフォーマンスを評価してみました.

環境

今回の検証に使用した環境を簡単にまとめます.

  • Raspberry Pi 3 Model B Rev 1.2
  • Raspbian 9.1 (stretch)
  • Rundeck 2.10.0
    • apt で https://rundeck.bintray.com/rundeck-deb から導入したもの

JVM の設定

Rundeck を実行する際に利用する JVM の設定は /etc/rundeck/profile に記述されています.デフォルトの設定は

-Xmx1024m -Xms256m -XX:MaxMetaspaceSize=256m -server

となっていますが,Raspberry Pi 3 はメモリが1GBしか搭載されていないので Xmx を 512MB に減らしました.

-Xmx512m -Xms256m -XX:MaxMetaspaceSize=256m -server

OpenJDK

OpenJDK は以下のように導入しました:

$ sudo apt install openjdk-8-jre-headless

バージョン情報は以下の通りです:

$ /usr/lib/jvm/java-8-openjdk-armhf/jre/bin/java -version
openjdk version "1.8.0_141"
OpenJDK Runtime Environment (build 1.8.0_141-8u141-b15-1~deb9u1-b15)
OpenJDK Zero VM (build 25.141-b15, interpreted mode)

Java SE

Oracle の Java SE は以下のように導入しました:

$ sudo apt install oracle-java8-jdk

バージョン情報は以下の通りです:

$ /usr/lib/jvm/jdk-8-oracle-arm32-vfp-hflt/jre/bin/java -version
java version "1.8.0_65"
Java(TM) SE Runtime Environment (build 1.8.0_65-b17)
Java HotSpot(TM) Client VM (build 25.65-b01, mixed mode)

OpenJDK と Java SE は sudo update-alternatives --config java を実行して切り替えられます.

パフォーマンスの測定

OpenJDK と Java SE でどれくらいパフォーマンスに違いがあるのかを簡単に測定してみました.

起動時間

Rundeck の起動にはそれなりの時間がかかるので,起動時間を測定しました.ここでの起動時間とは,sudo systemctl start rundeckd.service で Rundeck の起動を開始してから,Rundeck がポート 4440 で listen するまでの時間とします.結果は次の通りです:

  • OpenJDK: 15分7秒
  • Java SE: 1分49秒

トップページのレスポンス時間

Rundeck の起動が完了した後,トップページにアクセスした際のレスポンス時間を測定しました.ここでのレスポンス時間とは time curl -s -o /dev/null -L http://localhost:4440 を実行して得られる real の時間とします.2回目以降のアクセスではレスポンスが早くなる傾向があるため,連続して3回測定を行いました.結果は次の通りです:

  • OpenJDK
    • 1回目: 42.133秒
    • 2回目: 0.827秒
    • 3回目: 0.729秒
  • Java SE
    • 1回目: 4.234秒
    • 2回目: 0.207秒
    • 3回目: 0.195秒

注意

  • 今回の測定はそれぞれの処理系で1度ずつしか行っていません.
  • 測定の直前に OS の再起動を行い,キャッシュ等の影響を減らしています.

まとめ

Raspberry Pi においては OpenJDK を利用するより,Oracle の Java SE を利用する方が大幅にパフォーマンスが良いことが分かりました.ARM プラットフォームで Oracle の実装は OpenJDK に比べてかなりパフォーマンスが良いようです.(参考: Oracle Java on Raspberry PiComparing JVMs on ARM/Linux) x86系ではこれほどパフォーマンスに差がない気がしますが (未検証) これは Oracle が ARM 向けの最適化を頑張っているのか,OpenJDK が ARM に関心がないのかどちらなのでしょうか…? とにかく,Raspberry Pi では Oracle が嫌いとかライセンス的な部分が気にならない限り,Oracle の Java SE を使うのが良さそうです.

Raspberry Pi で Rundeck を使えるかというかという点については,Java SE を使って動作させれば,多少のもたつきは感じるものの利用できそうでした.どれくらいの数のジョブを追加できるかは,実際にもう少し運用してみないと分かりません.