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

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

829e112d84c7c719c123d52b69fba5f0?s=128

Hiroki Matsumoto

November 09, 2019
Tweet

Transcript

  1. GraalVM Native Imageが 見せた未来

  2. 自己紹介 松本 宏紀 ( まつもと ひろき ) • 株式会社ブロードリーフ 基盤開発部

    チーフ・アーキテクト • Kubernetes Sapporo for Beginners主催者。 • オフショアラボ・チームリーダー • デブサミ2019「Spring Bootでマイクロサービス作って苦労したお話」登壇 • Google Cloud Next ‘19 in Tokyo 「大規模エンタープライズ システムをマイクロ サービスで刷新。そ の開発プロセス再定義まで道のり」登壇 Twitter :@hirokimatsumo13
  3. GraalVM Native Imageで、 CPU、Memoryリソースの割当てを削減できる Javaでも小さな・疎結合なサービスを 開発しやすくなる。

  4. Cassandra Elasticsearch Kafka + Zookeeper ( broker ) Kafka Publisher

    ( Cassandra Trigger) Kafka Consumer データの蓄積 データの変更イベント配信 データの変更イベント管理 データの変更イベント受信 データの柔軟検索 背景
  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
  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
  7. ローカルPCで動かすの辛くなる。 バックグラウンドの仕組みだけで、 CPU: 3,000m、Mem: 4.3Gi必要になる。 (一番メモリ使っているのはChromeだけど…)

  8. Javaで頑張りたい

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

  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/
  11. GraalVM+Quarkusで 快適Javaライフを試してみる。

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

  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を利用。
  14. 開発 VSCodeでごにょごにょ開発する・・・。

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

  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
  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は未サポートだったりトライ&エラーがまだ 必要な段階。
  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なので調整すればスループットは上がる。
  19. ローカルPCで動かすの辛くなる。 バックグラウンドの仕組みだけで、 CPU: 3,000m、Mem: 4.3Gi CPU: 1,900m、Mem: 3.5Gi 必要になる。 (

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

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