40

私はParallel.ForEachを使用していますが、現在、MaxDegreeOfParallelismを設定せずに、いくつかのデータベース更新を行っています。デュアルコアプロセッサマシンはSQLクライアントタイムアウトになります。MaxDegreeOfParallelismとは何ですか?

コードが実行されている場所でどのような種類のプロセッサコアが使用できるのかを制御できませんが、MaxDegreeOfParallelismで変更できる設定があります。

私はタイムアウトを増やすことはできますが、それは良い解決策ではありません.CPUが少なくても、同時に処理する操作が少なくて済むと、CPU負荷が少なくなります。

他の投稿とMSDNも読んでいますが、MaxDegreeOfParallelismを値を低く設定すると、クアッドコアのマシンが壊れますか?

例えば、CPUが2つのコアを持っている場合は、とにかく、コアが2つの場合は20、コアが4つの場合は40を使用します。

答えて

58

答えは、コアの数にかかわらず、並列動作全体の上限であるということです。

したがって、IOまたはロックを待機しているためにCPUを使用しなくても、余分なタスクは並列で実行されません。指定した最大値だけが実行されます。

これを調べるために、私はこのテストコードを書きました。そこには、より多くのスレッドを使用するようにTPLを刺激する人工的なロックがあります。あなたのコードがIOまたはデータベースを待っているときも同じことが起こります。

class Program 
{ 
    static void Main(string[] args) 
    { 
     var locker = new Object(); 
     int count = 0; 
     Parallel.For 
      (0 
      , 1000 
      , new ParallelOptions { MaxDegreeOfParallelism = 2 } 
      , (i) => 
        { 
         Interlocked.Increment(ref count); 
         lock (locker) 
         { 
          Console.WriteLine("Number of active threads:" + count); 
          Thread.Sleep(10); 
         } 
         Interlocked.Decrement(ref count); 
        } 
      ); 
    } 
} 

MaxDegreeOfParallelismを指定しないと、コンソールログには同時に最大約8つのタスクが実行されていることが示されます。このように:

Number of active threads:6 
Number of active threads:7 
Number of active threads:7 
Number of active threads:7 
Number of active threads:7 
Number of active threads:7 
Number of active threads:6 
Number of active threads:7 
Number of active threads:7 
Number of active threads:7 
Number of active threads:7 
Number of active threads:7 
Number of active threads:7 
Number of active threads:7 
Number of active threads:7 
Number of active threads:7 
Number of active threads:7 
Number of active threads:7 
Number of active threads:7 

時間がたつにつれて増加し、最後に8を同時に実行しようとしています。私はいくつかの任意の値に制限した場合

は(たとえば2)、Iは

Number of active threads:2 
Number of active threads:1 
Number of active threads:2 
Number of active threads:2 
Number of active threads:2 
Number of active threads:2 
Number of active threads:2 
Number of active threads:2 
Number of active threads:2 
Number of active threads:2 
Number of active threads:2 
Number of active threads:2 
Number of active threads:2 
Number of active threads:2 
Number of active threads:2 
Number of active threads:2 
Number of active threads:2 

ああを取得し、これはquadcoreマシン上にあります。

+0

私のロジックには待ち時間やIOがなく、ただSQLを更新します。はいSQLは独自のものかもしれませんが、大部分はSQLが終了するのを待っています。使用されているアクティブなスレッドのデフォルト最大数は何ですか? –

+0

コアあたりのデフォルトは2ですが、コードがCPUを使用していない場合、TPLはこれを発生させることができます。ほとんどのデータベースにはIOがいくらか含まれています。 –

+1

6コアマシンの負荷が高い場合は、1つまたは2つのスレッドしか使用しません。軽くロードされている場合は、最大12になります。既存のシステム負荷を考慮に入れるほどにインテリジェントです。 – Contango

-1

それは並列で実行するスレッド数を設定します...

+0

しかし、コアを考慮に入れていますか? –

+0

基本的にどのような種類のデータベースを使用していますか? – SolidSnake

+0

同じOS、同じプログラム、同じデータ(基本的にレプリケータ)ですが、一方はデュアルクアッドコアを備えたハイエンドマシンであり、2つはシンプルなデュアルコアマシンで、同じプログラムが他のサーバからのデータをフェッチし、ブロブおよび画像)。 –

1

それはあなたが見つけて、それを引き起こしている問題を修正することができない限り、つまり、デッドロックされて並列に実行しているコードのように聞こえます、それをまったく並列化しないでください。

+0

-1、質問はパラレルではなくパラレルにするのではなく、SQLは独自の計算を行いますが、パラレルリクエストが多すぎるとクライアントタイムアウトになります。デッドロックは、同一のロジックを持つクアッドコアのマシンでは問題ありません。同じSQLがうまく動作しますが、タイムアウトを増やしたくありません。 –

+0

タイムアウトを増やしてみましたか?動作していることを確認しましたか?並行処理の問題はきわめて微妙なものになる可能性があり、多くの場合、並行処理の問題が消えて一見無作為に再現される可能性があります。より多くのコアを持つ別のマシンで動作しているということは、それが壊れていないことを意味しているわけではありません。また、より多くのコアが役立つものでした。 – jimrandomh

+0

タイムアウトの増加が役立ちます。しかし、何とかCPU使用率は、小規模なマシンでは50%以上、大きなマシンでは5%未満です。今はパフォーマンスの問題を発見する必要があります。コードを変更したり、必要なだけ行うことができますCPUをアップグレードします。 –

13

たとえば、CPUが2つのコアを持っている場合は、とにかく、CPUが4つのコアを持つ場合は20を使用します。

あなたは、CPUコアの数に並列度に依存するために、この操作を行うことができます。

var options = new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount * 10 }; 
Parallel.ForEach(sourceCollection, options, sourceItem => 
{ 
    // do something 
}); 

しかし、CPUの新しい余分なコアをシミュレートするために、ハイパースレッディングを使用する傾向があります。だから、あなたがクアッドコアプロセッサを持っているなら、Environment.ProcessorCountはおそらくこれを8つのコアとして報告するでしょう。シミュレートされたコアを考慮して並列処理を設定すると、実際にUIスレッドなどの他のスレッドが遅くなることがわかりました。

操作が少し速くなりますが、アプリケーションUIはこの間にかなりのラグを経験することがあります。 `Environment.ProcessorCount 'を2で割ることは、同じ処理速度を達成しつつ、CPUをUIスレッドのために利用可能に保つように思われる。

関連する問題