1

Spring.NET フレームワークで WCF サービスを作成しています。このサービスは数学サービスであり、クライアント アプリにいくつかの計算を提供します。

マルチコア サーバーでの WCF サービスの並列化について質問があります。簡単な例として、20 コアのサーバーがあります。

まず、簡略化したコードを示します。

//WS interface
public interface IMatlabService
{
    List<ResultData> Calculate(byte [] data);
}

//WS class definition
[ServiceBehavior(Namespace = "http://server.com/MatlabService")]
public class MatlabService: IMatlabService
{
    public IMatlabManager MatlabManager{get;set:}

    //web metod for math computations
    public List<ResultData> Calculate(byte [] data)
    {
        var result = new List<ResultData>();

        //do math work in another thread
        Task<List<ResultData>> task = Task.Factory.StartNew<List<ResultData>>(() =>
                                                           {
                                                               return MatlabManager.CalculateWithFiniteElementMethod(data);
                                                           });

        result.AddRange(task.Result)

        return result;

    }
}

public interface IMatlabManager 
{
    List<ResultData> CalculateWithFiniteElementMethod(byte [] data);
}

public class MatlabManager : IMatlabManager 
{
    public List<ResultData> CalculateWithFiniteElementMethod(byte [] data)
    {
        // do some math work
    }
}

Spring.NET では、Web サービスとマネージャー クラスをシングルトンではなく構成します。

Spring.NET XML 構成はこちらです。

Matlab マネージャーの構成:

  <object name="matlabManager"
          type="MatlabManager"
          singleton="false"/>

MatlabService 構成:

  <object name="matlabService"
          type="MatlabService"
          singleton="false">
       <property name="MatlabManager" ref="matlabManager"/>
  </object>

web.config からの WCF サービス構成

 <behavior name="Behavior1">
     <serviceMetadata httpGetEnabled="true"/>
     <serviceDebug includeExceptionDetailInFaults="true"/>
  </behavior>

<services>
  <service name="matlabService" 
            behaviorConfiguration="Behavior1">
    <endpoint address="" 
            binding="basicHttpBinding" 
            contract="IMatlabService" 
            bindingNamespace="http://server.com/MatlabService"/>
    <endpoint contract="IMetadataExchange" 
            binding="mexHttpBinding" 
            address="mex"/>
  </service>
</services>

SVC ファイル。

<%@ ServiceHost Language="C#" Debug="true" Service="MatlabServiceService" Factory="Spring.ServiceModel.Activation.ServiceHostFactory" %>
  1. 私は、クライアントごとに Web メソッド呼び出しが作成され、MatlabService の新しいインスタンスが作成され、WCF サービスの作業が新しいスレッド (WCF サービス スレッド) で行われ、OS がこのスレッドを CPU コアに割り当てると考えています。

    または、私が間違っていて、ServiceBehavior プロパティ InstanceContextMode で定義する必要がある呼び出しごとに動作が新しいサービス オブジェクトを作成しますか?

    [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)]

  2. MatlabService の Web メソッド Calculate では、並列化に System.Threading.Tasks を使用するため、数学作業は別のスレッド (数学スレッド) で行われます。

    呼び出しごとに WCF サービス スレッドが作成され、WCF サービス スレッドでは Math スレッドが作成されます。

    これが本当かどうかはわかりません。

    ConcurrencyMode の WCF サービスでマルチスレッドを許可する必要があるのでしょうか?

    [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall,ConcurrencyMode = ConcurrencyMode.Multiple)]

マルチコア CPU の Web メソッド呼び出しを並列化する方法のアイデアを聞きたいです。私はそれをグーグルで検索しましたが、Spring.NETフレームワークを使用してWCFサービスを作成しているため、明確で有用なものは見つかりませんでした。

4

1 に答える 1

1
  1. デフォルトのインスタンス コンテキスト モードは PerCall であるため、明示的に設定することは冗長です。

  2. はい、数学演算を行うために追加のスレッドを作成していますが、タスクが完了するまでブロックしているため、何も得られません。実際、追加のスレッドを作成して管理するオーバーヘッドがあるため、効率が低下します。

各 Web 呼び出しは、独自のスレッドで既に処理されています。

追加の並列コンピューティングを追加できる唯一の場所は、次の実装内です。

MatlabManager.CalculateWithFiniteElementMethod(data)

ただし、これは Matlab への呼び出しのように見えます。並列コードを使用してそのメソッドを再実装できれば、パフォーマンスがいくらか向上する可能性があります。

何をするにしても、プロファイリングは、実際に高速化しているかどうかを理解するための鍵です。覚えておいてください - 並列は常に速いという意味ではありません。これらの操作の同期と、それらのスレッドの作成にはオーバーヘッドがあります。

于 2012-09-07T20:16:17.447 に答える