1

高い並列負荷の下で実行するときにパフォーマンスが必要な SQL (ADO.NET を使用し、LINQ や PLINQ を使用することは何もない) の一部を簡単にロード テストしてベンチマークする方法を探しています。

新しい並列拡張機能 CTP を使用して、具体的にはParallel.For/Parallel.ForEach単純に SQL を 10,000 回程度繰り返し実行することを考えましたが、これらが最適化された目的に関するデータを見つけることができませんでした。

基本的に、データベース アクセスは本質的に I/O バウンドであるため、十分な負荷が発生しないのではないかと心配しています。パラレルかどうかは誰にもわかりません。実行中のタスクが完全に CPU バウンドでない場合、x 個のスレッド (x = CPU の数) を使用するのに十分なほどインテリジェントですか? つまり、マネージド スレッド プールと同様に動作しますか?

だったらむしろカッコイイ!

編集: @CVertex が親切に以下を参照しているように、スレッドの数を個別に設定できます。ジョブが I/O バウンドの場合、デフォルトで並列ライブラリがスレッドを追加し続けるのに十分なほどインテリジェントかどうかは誰にもわかりませんか?

4

2 に答える 2

1

確かにできます!

必要な CPU ごとのスレッドの最大数を指定できます。

Parallel.For を実行する前に、System.Threading.Tasks 名前空間から独自の TaskManager をインスタンス化する必要があります。ctor パラメーターを調べて、独自の目的に合わせてタスク マネージャーをカスタマイズする方法を確認してください。

タスク マネージャーのインスタンスを受け取る Parallel.For のオーバーロードが必要です。

于 2008-12-08T13:42:29.700 に答える
0

もう 1 つの方法は、PLINQ_DOP 環境変数を定義することです。ドキュメントから:

PLINQ_DOP
DOP stands for degree of parallelism. Setting this environment variable defines the number of threads for PLINQ to use. 
E.g. PLINQ_DOP=1 means single-threaded, while PLINQ_DOP=8 means PLINQ should use 8 threads. 
If this is set to a value greater than the number of procs*cores available on the system, 
PLINQ will use more threads than processors. If one of them blocks, for instance, 
this allows other threads to make forward progress.
于 2008-12-08T13:55:39.487 に答える