Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Cloud Pub/Subのスレッドが多すぎる

このページはEnglishDeutschEspañolFrançaisItalianoPortuguêsでもご覧いただけます。

By Joshua FoxJul 5, 20201 min read
Joshua Fox

About Joshua Fox

Joshua Fox has been a software architect in innovative technology companies for 20 years. Now, he advises tech startups and growth companies on architecture and cost optimization for Google Cloud Platform and Amazon Web Services; also publishing articles, and speaking to cloud engineers.

He has a PhD from Harvard University and a BA in math from Brandeis.

My personal page

一般に、Javaで非アクティブなスレッドが多少余分にあっても問題にはなりません。しかし、リソースに制約のある環境や、すでに多くのスレッドを使用しているソフトウェアの場合、余分なスレッドが増えすぎるとシステムに過剰な負担がかかります。

Google Cloud PubSubは軽量さで知られる優れた非同期通信フレームワークです。ところが、Google PubSubのJavaクライアントを初めて使うと、常時稼働する60個のスレッドが生成されます(すべてのスレッドは Thread.getAllStackTraces().keySet() で確認できます)。これらの追加スレッドは、メッセージ配信に伴う非同期処理のために使われます。

スレッドが多すぎる

大量のメッセージを扱うpublisherにとっては有用なスレッド構成ですが、少量しか扱わないpublisherにとって60個は明らかに過剰です。

スレッド数を調整するAPIは公式のPubSub APIには含まれておらず、ドキュメントも整備されていない、かなり低レベルなものです。そこで、その実現方法を紹介します。

1. 以下のように setExecutorThreadCount を4(あるいは1)など小さな値に設定します。これだけでスレッド数を約40個削減できます。

2. それでも約20個の非アクティブなスレッドが残ります。これらは ajaaym 氏が GitHub で示している方法で削減できます(コードは以下)。

ここでは、PublisherGrpcTransportProviderManagedChannelBuilder を、シングルスレッドで共有する ExecutorProvider から生成します。こうすることで、PubSub Publisherのために追加されるスレッドは合計1つだけになります。

PerfectScale™ for Kubernetes

Ready to optimize?

Get your free Kubernetes savings analysis

Your cloud bill shouldn't be a mystery

Optimization, automation, expertise. In one platform.