2

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

監視マシンでできる RPC チューニングはありますか?

更新 1:

投稿する前に、すでにいくつかの .NET チューニングを行っています。との呼び出しでを調整しThreadPoolました。で作成されたオブジェクトを使用しています。ThreadPool.SetMinThreads(200, 200)ThreadPool.SetMaxThreads(300,300)TaskTaskCreationOptions.LongRunning | TaskCreationOptions.PreferFairness

4

1 に答える 1

2

C# のスレッド プールを使用しています

多くのブロッキングを行い、ほとんど実行しないコードを実行している場合、これは良い考えではありません。WMI クエリと同様です。スレッド プール スケジューラは、実行スレッドの数をマシンのコア数に制限しようとします。これは最適化であり、スレッド コンテキスト スイッチで失われるオーバーヘッドの量を減らします。しかし、スレッドが実際にコードを実行していないことを予測または検出することはできません。それに対処するための適応スケジューリングアルゴリズムがあり、既存のスレッドが終了していないときに追加のスレッドを実行できますが、動作は遅くなります。

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

于 2012-04-18T16:11:52.633 に答える