一部の人々は、2つのスレッドが多すぎると言います-私はそのキャンプに完全ではありません:-)
ここに私のアドバイスがあります:測定して、推測しないでください。1つの提案は、それを構成可能にして、最初に100に設定してから、ソフトウェアを実際にリリースして何が起こるかを監視することです。
スレッドの使用率が3に達すると、100は多すぎます。1日の大半が100のままである場合は、最大200まで上げて、何が起こるかを確認します。
あなたは可能性があり、実際に自分自身の使用状況を監視し、それが起動しますが、それはおそらく行き過ぎだ次回のために設定を調整し、あなたのコードを持っています。
説明と詳細については:
私はあなた自身のスレッドプーリングサブシステムをローリングすることを主張していません、必ずあなたが持っているものを使ってください。しかし、スレッドの適切なカットオフポイントについて質問していたので、スレッドプールの実装には、作成されるスレッドの最大数を制限する機能があると思います(これは良いことです)。
私はスレッドとデータベース接続プールのコードを記述しましたが、それらには次の機能があります(パフォーマンスに不可欠であると私は信じています)。
- アクティブなスレッドの最小数。
- スレッドの最大数。
- しばらく使用されていないスレッドをシャットダウンする。
1つ目は、スレッドプールクライアントの観点から最小パフォーマンスのベースラインを設定します(この数のスレッドは常に使用可能です)。2番目は、アクティブなスレッドによるリソース使用量に制限を設定します。3番目は、リソースの使用を最小限に抑えるために、静かな時間にベースラインに戻ります。
未使用のスレッドがあるリソース使用量(A)と、作業を行うのに十分なスレッドがないリソース使用量(B)のバランスをとる必要があります。
(A)は、通常、メモリ使用量(スタックなど)です。これは、処理を行わないスレッドがCPUの多くを使用しないためです。(B)スレッドが使用可能になるのを待つ必要があるため、リクエストが到着すると、一般にリクエストの処理が遅れます。
それがあなたが測定する理由です。述べたように、スレッドの大部分はデータベースからの応答を待っているため、実行されません。許可するスレッドの数に影響を与える2つの要因があります。
1つ目は、使用可能なDB接続の数です。これは、DBMSで増やすことができない場合、ハードリミットになる可能性があります。この場合、DBMSが無制限の数の接続を取ることができると想定します(理想的には、それも測定する必要があります)。
次に、スレッドの数は、過去の使用状況によって異なります。実行する必要がある最小値は、これまでに実行したことがある最小値+ A%で、絶対最小値は(たとえば、Aのように構成可能にする)5。
スレッドの最大数は、過去の最大値+ B%にする必要があります。
また、行動の変化を監視する必要があります。なんらかの理由で、使用率が100%になるまでかなりの時間(クライアントのパフォーマンスに影響を与えるため)になる場合は、許容される最大値を上げて、再びB%高くなるようにする必要があります。
「正確に何を測ればいいの?」に応えて 質問:
特に測定する必要があるのは、負荷がかかっている状態で同時に使用されている(たとえば、DB呼び出しからの戻りを待機している)スレッドの最大量です。次に、たとえば 10%の安全率を追加します(他のポスターは私の例を固定された推奨事項と見なしているようなので、強調します)。
さらに、これは本番環境で調整する必要があります。事前に見積もりを取得することは問題ありませんが、どのプロダクションがあなたのやり方を投げるのかわかりません(そのため、これらすべてが実行時に構成可能でなければなりません)。これは、着信するクライアントコールが予期せず2倍になるなどの状況を把握するためです。