basicHttpBindingに基づく単純な「Helloworld」サービスがあります。このサービスはクアッドコアCPUでホストされています。
負荷テストを実行すると、1つのコアのみが占有され(95%)、他の3つは約4〜8%占有されます。
他のコアが処理に使用されないのはなぜですか?
設定ConcurrencyMode = ConcurrencyMode.Multiple
は役に立ちませんでした。
basicHttpBindingに基づく単純な「Helloworld」サービスがあります。このサービスはクアッドコアCPUでホストされています。
負荷テストを実行すると、1つのコアのみが占有され(95%)、他の3つは約4〜8%占有されます。
他のコアが処理に使用されないのはなぜですか?
設定ConcurrencyMode = ConcurrencyMode.Multiple
は役に立ちませんでした。
サービスの を構成ServiceBehavior
します。
WCF はConcurrencyMode=ConcurrencyMode.Single
デフォルトで使用します。このモードでは、サービスへのすべてのリクエストが 1 つのスレッドで実行されます。
ConcurrencyMode.Single を使用すると、メソッドが実行されている限り、WCF はオブジェクトを再度呼び出すことはありません。操作が戻った後、オブジェクトを再度呼び出すことができます。
そのスレッドを実行するために 1 つの CPU コアが使用されます。
サービスがすべての CPU を使用するように、以下の属性を追加します。
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
そのモードを有効にするときは、サービスの状態に注意してください。状態を変更する場合は、独自のロックを実装する必要がある場合があります。
詳細については、 ConcurrencyMode 列挙を確認してください。
また、クライアントが同時に 4 つの呼び出しを行うようにしてください (クライアントにマルチスレッドを実装します)。それがなければ、サーバーがマルチスレッドをサポートしていても、1 スレッドの呼び出しが連続して処理されます。
コードを確認した後に更新します。
あなたの WCF メソッドは、CPU をロードできる作業を行いません。メソッドを CPU を大量に使用する関数 (ハッシュまたは階乗の計算) に置き換えて、再チェックしてください。
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
public class HelloService : IHelloService
{
public string HelloWorld()
{
return "Hello world";
}
}
BasicHttpBindingのAPI ドキュメントには、次のように書かれています。
インスタンス メンバーは、スレッド セーフであるとは限りません。
これは、単一の BasicHttpBinding インスタンスを複数のスレッドから並行して呼び出すべきではないことを意味します。したがって、複数の CPU/CPU コアに分散することはできません。