03/07(木) は「OCHaCafe#3 - JDK開発者が語るMicroservicesなJavaアプリケーション」に参加してきました。
会場は 日本オラクル株式会社 さんのカフェスペース。
外は雨だったんですが、そんな事を忘れてしまうくらい、静かできれいなスペースです。 何度か来ていますが、毎回「こんなスペースが会社にあったら入り浸るよな。。。」と思っちゃいます。 この写真を見てそう思った人は応募してみるといいかもしれません(募集しているのかな?)
目次
OCHaCafe について
1回目に参加した時の参加報告がありますので、こちらもどうぞ。
内容
今回のテーマは「MicroservicesなJavaアプリケーション」。 それをを実現するためにDockerコンテナでJavaを使おうということで OpenJDK Author でもあるOracleの伊藤さんから、 昨年サンフランシスコで開催されたOracle Code One San Francisco で講演された「Java in a World of Containers」の内容の日本語版として
- OpenJDK コミュニティが行ってきたコンテナに対する取り組み
- 現在開発中であるProject Portola
を紹介していただきました。
尚、「Java in a World of Containers」のオリジナルの資料は多分これです。
www.slideshare.net
当日のツイートも既にトゥギャられていますので、雰囲気を知りたい方はこちらも是非。
最初から飲み物が提供されていて、この勉強会の「ゆるい雰囲気の中ガチな勉強をする」というのが個人的には大好きです。 しかも今回は飲み物の選択がヤバイ(笑)
Java in the World of Container
いとうちひろ さん(Oracle Technologist, OpenJDK Author)
www.slideshare.net
今回のお話は米OracleのDavid Buckさんの講演資料を元にされていますが、かなり補足情報を入れて(スライド枚数が倍)分かりやすく解説をしていただきました。 ということで、内容については自分のツイートを拾いながらという形で。
前半戦
コンテナの世界でのJava(Java in the World of Container)
Javaは結構更新が頻繁なのでコンテナ使うと面倒くさそうというイメージだったけど、他の人はイメージサイズがでかいとか、そういう理由なのか。
— kabukawa (@kabukawa) March 7, 2019
なるほどー。
#ochacafe
Javaに限らず、サンドボックスで動く言語は、必要なものが多くなるのででかくなりがちな印象。
— kabukawa (@kabukawa) March 7, 2019
#ochacafe
で、本題。
コンテナの世界で期待されるのは
Javaはどうか?
- 管理付きランタイム・⾔語
- ハードや OS に依存せず
- JVM によって保証されたセキュリティと安全性
- 信頼性:互換性は設計⽬標
- 可搬性:実⾏環境が変更されても、JVM が安定した運⽤を保つ
- 豊富なエコシステム
- コンテナの利用なら Java の特徴は理想的
コンテナもJavaも考え方の根本にあるものはあまり違いがないと思っているので、折り合いの付け方が大事だと思っている。
— kabukawa (@kabukawa) March 7, 2019
#ochacafe
休憩
今回は雨で開始が10分位ずれたこともあり、ここで早めにブレイクして食べ物をいただけることに。 これも毎回のことですが、食べ物はどれもメチャ美味しいです。
ブレイク中。 #ochacafe pic.twitter.com/8kFn9lAe67
— kabukawa (@kabukawa) March 7, 2019
食べログ載ってたら文句なしに満点なやつや。 #ochacafe pic.twitter.com/TPzukTy3d8
— kabukawa (@kabukawa) March 7, 2019
なんか写真だけ見ると「勉強しているのかよ!」みたいに思われそうですが、勉強の方はガチですよ、まじで。
後半戦
- Docker + Java 9。
何も考えずに作るとDockerイメージが巨大になりがち。
- 229MB OS のベースイメージ
- 343MB の JDK
ただし、すべてのものが必要なわけではないので、使わないものを削減すればサイズを小さくできるが、モジュールには依存関係が有る。
Java SEモジュール依存関係
Javaモジュール依存関係 #ochacafe pic.twitter.com/KwpkeN82t3
— kabukawa (@kabukawa) March 7, 2019
カスタム JRE とモジュール
jigsawでモジュール化を進めたからこそできるサイズ削減。
— kabukawa (@kabukawa) March 7, 2019
昔は小さかったから考えなくてよかったけど、機能が増えて大きくなってきたから、こういう機能は必要だよね。途中で諦めず、進めたのはすごかったし、こうしてコンテナ化するときにも必要なことなので良かった。
#ochacafe
カスタムの JRE を⽣成するツールが標準で用意されている。
jlinkとjdeps
jlinkとjdeps。そんなコマンドがあるのか。 #ochacafe pic.twitter.com/RyDWtI9MGK
— kabukawa (@kabukawa) March 7, 2019
jdepsで依存関係を確認し、jlinkで最小構成のカスタムJREを生成する、という感じの流れでしょうか。 ぐぐってみると、使っている(依存している)モジュールが分かっているならjdeps使わないでも大丈夫、という意見も有るようですが、動かないで困るのは自分なのでjdepsで確認したものがjlinkで生成したものに含まれなければ、手動で追加する、という感じになるのかな、たぶん。
カスタムJREのDockerイメージを作成する
Multi Stageを利用し、カスタムJREのDockerイメージを作成 #ochacafe pic.twitter.com/AxadKVUN2b
— kabukawa (@kabukawa) March 7, 2019
JREサイズの最適化と削減結果
サイズ最適化前と最適化効果 #ochacafe pic.twitter.com/9s7nSkSK2C
— kabukawa (@kabukawa) March 7, 2019
更にOS部分をOracle LinuxSlimにすると更に削減
更にOS部分をOrscle LinuxSlimにすると更に削減 #ochacafe pic.twitter.com/ybwnbcrOhU
— kabukawa (@kabukawa) March 7, 2019
OpenJDK Project “Portola”
OSをAlpineLinuxに変えると
更にAlpineLinuxに変えると #ochacafe pic.twitter.com/5vYIxgiXNg
— kabukawa (@kabukawa) March 7, 2019
JVMも見てみると、使わないと思われるものも結構含まれている。
JVMのサイズ #ochacafe pic.twitter.com/oGyOLJY0Dm
— kabukawa (@kabukawa) March 7, 2019
更にその部分も最適化すると、、、
Minimulなイメージだと、、、 #ochacafe pic.twitter.com/shnYizhpOL
— kabukawa (@kabukawa) March 7, 2019
Class Data Sharing
更にランタイムとか共有すると、、、 #ochacafe pic.twitter.com/LPyR2riLtN
— kabukawa (@kabukawa) March 7, 2019
サイズ削減やクラスファイル共有の効果
- 読み込むものが小さくなることで、起動時間が短縮されるなどの効果が出ることも有る。
サイズ削減やクラスファイル共有の効果 #ochacafe pic.twitter.com/fVntohfi1B
— kabukawa (@kabukawa) March 7, 2019
Javaが提供するDocker用の機能
詳しくは以下を参照。
Docker ⽤の改善
- JDK-8146115: Docker container detection and resource configuration usage (jdk8, jdk10+)
- JDK-8186248: More flexible, percentage based heap sizing flags (jdk10+)
- JDK-8179498: Namespace aware attach (jdk10+)
- JDK-8193710: Docker container aware jcmd (jdk11+)
- JDK-8203357: JDK internal Container Metrics API (jdk11+) 51
コンテナのための機能、色々用意されているんだな。
— kabukawa (@kabukawa) March 7, 2019
全然知らなかった。
#ochacafe
まとめ
- デフォルトのままのイメージは⼤きい
- JDK 11: 229MB + 300MB = 529MB
- サイズを極点に減らすことが可能
- JVM を含む HelloWorld は 38MB 未満のイメージでデプロイ出来る
- Class Data Sharing で複数の JVM や docker コンテナでクラスのデータを共⽤できる
新機能など
- [新機能]:cgroup 制限を守るための機能
- CPUs: --cpuset-cpus, --cpus, --cpu-shares, --cpu-quota
- Memory: -m
- [新機能]:“percentage” でヒープサイズを指定する
- -XX:{Initial,Min,Max}RAMPercentage
- [新機能]:サービサビリティツールがコンテナ対応になる
- jps, jcmd, …
- これからさらに新しい機能などが出る⾒込み
懇親会
懇親会はその日の内容を振り返ったりしながら、スピーカーに質問したり参加者同士で話をしたり。
既に食べたり飲んだりは終わっているので、のんびり話をしながら振り返りをするのは結構楽しかったです。 (と書いてから、スピーカーやスタッフの皆さんはいつ食べたり飲んだりしているんだろう、ということが心配になってきた)
まとめ
今回はJavaの話ということで、Java 1.1から触っていた者としてはどれだけ変わっているんだろうという気持ちで参加しました。 実際、かなりの変化に「浦島太郎状態とはこの事か!」ということを感じたわけですが、逆に変わっていないところも再認識できましたし、色々勉強になりました。こうやって聞いた内容を振り返ってみると、分かっていなかったところとかも明らかになるし、そこまで含めて勉強会ですね。 そう考えると、資料が分かりやすく作られているのはこの勉強会で毎回感心するところなのですが、それに加えてすぐに資料を公開してくれたりというのも有り難いです。更に今回はTogetterでツイートまとめも作成されていて、どんどん改善されているなぁと思いました。
ということで、今回も参加できてとても有意義な時間を過ごすことができました。 内容もとても勉強になりました。
今回も、スピーカー、スタッフ、参加者の皆様、本当にありがとうございました!