BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース Netflixが仮想スレッドを採用:パフォーマンスと落とし穴に関するケーススタディ

Netflixが仮想スレッドを採用:パフォーマンスと落とし穴に関するケーススタディ

原文リンク(2024-08-05)

長年Javaを採用してきたNetflixは、最近Java 21にアップグレードした。同社は現在、JEP 439で導入された世代ZGCや、JEP 444で導入された仮想スレッドなどの新機能を活用して、同社の広範なマイクロサービス群全体のパフォーマンスを改善している。高スループットの並行アプリケーション向けに設計された仮想スレッドは、初期には有望視されていたが、実際のシナリオでは独自の課題ももたらした。

Netflix Tech Blogの最近の投稿で、JVMエコシステム・チームは仮想スレッドの経験から得た洞察、特にサービスでタイムアウトが発生してインスタンスがハングする問題について共有した。この問題は、仮想スレッドとブロッキング処理およびOSスレッドの可用性との相互作用に関連しており、その結果、SpringBootベースのアプリケーションでデッドロックのような状況が発生した。

Netflixのエンジニアは、SpringBoot 3とTomcatを組み込んだJava 21上で動作するサービスにおいて、断続的なタイムアウトと応答しないインスタンスを観測した。JVMインスタンスはアクティブなままであるにもかかわらず、トラフィックの配信を停止し、closeWait状態で立ち往生するソケットが大幅に増加した。この状態は、リモート側がTCPコネクションを閉じたが、ローカル側はまだ閉じておらず、ソケットが待機状態のままになっている場合に発生する。これについての詳細は、RFC 793の用語セクションに記載されている。

初期の診断では、従来のスレッドダンプには表示されなかったものの、仮想スレッドがこの問題に関与していることが示唆された。jcmd Thread.dump_to_fileを使用して、チームは何千もの「空白」の仮想スレッドを発見した。この問題はTomcatのリクエスト処理に起因しており、新しい仮想スレッドが作成されたが、OSスレッドが利用できないためにスケジューリングできなかった。

#119821 ""  virtual#119820 ""  virtual#119823 ""  virtual#120847 ""  virtual#119822 ""  virtual...

解析の結果、Tomcatの仮想スレッド・エグゼキュータがリクエストごとにスレッドを生成していたが、これらのスレッドはロックを待機して停止していたことが判明した。具体的には、ForkJoinPoolで利用可能なOSスレッドの数が限られているため、同期ブロック内のブロッキング操作によってスレッドがOSスレッドに固定されていた。

この問題は古典的な古典的なデッドロック・シナリオに起因するもので、必要なロックが他の仮想スレッドに保持され、利用可能なすべてのOSスレッドに固定されているため、仮想スレッドを続行できないというものだった。このため、新しい仮想スレッドのスケジューリングができず、事実上アプリケーションが停止してしまう。

この問題を解決するため、NetflixのJVMエコシステム・チームはヒープ・ダンプを使用してロックの状態を検査し、どのスレッドもロックを所有していないにもかかわらず、ロックを待機しているスレッドが処理を続行できないことを確認した。これは一時的な状態であり、解決されるはずだったが、代わりにデッドロックのような状況を引き起こしていた。

チームは根本原因を特定し、今後同様の問題が発生しないよう、再現可能なテストケースを開発した。Java 21の仮想スレッドは、オーバーヘッドを削減することでパフォーマンスを向上させる可能性を示しているが、このケースは、既存のスレッド・モデルやロック・メカニズムとの相互作用を理解することの重要性を浮き彫りにしている。

Netflixの調査結果に加えて、InfoQに関する最近のケーススタディでも、仮想スレッドの実際的な課題と利点、特に並行作業負荷が大きいシナリオについて掘り下げている。この研究は、仮想スレッドを本番システムに統合する際には、小さなアーキテクチャの詳細であってもパフォーマンスに大きな影響を及ぼす可能性があるため、慎重な検討とテストが必要であることを強調している。

仮想スレッドに加え、Netflixの世代別ZGCの採用も、システムの最適化において重要な役割を果たしていることは、最近の記事の1つで述べたとおりだ。ZGCは、ヒープサイズが大きくなっても低い休止時間を維持する能力を持ち、ガベージコレクションのオーバーヘッドを削減し、応答性を向上させることで、Netflixのアプリケーションパフォーマンスを大幅に改善した。世代別ZGCの詳細については、このInfoQニュースをご覧頂きたい。

Netflixはまた、Atlas Streaming Evalプラットフォームを活用した堅牢なアラートシステムを備えており、これらの問題の特定と診断に不可欠だった。リアルタイムの監視とアラートを改善するために設計されたこのシステムにより、チームは問題のある状態のインスタンスをキャッチし、遡及分析のための重要なデータを提供できた。

課題にもかかわらず、Netflixは仮想スレッドの将来について楽観的であり、今後のJavaリリースでのさらなる改善、特にロッキング・プリミティブとの統合の課題への対処を期待している。このケーススタディは、パフォーマンス・エンジニアや開発者がアプリケーションで仮想スレッドを検討する際の貴重な事例となる。

作者について

この記事に星をつける

おすすめ度
スタイル

BT