.net 远程处理性能会随着时间的推移而下降

.net 远程处理性能会随着时间的推移而下降,.net,remoting,client-server,.net,Remoting,Client Server,我正在开发一个客户端-服务器解决方案,它使用.NET2.0远程处理(服务器激活、TCP通道上的二进制格式、Vista Ultimate)进行通信。目前,我正在分析应用程序,并在同一台机器上运行所有程序。我注意到,如果启动应用程序,在几分钟内一切正常,然后突然之间,每个远程调用都需要几秒钟才能执行。我两端都有日志记录,每次通话都要打卡。服务器端的实现只需要几分之一秒的时间就可以执行,而整个远程调用的速度很慢。进一步的分析表明,远程处理在服务器端性能下降:虽然远程服务的内部工作在几分之一秒内执行,但

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

        <service>
            <wellknown 
                mode="Singleton" 
                type="MyDomain.SomeDomain, MyDomain" 
                objectUri="SomeDomainService"
            />
有没有人经历过这样的事情

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

        <service>
            <wellknown 
                mode="Singleton" 
                type="MyDomain.SomeDomain, MyDomain" 
                objectUri="SomeDomainService"
            />
更新: 我检查过,如果我将远程对象的生存期配置为,比如说,1天,我仍然有相同的问题

        <service>
            <wellknown 
                mode="Singleton" 
                type="MyDomain.SomeDomain, MyDomain" 
                objectUri="SomeDomainService"
            />
更新: 我使用IngoRamer()建议的模式来处理我的所有远程处理内容,如果这有什么不同的话

        <service>
            <wellknown 
                mode="Singleton" 
                type="MyDomain.SomeDomain, MyDomain" 
                objectUri="SomeDomainService"
            />
客户端代码:

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"
            />
服务器端只有正确的配置文件,如下所示:

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


除了RemotingConfiguration.Configure(“MyDomainService.exe.config”,false)之外,我不做任何事情;既不在我的服务器代码中,也不在客户端代码中。

从不。您是否正在执行导致远程处理层的额外实例被注册/实例化的操作???

浏览一下您的代码或其中的一个子集也会有所帮助。

使用一些网络监控工具,看看您的问题是与网络相关还是与服务器同步相关

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

如果证明这不是网络问题,则尝试在链中附加一个简单的自定义同步(就在通道之前)以进行日志记录并获取挂钩之间的时间。

您是否与客户机赞助商一起赞助远程对象?

我将远程通道的类型从tcp更改为http,同时保留二进制格式。我可以在不活动的几分钟内看到同样的减速,但与tcp通道不同,在客户端发出“慢速”远程调用后,服务器“唤醒”,所有后续调用都很快,直到下一段不活动时间到来,服务器再次进入睡眠状态

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

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

这可能与终身租赁有关。
        <service>
            <wellknown 
                mode="Singleton" 
                type="MyDomain.SomeDomain, MyDomain" 
                objectUri="SomeDomainService"
            />

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

您可以为您的类尝试MTAThread属性吗

您是否碰巧打了大量远程电话?如果调用速度足够快,则可能会耗尽处理请求的线程

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

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

我不这么认为。如果这有什么不同的话,我将使用Ingo Ramer()建议的模式来处理我的所有远程处理内容。我并不明确地这样做。正如我在问题中所描述的,我尝试使用服务器端生存期设置,但没有结果。我还发布了一些代码。希望能有所帮助。您是否使用ANT或类似的分析器对两端进行了分析?有效负载是多少?换句话说,你能和我们共享服务器的接口吗?您来回传递的数据是什么?它在增长吗?是否涉及严重的序列化?你的应用程序还在做什么?它是否正在成为I/O绑定?线装的?内存受限?只是简单的数据结构。如果有效载荷很大,它将从一开始就慢通信,而不是在中间。此外,正如我稍后回答的那样,HTTP传输并没有表现出这种行为。不,在我的测试过程中,最多有5次调用。
        <service>
            <wellknown 
                mode="Singleton" 
                type="MyDomain.SomeDomain, MyDomain" 
                objectUri="SomeDomainService"
            />