2

Tomcat6 サーブレット アプリケーションがあります。私の要求の 1 つ (平均 10 秒以下) は、マルチスレッドを使用することで大幅に改善できます。これは、CPU のみのタスクであり、コアが 8 つ以上あるためです。そうするのが賢いのか、それとも単に表面的な変更なのか、私はただ疑問に思います:

もちろん、単一ユーザーの場合は改善されます。しかし、負荷が増加するとどうなりますか?現在、いくつかの HTTP コネクタ スレッド間で共有されている CPU パワーには限りがあります。それらを最適に構成したと仮定すると、この単一の (しかし重要な) 操作を高速化するために、http コネクタ スレッド プールからいくつかのスレッドを取得し、それをエグゼキュータ サーバーに配置する必要があります。

私の推測では、負荷が増加すると、追加のスレッド化されたエグゼキューター サービスを使用すると、システムのパフォーマンスが低下するということです。

私の問題がわかりますか?誰かがベストプラクティスのアイデアを持っていますか? それとも私が見落とした何か?

4

2 に答える 2

1

いくつかの例外を除いて、パフォーマンスに関する質問の場合、最良の答えは通常、ベンチマークテストを作成して試してみることです。

一部のタスクは並列化できないことに注意してください。つまり、これを試みるには、利益が得られないように同期する必要があるか、各ステップで前のステップを完了する必要があるため、まったく不可能です。タスクを並列化できない場合、メリットはありません。

同じトークンで、アプリケーションのすべてのアクティビティが必ずしも並行して実行されるとは限りません。アプリケーションの一部は、ファイルシステムまたはネットワークへのI / Oのために相互にブロックし、場合によってはデータベース内で要求を待機している場合もあります。つまり、ハードウェアに8コアしかない場合があるからといって、厳密に8スレッドまたは9スレッドに制限する必要があるわけではありません。もちろん、あなたは夢中になりたくなくて、何百も持っていたくありません。

于 2011-02-15T16:12:27.327 に答える
0

私が問題を理解しているように、たとえば、1 つの同時要求があり、作業 (約 10 秒かかる) を並列化して後で結合できるいくつかの小さな作業単位に分割する場合に役立つ追加のスレッドをいくつか作成する必要があります。

また、たとえば、100 個のジョブのそれぞれを並列化するための予備のコアがないため、100 個の同時要求がある場合、これが実際にパフォーマンスを低下させるのではないかと心配しています。

理論的には、最小のオーバーヘッドは、アクティブなスレッドの数が物理コアの数と等しい場合です。そのため、自問する必要があります。最も一般的なケースは何ですか (システムに何人のユーザーがいますか?)、ユーザー数がピークに達した場合に支払う準備ができている価格はどれくらいですか?

とにかく、これを理論的に判断することは実質的に不可能であると判断するために、ベンチマークを行うべきであるというティムの意見に完全に同意します。たとえば、10 秒のタスクが 100% の CPU バウンドと 80% の CPU バウンドの場合、結果はまったく異なる可能性があります。推測しないで測定してください

于 2011-02-16T11:13:47.580 に答える