C# 未处理Unity导致服务器锁定?

C# 未处理Unity导致服务器锁定?,c#,model-view-controller,dependency-injection,unity-container,C#,Model View Controller,Dependency Injection,Unity Container,我们有一个大约40台服务器的服务器场,我们每两周将代码滚动到其中。我们在现场滚动代码时注意到的一件事是,在部署程序集并执行IIS重置并将其放回BigIp(F5)后,它接收到流量,服务器将锁定约10分钟,客户端将旋转直到最终超时 看看perfmon,我们可以看到finally的数量和固定对象的数量急剧增加,顺便说一句,这让我开始研究内存问题 所以有一件事我开始研究我们的统一IoC配置。在global.asax.cs中,我们注册了大约15个接口,其中大多数使用ContainerControlled

我们有一个大约40台服务器的服务器场,我们每两周将代码滚动到其中。我们在现场滚动代码时注意到的一件事是,在部署程序集并执行IIS重置并将其放回BigIp(F5)后,它接收到流量,服务器将锁定约10分钟,客户端将旋转直到最终超时

看看perfmon,我们可以看到finally的数量和固定对象的数量急剧增加,顺便说一句,这让我开始研究内存问题

所以有一件事我开始研究我们的统一IoC配置。在global.asax.cs中,我们注册了大约15个接口,其中大多数使用ContainerControlled LifetimeManager来管理生命周期。通常情况下,除了在这个十分钟的窗口中,代码从来没有问题,所以我的第一个想法是内存或资源管理问题

是否有人知道您是否必须显式地处置Unity容器()或者Unity是否以某种方式自动处理此问题?我今天注意到应用程序端没有Dispose连接,所以我的想法是,当IIS重置后服务器重新启动时,可能会出现统一或对象资源问题,直到GC恢复并释放内存(需要10分钟)


感谢您的帮助

执行iisreset将终止当前正在运行的w3wp.exe进程,因此在
Application\u End
中不正确处理unity对象不太可能导致启动时出现性能问题。旧的web进程可能无法正确地释放新web进程所依赖的文件系统或其他资源,但我认为如果是这样的话,您会看到文件访问或其他一些错误

因为您正在执行iisreset,所以我将仔细查看应用程序第一次启动时运行的代码。可能有一些组件需要花费大量时间才能启动(例如,有一个singleton类型的类可以从数据库下载和缓存一堆东西),这导致了速度的降低,可能只有在处理所有等待的HTTP请求的压力下才会发生。另外,请记住,ASP.NET在编译第一次使用的应用程序时会产生大量开销。由于您的web应用程序似乎位于负载平衡器之后,因此您可能希望在将每个web服务器添加回负载平衡器之前,找到一种在每个web服务器上“初始化”应用程序的方法,这可以通过在该web服务器上本地加载页面来实现。启动应用程序将允许web应用程序自行初始化,而不必处理任何外部请求,这将缩短启动时间


长话短说,在我关注关机问题之前,我会调查启动问题,看看我能在那里做些什么。

感谢您的后续跟进。值得一提的是,所讨论的代码是我们MVC区域文件夹中的一个单独的应用程序。我所在的团队拥有一个应用程序,该应用程序位于一个更大的解决方案中。在这十分钟内,web应用程序的其余部分工作正常,这意味着web.config中的任何HttpModules等都将为我们的应用程序以及应用程序的其余部分加载,因此我认为其中一个导致问题的因素将影响整个web应用程序,而不仅仅是我们的areas文件夹,最大的区别是我们的应用程序使用的是Unity IoC容器,而应用程序的其余部分则不是。所以这就是为什么我相信,在创造阶级的过程中,团结是有问题的。我们注意到它开始暂停的第一个调用是一个执行一些会话管理的类,它确实进行与数据库相关的调用。因此,可能是因为我们没有处理Unity实例,所以SqlClient没有得到正确处理?当然,任何事情都有可能,但我看不出Unity在这里会是一个什么问题。从经验上讲,我不得不认为最有可能导致减速的原因是当应用程序的某部分启动时代码正在执行的操作。既然您说您只有15个已注册的接口,那么添加一些日志记录,输出当前日期时间,以及向unity注册这些接口所需的时间,更重要的是,每个接口的初始化所需的时间。然后,您可以查看其中一个是否有很长的初始化时间。如果您正在调试这个问题,我仍然会认为问题只存在于应用程序启动代码中,直到证明不是这样。祝你好运,请随时更新此问题。我很想知道原因是什么。谢谢