2012-04-18 4 views
2

私はWMIを使用して何百ものホストを監視しています。私は約5秒ごとにCPU使用率をポーリングしています。現在スケジュールされている適切なWMIクエリを実行するためにC#のスレッドプールを使用しています。通常、クエリを実行するスレッドは30個程度しかありません。時には、5秒ではなく16秒のギャップがあり、CPU使用率が目に見えません。 CPUが十分に活用されていないので、私はボトルネックがRPCまたはTCP/IPスタックにあると思われます。しかし、私はTCP/IPスタックではないと思います。なぜなら、接続は永久に開かれているからです。だから私はボトルネックが監視マシン上のRPCにあると思われます。Windows RPCチューニング

監視マシンで実行できるRPC調整はありますか?

UPDATE 1:

私は投稿する前に私はすでにいくつかの.NETのチューニングを行っています。私はThreadPool.SetMinThreads(200, 200)ThreadPool.SetMaxThreads(300,300)コールでThreadPoolを調整しました。私はTaskオブジェクトを使用しています。すべてはTaskCreationOptions.LongRunning | TaskCreationOptions.PreferFairnessで作成しました。

答えて

2

私はあなたがブロックし、少しの実行の多くを行うコードを実行している場合は良い考えではないのC#のスレッドプール

を使用しています。 WMIクエリと同様です。スレッドプールスケジューラは、実行中のスレッドの数をマシン上のコア数に制限しようとします。これは最適化であり、スレッドコンテキストスイッチにかかるオーバーヘッドの量を削減します。しかし、スレッドが実際にコードを実行していないことを予測または検出することはできません。これに対処する適応スケジューリングアルゴリズムがあり、既存のスレッドが終了していないときに余分なスレッドを実行できるようになりますが、それは遅く動作します。

ThreadPool.SetMinThread()を呼び出して、同時に実行できるスレッドの数を増やすことができます。デフォルトはコアの数です。 30に増加すると問題は解決しますが、グローバルな副作用があります。スレッドプールの代わりにスレッドを使用することは、ローカルソリューションです。

+0

残念ながら、私はすでに投稿しています。私は 'ThreadPool'を' ThreadPool.SetMinThreads(200,200) 'と' ThreadPool.SetMaxThreads(300,300) 'の呼び出しで調整しました。私は 'Task'オブジェクトを使用しています。すべて' TaskCreationOptions.LongRunning | TaskCreationOptions.PreferFairness'。 – wilx

関連する問題