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倍になるなどの状況をキャッチするためです。