Upgrade to Pro — share decks privately, control downloads, hide ads and more …

GraalVM Native Imageが 見せた未来/graalvm-native-image showed the future

GraalVM Native Imageが 見せた未来/graalvm-native-image showed the future

Hiroki Matsumoto

November 09, 2019
Tweet

More Decks by Hiroki Matsumoto

Other Decks in Technology

Transcript

  1. GraalVM Native Imageが
    見せた未来

    View full-size slide

  2. 自己紹介
    松本 宏紀 ( まつもと ひろき )
    ● 株式会社ブロードリーフ 基盤開発部 チーフ・アーキテクト
    ● Kubernetes Sapporo for Beginners主催者。
    ● オフショアラボ・チームリーダー
    ● デブサミ2019「Spring Bootでマイクロサービス作って苦労したお話」登壇
    ● Google Cloud Next ‘19 in Tokyo 「大規模エンタープライズ システムをマイクロ サービスで刷新。そ
    の開発プロセス再定義まで道のり」登壇
    Twitter :@hirokimatsumo13

    View full-size slide

  3. GraalVM Native Imageで、
    CPU、Memoryリソースの割当てを削減できる
    Javaでも小さな・疎結合なサービスを
    開発しやすくなる。

    View full-size slide

  4. Cassandra
    Elasticsearch
    Kafka + Zookeeper
    ( broker )
    Kafka Publisher
    ( Cassandra Trigger)
    Kafka Consumer
    データの蓄積
    データの変更イベント配信
    データの変更イベント管理
    データの変更イベント受信
    データの柔軟検索
    背景

    View full-size slide

  5. Cassandra
    Elasticsearch
    Kafka + Zookeeper
    ( broker )
    Kafka Publisher
    ( Cassandra Trigger)
    Kafka Consumer
    背景
    CPU: 500m、 Mem:1Gi
    CPU: 500m、 Mem:1.2Gi
    CPU: 300m、 Mem:300Mi
    CPU: 500m、 Mem:900Mi
    データの蓄積
    データの変更イベント配信
    データの変更イベント管理
    データの変更イベント受信
    データの柔軟検索
    合計 = CPU: 1,800m、Mem: 3.4Gi

    View full-size slide

  6. Cassandra
    Elasticsearch
    Kafka + Zookeeper
    ( broker )
    Kafka Publisher
    ( Cassandra Trigger)
    Kafka Consumer
    背景
    Kafka Consumer
    Elasticsearch
    Kafka Consumer
    Google Cloud
    Storage
    Kafka Consumer
    Web API
    データの利用用途が増えて5つconsumerが増える。
    Kafka Consumer
    Web API

    View full-size slide

  7. ローカルPCで動かすの辛くなる。
    バックグラウンドの仕組みだけで、
    CPU: 3,000m、Mem: 4.3Gi必要になる。
    (一番メモリ使っているのはChromeだけど…)

    View full-size slide

  8. Javaで頑張りたい

    View full-size slide

  9. GraalVM
    LLVMベースの言語(Java、JavaScript、Ruby、Python…)の多言語をサポー
    トする仮想マシン。
    GraalVM Native Imageは、JVMベースの言語(Java、Scala、Kotlin)を、ス
    タンドアロンの実行可能ファイルにコンパイルするもの。
    JavaVMの実行環境が不要。

    View full-size slide

  10. Quarkus
    KubernetesネイティブなGraalVM & OpenJDKで動作するJava Framework。
    Quarkus + GraalVM Quarkus + OpenJDK
    Traditional Cloud
    Native Stack
    Memory(RSS) Usage 13MB 74MB 140MB
    Boot Time 0.014sec 0.75sec 2.5Sec
    参考:https://quarkus.io/

    View full-size slide

  11. GraalVM+Quarkusで
    快適Javaライフを試してみる。

    View full-size slide

  12. 開発
    Quarkusのmavenプロジェクト雛形生成。
    $ mvn io.quarkus:quarkus-maven-plugin:0.21.2:create \
    -DprojectGroupId=${groupId} \
    -DprojectArtifactId=${artifactId}
    $

    View full-size slide

  13. 開発
    Elasticsearch、kafka周りの拡張のライブラリを追加。
    …Elasticsearch周りが無い。
    とりあえず、Elasticsearchの公式Java ライブラリをdependencyに追加する。
    # Quarkus拡張ライブラリ一覧確認
    $ mvn quarkus:list-extensions
    # Kafkaのライブラリ追加。
    $ mvn quarkus:add-extension -Dextensions="quarkus-kafka-client"
    # pom.xmlに直接 elasticsearch-rest-high-level-clientを追加。
    Reactive(MicroProfile) な方のKafkaは、
    複数件の一括処理ができないので、通常の
    kafkaを利用。

    View full-size slide

  14. 開発
    VSCodeでごにょごにょ開発する・・・。

    View full-size slide

  15. 開発
    JavaVM上で動作確認をする。
    $ mvn compile quarkus:dev

    View full-size slide

  16. 開発
    Native Imageを作って動作確認する。
    …動かない。
    $ ./mvnw clean package -U -Pnative -Dnative-image.docker-build=false
    $ docker build -f src/main/docker/Dockerfile.native -t $DOCKER_IMAGE .
    $ docker run -i --rm $DOCKER_IMAGE

    View full-size slide

  17. Native Imageへの壁
    参考:https://quarkus.io/guides/writing-native-applications-tips#native-in-extension
    ○ データクラスに、@RegisterForReflectionをつける。
    ObjectMapper#readValue(in,XXX.class)でエラーになる。
    ○ 3rd Partyライブラリが結構動かない。必要に応じてSubstituteで書き換えが必要。
    Elasticsearchもquarkus-elasticsearch-rest-client利用した。
    ○ native imageビルドする際、staticオプションをつけてもlibc周りは必要。
    scratchでは動かず。100MB程度のdocker image sizeになる。
    ○ Windows環境だとnative-image build on dockerが終わらない。
    Linux環境化でもnative-imageのビルド時間:4分程度。
    ○ ObjectOutputStream/ObjectInputStreamは未サポートだったりトライ&エラーがまだ
    必要な段階。

    View full-size slide

  18. 壁の向こう側
    Quarkus + GraalVM Spring Boot + OpenJDK
    Deployments Memory Limit 70MB 300MB
    Boot Time + Warm up 15秒 5分
    Throughput 25.4 message/sec 27.0 message/sec
    Kubernetes DeploymentsでCPU:limit = 100msの場合。
    ※Warm up…Elasticsearch index定義のjsonファイル400個の読み込み + kafkaへの接続。
    ※kafkaの1messageのサイズは平均5KB。pollするmax sizeが10なので調整すればスループットは上がる。

    View full-size slide

  19. ローカルPCで動かすの辛くなる。
    バックグラウンドの仕組みだけで、
    CPU: 3,000m、Mem: 4.3Gi
    CPU: 1,900m、Mem: 3.5Gi
    必要になる。
    ( ちょっと軽減された ☺ )

    View full-size slide

  20. 多くの分散サービスをJavaで開発している場
    合、インフラコストを大幅に削減できる未来
    を垣間見る事ができた。

    View full-size slide

  21. ご静聴ありがとうございました。

    View full-size slide