6

私は、通信目的で .NET 2.0 Remoting (サーバーのアクティブ化、TCP チャネルを介したバイナリ形式、Vista Ultimate) を使用するクライアント サーバー ソリューションに取り組んでいます。現在、私はアプリケーションのプロファイリングを行っており、すべてを同じマシンで実行しています。アプリケーションを起動すると、数分間はすべてが正常に機能し、その後突然、各リモート呼び出しの実行に数秒かかることに気付きました。私は両端にログインしており、すべての通話を記録しています。サーバー側の実装は実行にほんの一瞬しかかかりませんが、リモート呼び出し全体は低速です。さらにプロファイリングを行うと、サーバー側でリモート処理が低下することが示されました。リモート サービスの内部作業は数分の 1 秒以内に実行されますが、応答は非常に遅くなります。サーバーを再起動すると、すべてが数分間正常に戻ります。

誰かがそのようなことを経験しましたか?

ありがとう!

更新: リモート オブジェクトの有効期間を 1 日などに設定した場合でも、同じ問題が発生することを確認しました。

更新: Ingo Ramer ( HOWTO: Use Interface-based remote objects with config files ) によって提案されたパターンを使用しています。

クライアントコード:

public static object CreateInstance(Type type)
{
    if (!Initialized)
        InitWellKnownTypesCache();

    WellKnownClientTypeEntry typeEntry = (WellKnownClientTypeEntry)wellKnownTypesCache[type];
    if (null == typeEntry)
        throw new RemotingException("Type not found.");

    if (string.IsNullOrEmpty(serverObjectActivationUri))
        throw new RemotingException("ServerObjectActivationUri wasn't configured. Cannot create server object instance.");

    return Activator.GetObject(typeEntry.ObjectType, string.Format(serverObjectActivationUri, typeEntry.ObjectUrl));
}

サーバー側には、次のような適切な構成ファイルしかありません。

        <service>
            <wellknown 
                mode="Singleton" 
                type="MyDomain.SomeDomain, MyDomain" 
                objectUri="SomeDomainService"
            />

RemotingConfiguration.Configure("MyDomainService.exe.config", false); 以外は何もしません。私のサーバーでもクライアントコードでもありません。

4

8 に答える 8

1

Wiresharkなどのネットワーク監視ツールを使用して、問題がネットワーク関連かサーバー同期関連かを確認します。

ネットワークの問題ではないことが証明された場合は、チェーン (チャネルの直前) に単純なカスタム同期をアタッチして、ログに記録し、フック間のタイミングを取得してみてください。

于 2008-12-02T22:42:30.957 に答える
0

リモートオブジェクトをクライアントスポンサーで後援していますか?

于 2008-12-02T22:51:56.930 に答える
0

それは生涯リースに関連している可能性があります。シングルトンオブジェクトは、そのオブジェクトに指定されたライフタイムリースの対象となるため、クライアントが現在そのオブジェクトへの参照を保持している場合でも、リサイクルできます。MarshalByRefObjectのInitializeLifetimeServiceメソッドをオーバーライドすることで、前者のタイプのシングルトンオブジェクトを作成できます。

于 2008-12-04T23:17:56.377 に答える
0

たまたま大量のリモート呼び出しを行っていませんか? 十分な速さで呼び出しを行っている場合、要求を処理するスレッドが不足している可能性があります。

それはおそらくあなたの問題ではありませんが、私は以前にそれに遭遇したので、私はそれを伝えると思いました.

于 2008-12-07T19:07:38.093 に答える
0

クラスの MTAThread 属性を試すことはできますか?

于 2008-12-05T13:12:08.640 に答える
0

コードまたはそのサブセットを一目見ただけでも役に立ちます。

于 2008-12-02T21:22:35.737 に答える
0

バイナリ形式のまま、リモーティング チャネルのタイプを tcp から http に変更しました。数分間の非アクティブ状態でも同じ速度低下が見られますが、tcp チャネルとは異なり、クライアントが「遅い」リモート呼び出しを行った後、サーバーが「ウェイクアップ」し、その後のすべての呼び出しは高速で、次の非アクティブ期間が来てサーバーが再び眠りにつく。

これは決して解決策ではありませんが、少なくともある種の回避策です。

于 2008-12-03T04:21:23.067 に答える
0

一度もない。リモーティング層の余分なインスタンスが登録/インスタンス化される原因となっている何かをしていますか??

于 2008-12-02T13:48:51.113 に答える