15

My Program は、それぞれが独立した作業を行う所定の数のスレッドを使用します。i7-2600 CPU を使用していますが、ハイパースレッド モジュールをシャットダウンして、4 コアで 4 スレッドを実行します。1 つのスレッドでプログラムを実行すると、CPU 使用率は 25% で、1 つのスレッドが完全に使用されているため完璧ですが、4 つまたは 3 つのスレッドを実行すると CPU が 60% しか使用されないのはなぜですか?

前に述べたように、スレッドは完全に独立しています (ロックも競合もありません) 1 つのスレッドでプログラムを 4 回実行すると、100% の CPU 使用率が得られます (つまり、プロセスごとに 1 つのスレッドの 4 つのプロセスが適切になる場合)。 CPU使用率)

何か案は?

いくつかの詳細情報:

  1. 必要なすべてのデータがメモリにロードされる処理中に I/O を使用していません。各スレッドは処理前に独自のデータをロードします。
  2. (oleDb を使用して) データベースからデータをロードしますが、説明している問題は、すべてのスレッドが処理されている (ロードが行われていない) ロード後に発生します。
  3. 数値は次のとおりです。
    • 50 ではなく約 40% の 2 つのスレッド (スレッドごとに 85%)。
    • 75 ではなく約 50% の 3 つのスレッド (スレッドごとに 65%)。
    • 100 ではなく約 60% の 4 スレッド (スレッドごとに 60%)。
  4. i7 2600 と 16GB のメモリを使用していますが、そのプロセスのメモリ使用量はそれほど大きくありません。
  5. Windows パフォーマンス モニターを実行して、競合がないかどうかを調べました。
4

3 に答える 3

3

You may try to shift your program from workstation to server garbage collection mode. Currently you may use just one garbage collection thread.
The setup is explained here.
See this thread for an explanation/further details.
Do not expect 100 % CPU load after the change, but you will get closer to 100% and increase the spead of it.

于 2012-04-24T08:04:55.607 に答える
1

ここでは、同時実行ビジュアライザーが役に立ちます。各スレッドがいつ実行されているかがわかります。すべてのスレッドが実行されていない場合は、特定のスレッドが待機している理由を正確に確認できます。ガベージが大量に生成されると、GC がスレッドをブロックしたままにし、線形スケーリングよりも小さくなる可能性があります。しかし、あなたは実際の調査を行うことによってのみ見つけることができます.

于 2012-04-24T08:15:50.207 に答える
1

.NET Framework v2.0 で作業しているときに同じ問題が発生し、プロジェクトのターゲット フレームワークを v4.0 に変更しました。これは 100 % の CPU 負荷で開始されました。

編集: スレッドごとの CPU 使用率を簡単に確認できます。

Sysinternals プロセス エクスプローラー

また

プロセスハッカー

于 2012-04-24T10:46:15.530 に答える