ASP.Net应用程序首次运行缓慢

6
我有一个使用C#编写的ASP.Net 3.0 Web应用程序,生产机器是一个装有IIS 6.0和SQL Server 2005的Windows Server 2003。
应用程序结构:
我的ASP.net Web应用程序的结构如下:
在IIS中的根应用程序(//localhost/es)包括常见页面,例如:主页面、主题、用户控件、图像文件夹。
根应用程序下有多个子项目(//localhost/es/sub-project)。
删除子项目中的web.config文件。
将子项目的文件组装在根应用程序的bin文件夹下(子项目属性>>编译>>生成输出路径:..\bin\)。
我的应用程序是一个三层Web应用程序(业务逻辑层、数据访问层和表示层),每个aspx页面都有其代码后缀cs文件。
IIS设置:
应用程序池
1740分钟后回收工作进程
20分钟后闲置的工作进程
每30秒ping一次工作进程
工作进程启动时间限制为90秒
关闭工作进程的时间限制为90秒
应用程序配置
将ASP文件在内存中的缓存限制为500
将ASP文件在磁盘上的缓存限制为2000
部署应用程序:
我将所有文件及其相关内容发布到生产服务器中。
问题:
第一次运行应用程序时,速度非常慢,需要超过10秒才能加载,但每次请求页面时,速度都会更快。我认为第一次请求页面时,它会进行编译,通常比其他请求花费更多的时间,因为页面在缓存内存中。问题是,为什么第一次编译页面需要这么长时间?
解决问题的尝试:
我尝试了以下操作:
将所需文件的副本部署到生产服务器。
更改IIS设置,更改工作进程闲置超时关闭。
关闭跟踪。
关闭会话状态。
禁用页面的视图状态。
在web.config中设置debug=false。
在根应用程序下创建一个hello world子项目,需要5秒钟。
创建单独的hello world Web应用程序,与上面相同,需要很长时间才能加载。
删除page_load事件处理程序中的代码,但对性能没有影响。
只发布根应用程序所需的文件(不在代码后台编写代码),并将所有文件发布到子项目的源代码中(代码在代码后台中编写)。
然而,应用程序仍然开始较慢,但之后会变得更快。
请帮助诊断和解决此问题。

https://dev59.com/rGYr5IYBdhLWcg3wytLe - David d C e Freitas
9个回答

5
除了Sky所说的,您可以在部署过程的最后一步运行一个“预热脚本”。尽管这不会加快第一次编译所需的时间,但使用这样的脚本至少可以防止用户看到缓慢的启动。请参考以下链接中的示例: http://programmerramblings.blogspot.com/2008/09/aspnet-site-warmup.html 另一个导致应用程序第一次请求变慢的原因可能是IIS在第一次请求期间启动asp.net工作进程。然而,这不应影响对其他页面的第一次请求。

自动启动Web应用程序非常适合解决首次加载页面性能的最大缺点,但该应用程序将不会关闭。我的应用程序包含很多页面,如果我使用“自动启动”或“预热”,它会影响内存吗? 预热是否会对服务器性能产生负面影响? 使用“预热脚本”有什么缺点吗? - Zahraa

2

发布网站时,需要进行预编译而非复制。

您所遇到的行为是正常的。


1

您还可以使用自动启动应用程序功能,该功能适用于 .net framework 4 网络应用程序。有关更多信息,请访问此处


1
由于.NET Framework平台中的CLR组件,任何.NET应用程序第一次加载时都会有轻微的延迟。因为JIT(即时编译器)驻留在CLR(ASP.NET运行时环境)内部,将中间语言(IL)转换为本机机器代码,这将始终需要更长的时间来执行.NET应用程序的第一次操作。
关于这个问题的详细视频可以在以下链接观看:

https://www.youtube.com/watch?v=ruf4U9_Rbss&index=1&list=PL8598C97BA1D871C1

希望它有所帮助。

1

我在Ruby on Rails应用程序中也遇到了这个问题,使用Passenger,但我找到了一个很好的工具(http://www.wekkars.com),可以防止Web服务器进入休眠状态。


0
VBscript + Dos Batch file... run every 1 hr 


Dim strNewTime , strSiteName
strNewTime = Now() 
strNewTime = Replace(strNewTime, "/","")
strNewTime = Replace(strNewTime, " ","")
strNewTime = Replace(strNewTime, ":","") 

strSiteName = "https://www.yoursite.com/userlogin.aspx?dummytime=" + strNewTime

Dim oXMLHTTP
Set oXMLHTTP = CreateObject("MSXML2.XMLHTTP.6.0")       

oXMLHTTP.Open "GET", strSiteName, False
oXMLHTTP.Send

If oXMLHTTP.Status = 200 Then
'  working
ELSE
    CALL SendEmail("!!! www - web site is NOT working... " + strSiteName + " *** ") 
End If

Set oXMLHTTP = Nothing 

1
请添加注释来描述您的答案如何解决问题。 - Chrismas007

0

0

对于在IIS 7.0及更低版本上运行的asp.net应用程序,编写一个预热程序或脚本是防止应用程序池空闲超时的最佳方法。 这个预热触发器可以从同一应用程序或外部网站或程序设置。 您可以在这个文章中找到不同的实现方式。


-4

这是无法避免的。由于网站需要编译,因此第一次加载时总会有轻微的延迟。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接