【问题标题】:Remoting performance degrades over the time远程处理性能会随着时间的推移而降低
【发布时间】:2008-12-02 13:46:02
【问题描述】:

我正在开发一个客户端-服务器解决方案,该解决方案使用 .NET 2.0 Remoting(服务器激活、基于 TCP 通道的二进制格式、Vista Ultimate)进行通信。目前我正在分析应用程序并在同一台机器上运行所有内容。我注意到,如果我启动应用程序,几分钟内一切正常,然后突然每次远程调用都需要几秒钟才能执行。我在两端都登录并记录每个电话。服务器端的实现只需要几分之一秒的时间来执行,而整个远程调用很慢。进一步的分析表明,远程处理在服务器端会降级:虽然远程服务的内部工作在几分之一秒内执行,但响应非常慢。如果我重新启动服务器,几分钟后一切又恢复正常。

有没有人经历过类似的事情?

谢谢!

更新: 我检查过,如果我将远程对象的生命周期配置为 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); 我什么都不做在我的服务器和客户端代码中都没有。

【问题讨论】:

  • 您是否使用 ANT 或类似的分析器对两端进行了分析?
  • 什么是有效载荷?换句话说,你能把服务器的接口分享给我们吗?您来回传递的数据是什么?它在增长吗?是否涉及大量序列化?你的应用程序还在做什么?它是否成为 I/O 密集型的?线程绑定?内存受限?
  • 只是简单的数据结构。如果有效载荷很大,它会从一开始就减慢通信速度,而不是在中间。此外,正如我稍后回答的那样,HTTP 传输不会表现出这种行为。

标签: .net remoting client-server


【解决方案1】:

使用诸如Wireshark 之类的网络监控工具来查看您的问题是与网络相关还是与服务器同步相关。

如果证明不是网络问题,那么尝试在链中(就在通道之前)附加一个简单的自定义同步来记录并获取钩子之间的时间。

【讨论】:

    【解决方案2】:

    从来没有。您是否正在做一些导致您的远程处理层的额外实例被注册/实例化的事情??

    【讨论】:

    • 我不这么认为。我正在使用 Ingo Ramer (tinyurl.com/5u8fjq) 建议的模式来处理我的所有远程处理内容,如果这有什么不同的话。
    【解决方案3】:

    看一眼您的代码或其子集也会有所帮助。

    【讨论】:

      【解决方案4】:

      您是否通过客户赞助商赞助您的远程对象?

      【讨论】:

      • 我没有明确地这样做。正如我在问题中所描述的,我尝试使用服务器端生命周期设置但没有结果。我还发布了一些代码。希望它会有所帮助。
      【解决方案5】:

      我将远程处理通道的类型从 tcp 更改为 http,同时保留二进制格式。我可以在几分钟的不活动中看到同样的减速,但与 tcp 通道不同,在客户端进行“慢”远程调用后,服务器“唤醒”并且所有后续调用都很快,直到下一个不活动期到来并且服务器又睡着了。

      这绝不是一个解决方案,但至少是某种解决方法。

      【讨论】:

        【解决方案6】:

        这可能与终身租约有关。 Singleton 对象受为其指定的生命周期租约的约束,因此即使客户端当前持有对它的引用,它也可以被回收。您可以通过重写 MarshalByRefObject 的 InitializeLifetimeService 方法来创建前一种类型的 Singleton 对象。

        【讨论】:

          【解决方案7】:

          你可以为你的班级尝试 MTAThread 属性,只是一个想法..

          【讨论】:

            【解决方案8】:

            您是否偶然进行了大量的远程调用?如果您的调用速度足够快,您可能会用完线程来处理请求。

            这可能不是你的问题,但我以前遇到过,所以我想我把它传递了。

            【讨论】:

            • 不,在我的测试过程中最多有 5 次调用。
            猜你喜欢
            • 2021-07-17
            • 2016-09-11
            • 2016-11-06
            • 1970-01-01
            • 2019-02-22
            • 2014-04-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多