フレンドリープールデザインでテイルレイテンシを改善する
ダイナミックスレッドプールを使ってアプリの待機時間を減らす新しいアプローチ。
― 1 分で読む
テールレイテンシーは多くのオンラインサービスにとって大事な指標だよ。高いレイテンシーは直接収益に影響するからね。今の複雑なマイクロサービス構成では、高いテールレイテンシーを経験する可能性が増える。これじゃユーザーも不満が溜まっちゃって、ビジネスを失うことにつながる。
テールレイテンシーに影響を与える大きな問題はCPUのオーバーコミットメントだね。これは、オペレーティングシステムのスレッドが使えるCPUの数を超えちゃうときに起こる、特に負荷が高いときに。これには二つの主な要因があって、一つはCPUの上限があるときに利用可能なCPUの数を過大評価しちゃうこと、もう一つは隣にあるアプリケーションのCPU使用量を考慮しないことだよ。
いろんなプログラミング言語には、利用可能なCPUの数を見つけるための解決策があるんだけど、これらの解決策がうまく連携しないこともあるんだ。開発者が使うべきCPUの数を簡単に見つけられるように、統一されたアプローチを作ることが大事だね。
隣のアプリケーションがテールレイテンシーにどう影響するかも調べたよ。新しいスレッドプールの設計である「フレンドリープール」を提案するんだけど、これはオーバーコミットメントを避けるために調整するんだ。テストの結果、フレンドリープールは最高ワーカーのレイテンシーをかなり減らせることがわかったけど、全体的なスループットが下がるかもしれない。
グーグルやアマゾンみたいな大手企業は、高いレイテンシーがリピーターの顧客を減らし、コストを増加させることがあるって経験からわかってる。現代のマイクロサービスアーキテクチャの複雑さによって、この状況は悪化して、ユーザーがレイテンシーの問題に気づく可能性が高くなるね。
大きなVMとCPUの可用性
クラウドサービスプロバイダーは今、高CPUコア数のさまざまな仮想マシン(VM)を提供してるよ。例えば、AWSは192のvCPUを持つインスタンスを提供してて、GCPは360のvCPUを持つインスタンスを提供してる。これにより、アプリケーションは効果的にスケールできて、大きな需要を処理できる。ただ、多くのアプリケーションは独立して動作して、ホスト上のCPUを完全に活用できると思い込んでるんだ。
この思い込みはしばしば間違っていて、CPUのオーバーコミットメントを引き起こす。複数のアプリケーションが同じホストで動くと、利用可能なCPUの数を超えるスレッドが生成されるんだ。CPUのクォータを利用して各アプリケーションが使用するCPU時間を制限してるけど、多くのアプリケーションは利用可能なCPUリソースを正確に判断しないから、高いテールレイテンシーにつながる。
アプリケーションがCPUのクォータに達すると、需要の急増によってリクエストがキューに入れられることがあって、これが観測されるレイテンシーを増加させたり、リクエストが拒否されたりすることにもつながる。リソース効率を最大化するために、アプリケーションはしばしばぎゅうぎゅう詰めにされるけど、同時に需要が急増すると、CPUリソースの効果的な共有が難しくなるんだ。
オーバーコミットメントの問題
オーバーコミットメントがアプリケーションにどう影響するかを理解することは、レイテンシーの問題を解決するために重要だよ。各物理プロセッサには複数のコアがあって、オペレーティングシステムには複数のCPUとして表示されることが多いのは、ハイパースレッディングのせいなんだ。OSはさまざまな要因に基づいてこれらのCPUでスレッドをスケジュールするけど、スレッドの数が利用可能なCPUの合計を超えるとオーバーコミットメントが起きる。
オーバーコミットメントは、特に共有リソースの競合が高まるとスレッド間の調整コストが増大する可能性がある。これがサービスの質に影響を与えるレイテンシーの増加につながることもあるんだ。
アプリケーションの適応方法
アプリケーションは通常、起動時に初期設定を行うんだけど、これには環境に関するデータを集めることが含まれる。この情報は内部設定を行うために必要不可欠だよ。でも、CPUのクォータがあるとこのプロセスが複雑になる。
多くの言語は使用するCPUの数を決めるときにCPUのクォータを考慮しないから、かなりのオーバーコミットメントにつながるんだ。プログラミング言語がCPUのクォータを意識して、スレッド数を調整できるような方法を採用することが重要だね。
バースト需要の管理
オーバーコミットメントに加えて、アプリケーションは時々突然の需要の急増に対処する必要があるんだ。アプリケーションがホストにぎゅうぎゅう詰めにされると、アクティビティが少ない時にCPUリソースを無駄にしちゃうことがある。これを避けるためには、可能な限りCPUのクォータを取り除くのが賢明だよ。
そうすると、アプリケーションは需要の急増に柔軟に反応できて、利用可能なリソースをより効果的に使えるようになる。CPUの制限を取り除くことで、アプリケーションはクォータを超えてもペナルティなしで需要に反応できるんだ。
隣接アプリケーションの影響
複数のアプリケーションがCPUのクォータなしで同時に動くと、お互いのリソース使用を無視し合うことができて、競合が増加することになるんだ。それぞれのアプリケーションは利用可能なCPUの数と同じだけスレッドを作るかもしれないけど、実際のビジーなスレッドの合計はしばしばこの数を超えちゃって、それぞれのアプリケーションがCPU時間を争うことになる。
この競争は、特にアプリケーションが隣接するアプリケーションの使用レベルを考慮しない場合、パフォーマンス向上の機会を逃すことにつながるんだ。
フレンドリープールの導入
CPUのオーバーコミットメントの課題に対処して、テールレイテンシーを改善するために、フレンドリープールを提案するよ。この革新的なスレッドプールは、隣接アプリケーションのCPU使用に基づいて動的に調整するんだ。
フレンドリープールは、CPU使用量を監視する制御スレッドを作成して運営される。各CPUごとに新しいスレッドを作る代わりに、実際に使用されているリソースに基づいてアクティブなスレッドの数を管理するんだ。隣のアプリケーションがリソースをあまり使っていなければ、フレンドリープールはワーカースレッドの数を減らして、レイテンシーを低下させてパフォーマンスを向上させられる。
パフォーマンス分析
フレンドリープールのテストでは、静的なスレッドプールと比べてテールレイテンシーを大幅に改善できることが示されたよ。でも、この改善は全体的なスループットが減少するって代償が伴うかもしれない。オーバーコミットメントファクターを実装することで、ユーザーはレイテンシーとスループットをそれぞれのニーズやアプリケーションの挙動に応じてどうバランスを取るか選べるんだ。
これらの解決策は現代のプログラミング言語や環境にとって有望だよ。リソース使用をより効率的にすることで、アプリケーションのコアでテールレイテンシーを減少させるチャンスを広げるんだ。
結論
CPUのオーバーコミットメントは、特に重い負荷や密に共有された環境では現代のアプリケーションにとって課題である。アプリケーションがリソース管理を改善する方法、特に隣接する使用を考慮しつつリソースを動的にスケールさせることを理解することで、全体的なパフォーマンスを向上させながらレイテンシーを最小限に抑えることが可能になる。
フレンドリープールの設計は、スレッド管理を最適化する一歩であり、プログラミング言語がCPUのクォータや隣接するCPU使用をもっと意識する必要があることを強調するものだよ。これらの戦略を導入することで、アプリケーションはクラウドコンピューティングやマイクロサービスの進化する風景の中でユーザーの要求をよりよく満たすことができるようになるんだ。
タイトル: Reducing Tail Latencies Through Environment- and Neighbour-aware Thread Management
概要: Application tail latency is a key metric for many services, with high latencies being linked directly to loss of revenue. Modern deeply-nested micro-service architectures exacerbate tail latencies, increasing the likelihood of users experiencing them. In this work, we show how CPU overcommitment by OS threads leads to high tail latencies when applications are under heavy load. CPU overcommitment can arise from two operational factors: incorrectly determining the number of CPUs available when under a CPU quota, and the ignorance of neighbour applications and their CPU usage. We discuss different languages' solutions to obtaining the CPUs available, evaluating the impact, and discuss opportunities for a more unified language-independent interface to obtain the number of CPUs available. We then evaluate the impact of neighbour usage on tail latency and introduce a new neighbour-aware threadpool, the friendlypool, that dynamically avoids overcommitment. In our evaluation, the friendlypool reduces maximum worker latency by up to $6.7\times$ at the cost of decreasing throughput by up to $1.4\times$.
著者: Andrew Jeffery, Chris Jensen, Richard Mortier
最終更新: 2024-07-16 00:00:00
言語: English
ソースURL: https://arxiv.org/abs/2407.11582
ソースPDF: https://arxiv.org/pdf/2407.11582
ライセンス: https://creativecommons.org/licenses/by/4.0/
変更点: この要約はAIの助けを借りて作成されており、不正確な場合があります。正確な情報については、ここにリンクされている元のソース文書を参照してください。
オープンアクセスの相互運用性を利用させていただいた arxiv に感謝します。