0

HPC を使用してシミュレーションを行いたいので、SOA を使用します。いくつかのサンプル資料から次のコードがあり、それを変更しました (これを最初に追加しました)。現在、最適化/パフォーマンスの低下の問題に遭遇しました。この基本的なサンプルは、サービス メソッドのクエリを想定していません。このメソッドは、パラメーターで取得した値を返します。ただし、私の例は遅いです。4 コア プロセッサと 1Gb ネットワークを備えた 60 台のコンピューターがあります。メッセージ送信の最初のフェーズには約 2 秒かかり、その後、戻り値が返されるまでさらに 7 秒待たなければなりません。すべての値が同時に最小またはそれ以上になります。私が抱えているもう1つの問題は、セッションオブジェクトを再利用できないことです.

BrokerClient または DurableSession オブジェクトを再利用できますか?

このメッセージ パッシングのプロセス全体を高速化するにはどうすればよいですか?

static void Main(string[] args)
{
  const string headnode = "Head-Node.hpcCluster.edu.edu";
  const string serviceName = "EchoService";
  const int numRequests = 1000;
  SessionStartInfo info = new SessionStartInfo(headnode, serviceName);
  for (int j = 0; j < 100; j++)
  {
    using (DurableSession session = DurableSession.CreateSession(info))
    {
      Console.WriteLine("done session id = {0}", session.Id);
      NetTcpBinding binding = new NetTcpBinding(SecurityMode.Transport);
      using (BrokerClient<IService1> client = new BrokerClient<IService1>(session, binding))
      {
        for (int i = 0; i < numRequests; i++)
        {
          EchoRequest request = new EchoRequest("hello world!");
          client.SendRequest<EchoRequest>(request, i);
        }
        client.EndRequests();
        foreach (var response in client.GetResponses<EchoResponse>())
        {
          try
          {
            string reply = response.Result.EchoResult;
            Console.WriteLine("\tReceived response for request {0}: {1}", response.GetUserData<int>(), reply);
          }
          catch (Exception ex)
          {
          }
        }

      }
      session.Close();
    }
  }
}

2 番目のバージョンでは、DurableSession の代わりに Session を使用しています。これはうまく機能していますが、Session の再利用に問題があります。

using (Session session = Session.CreateSession(info))
{

for (int i = 0; i < 100; i++)
{
    count = 0;

    Console.WriteLine("done session id = {0}", session.Id);
    NetTcpBinding binding = new NetTcpBinding(SecurityMode.Transport);

    using (BrokerClient<IService1> client = new BrokerClient<IService1>( session, binding))
    {
            //set getresponse handler
            client.SetResponseHandler<EchoResponse>((item) =>
            {
                try
                {
                    Console.WriteLine("\tReceived response for request {0}: {1}",
                    item.GetUserData<int>(), item.Result.EchoResult);
                }
                catch (SessionException ex)
                {
                    Console.WriteLine("SessionException while getting responses in callback: {0}", ex.Message);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Exception while getting responses in callback: {0}", ex.Message);
                }

                if (Interlocked.Increment(ref count) == numRequests)
                    done.Set();

            });

        // start to send requests
        Console.Write("Sending {0} requests...", numRequests);

        for (int j = 0; j < numRequests; j++)
        {
            EchoRequest request = new EchoRequest("hello world!");
            client.SendRequest<EchoRequest>(request, i);
        }
            client.EndRequests();

        Console.WriteLine("done");
        Console.WriteLine("Retrieving responses...");

        // Main thread block here waiting for the retrieval process
        // to complete.  As the thread that receives the "numRequests"-th 
        // responses does a Set() on the event, "done.WaitOne()" will pop
        done.WaitOne();
        Console.WriteLine("Done retrieving {0} responses", numRequests);
    }
}
// Close connections and delete messages stored in the system
session.Close();
}

EndRequest の 2 回目の実行中に例外が発生しました。サーバーは意味のある応答を提供しませんでした。これは、コントラクトの不一致、時期尚早のセッション シャットダウン、または内部サーバー エラーが原因である可能性があります。

4

1 に答える 1

4
  1. DurableSession個々のリクエストが約 30 秒未満の計算には使用しないでください。ADurableSessionは、ブローカーの MSMQ キューによってサポートされます。リクエストとレスポンスはディスクに往復する場合があります。リクエストごとの計算量が少ない場合、これによりパフォーマンスの問題が発生します。Session代わりに使用する必要があります。
  2. 一般に、パフォーマンス上の理由から、DurableSessionブローカーで永続的な動作がどうしても必要な場合を除き、使用しないでください。この場合、 のGetResponses直後に呼び出しているためSendRequests、 でSession問題なく動作します。
  3. Sessionまたはオブジェクトを再利用して、を呼び出さない限り、DurableSession任意の数のオブジェクトを作成できます。BrokerClientSession.Close
  4. クライアント側で応答を並行して処理することが重要な場合は、 を使用して、(応答を同期的に処理する をBrokerClient.SetResponseHandler使用するのではなくclient.GetResponses) 応答を非同期的に処理するコールバック関数を設定します。詳しくはHelloWorldR2サンプルコードをご覧ください。
于 2011-08-01T20:08:08.993 に答える