远程性能随着时间的推移而降低

时间:2008-12-02 13:46:03

标签: .net remoting client-server

我正在研究一种客户端 - 服务器解决方案,该解决方案使用.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);既不在我的服务器也不在客户端代码中。

8 个答案:

答案 0 :(得分:1)

使用某些网络监控工具(如Wireshark)查看您的问题是与网络相关还是与服务器同步相关。

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

答案 1 :(得分:0)

从不。您是否正在做一些导致您的远程处理层的额外实例被注册/实例化的内容?

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

您是否偶然会拨打大量远程电话?如果您正在快速地进行调用,则可能会耗尽线程来处理请求。

这可能不是你的问题,但我之前遇到过这种情况所以我认为我已经过去了。