如何保持我的ASP.NET应用程序始终“活着”,如果它是一个坏主意,为什么我不应该这样做?

时间:2009-05-03 18:15:40

标签: asp.net performance iis-7

我最近在我的闪亮的新VPS中部署了一个ASP.NET应用程序,虽然我很高兴VPS可以通过共享托管解决方案提供的一般性能提升,但我对我的启动时间不满意应用

当我的客户第一次点击它时,我的网络应用程序需要相当长的时间才能启动。我没有在调试模式下运行它(在我的web.config中禁用它),它在启动时没有任何实际工作要做 - 我的应用程序启动事件处理程序中没有代码,我没有启动任何额外的线程,没有。我的客户第一次点击我的应用程序需要15-20秒才能响应。后续调用需要1-2秒,除非我等待几分钟让我的应用程序关闭。然后它又回到15-20秒的启动时间。

(我知道我的时间基准是非常不科学的,这些数字应该只是给我的应用启动时的性能感觉。)

我对ASP.NET的理解是,IIS(在本例中为7.0)在第一次运行时编译Web应用程序,然后将这些二进制文件缓存,直到Web应用程序发生更改为止。我的理解不正确吗?

所以,在那本书大小的序言之后,这是我的问题:

  • 我对ASP.NET编译的理解是不正确的?它是如何运作的?
  • 有没有办法可以强制IIS缓存我的二进制文件,或者让我的应用程序无限期保持活着?
  • 如果在上一个问题中做任何一件事是个坏主意,为什么这是一个坏主意,我还能做些什么来提高启动性能呢?

谢谢!

编辑:看来我的问题是this question的轻微重复(我以为我在这里找到了更好的答案,哈哈)。不过,我认为我的问题更为全面,如果没有关闭,除非在这里提出更好的,已经提出的问题,否则我会很感激。

3 个答案:

答案 0 :(得分:4)

IIS还会在给定时间段后关闭您的Web应用程序,具体取决于其配置。我不熟悉IIS7以及在哪里配置它,所以你可能想要对如何配置它进行一些研究(starting point?)。

不好吗?取决于您的代码有多好。如果你没有泄漏内存或资源,可能不会。

另一个解决方案是precompile your website。这对您来说可能是更好的选择。但是,您必须查看它,因为它可能会有不利之处,具体取决于您与网站的互动方式。

答案 1 :(得分:2)

  

我对ASP.NET的理解是,IIS(在本例中为7.0)在第一次运行时编译Web应用程序,然后将这些二进制文件缓存,直到Web应用程序发生更改为止。我的理解不正确吗?

这是正确的。具体来说,程序集构建为卷影副本(不要与卷快照服务/卷影复制功能混淆)。这使您可以动态替换文件夹中的代码,而不会影响现有的运行会话。 ASP.NET将检测更改,并将新版本编译到目标目录(通常为Temporary ASP.NET Files)。有关该流程的更多信息:Understanding ASP.NET Dynamic Compilation

答案 2 :(得分:1)

如果纯粹是编译时间,那么通常最有效的方法是在回收后自己访问网站。定期拨打电话,确保收到15秒延迟而非您的客户的是您。

如果这是所有编译时间(取决于硬件),我会感到惊讶 - 你有很多类的静态实例吗?他们在创业方面做了很多工作吗?

无论是跟踪还是分析,您都可以很快找到启动时间的地方。

至于为什么保持一个流程是一个坏主意,我相信它是由于清理。无论我们如何更好地关注我们的数据或GC的表现如何,都可以通过重新启动流程进行良好的清理。像碎片这样的东西可以消失,随着时间的推移积累的任何其他资源问题都会被清除。因此,保持服务器进程无限期运行是一个非常糟糕的主意。