Asp.net 修复IIS的缓慢初始加载

Asp.net 修复IIS的缓慢初始加载,asp.net,.net-4.0,iis-7.5,Asp.net,.net 4.0,Iis 7.5,IIS对于流量低的网站有一个恼人的功能,它会回收未使用的工作进程,导致第一个用户在一段时间后访问该网站会获得非常长的延迟(30秒以上) 我一直在寻找解决问题的方法,我已经找到了这些潜在的方法 A B C D 我想知道哪一个是首选的,更重要的是,为什么有这么多的解决方案来解决同一个问题?(我猜他们不是,我只是没有正确理解一些东西) 编辑 执行C似乎足以让我的网站保持热身,但我发现,我的网站速度缓慢的真正根源与实体框架有关,我似乎不明白它为什么会变冷。请看问题,不幸的是,这个问题尚未得到回答 最后,

IIS对于流量低的网站有一个恼人的功能,它会回收未使用的工作进程,导致第一个用户在一段时间后访问该网站会获得非常长的延迟(30秒以上)

我一直在寻找解决问题的方法,我已经找到了这些潜在的方法

A

B

C

D

我想知道哪一个是首选的,更重要的是,为什么有这么多的解决方案来解决同一个问题?(我猜他们不是,我只是没有正确理解一些东西)

编辑

执行C似乎足以让我的网站保持热身,但我发现,我的网站速度缓慢的真正根源与实体框架有关,我似乎不明白它为什么会变冷。请看问题,不幸的是,这个问题尚未得到回答


最后,我不得不偶尔访问我的网站,以确保它保持快速。选项a、B和D似乎属于同一类别,因为它们只影响初始启动时间,它们会对网站进行预热,比如编译和加载内存中的库

使用C设置空闲超时应该足够了,以便能够快速地向服务器发送后续请求(重新启动应用程序池需要相当长的时间,以秒为单位)

据我所知,存在超时是为了节省内存,其他网站在该机器上并行运行可能需要内存。价格是一次慢加载时间

除了在用户不活动的情况下关闭应用程序池之外,默认情况下,应用程序池还将每1740分钟(29小时)循环一次

来自technet:

可以创建Internet信息服务(IIS)应用程序池 定期循环使用,以避免可能导致 应用程序崩溃、挂起或内存泄漏

只要应用程序池回收继续,就应该足够了。
但是,如果您真的希望大多数组件都具有一流的性能,那么还应该使用类似于您提到的应用程序初始化模块的功能。

我会使用B,因为与工作进程回收结合使用,意味着在回收过程中只会出现延迟。这避免了通常与响应空闲后第一个请求的初始化相关的延迟。您还可以保留回收的好处。

有关如何帮助解决性能问题的提示,请参阅本文。这包括“冷启动”部分下与启动相关的性能问题。无论您在本地或在生产中使用何种类型的服务器,这些都很重要

如果应用程序从XML反序列化任何内容(包括web服务…),请确保针对反序列化涉及的所有二进制文件运行SGEN,并将生成的DLL放入全局程序集缓存(GAC)。这将预编译程序集SGEN所使用的所有序列化对象,并将它们缓存在生成的DLL中。这可以在首次从磁盘反序列化(加载)配置文件和初始调用web服务时节省大量时间。

如果任何IIS服务器都没有对internet的传出访问权限,请通过在machine.config中添加generatePublisherEvidence=“false”来关闭证书吊销列表(CRL)检查Authenticode二进制文件。否则,当试图连接到internet以获取CRL列表超时时,每个工作进程在启动期间可能会挂起超过20秒。

http://msdn.microsoft.com/en-us/library/bb629393.aspx

考虑在所有程序集上使用NGEN。但是,如果不小心使用,这并不会带来多大的性能提升。这是因为每个进程加载的所有二进制文件的基本加载地址必须在构建时仔细设置,以避免重叠。如果由于地址冲突而在加载二进制文件时必须重新设置其基址,那么使用NGEN所获得的几乎所有性能收益都将丢失。


编写一个ping服务/脚本来攻击你空闲的网站是一个最好的方法,因为你将拥有完全的控制权。如果您租用了一个专用的主机箱,您提到的其他选项将可用


在共享托管空间中,预热脚本是最好的一级防御(自助是最好的帮助)。这里有一篇文章分享了一个。

网络托管挑战

您必须记住,如果您像我们中的许多人(小型公司和个人)一样托管在共享服务器上,那么任何机器配置选项都不可用

ASP.NET MVC开销

当我的网站在20分钟内没有被点击时,它至少需要30秒(并且web应用程序已经停止)。太可怕了

测试性能的另一种方法

还有另一种方法可以测试是ASP.NET MVC启动还是其他什么。在您的站点上放置一个普通的HTML页面,您可以直接点击它。
如果问题与ASP.NET MVC启动有关,则即使web应用尚未启动,HTML页面也会立即呈现。
这就是我第一次认识到问题出在ASP.NET MVC启动中的原因。 我随时加载一个HTML页面,它的加载速度非常快。然后,在点击HTML页面后,我点击了我的一个ASP.NETMVC URL,我会得到一条Chrome消息“waitingforraddev.us…”

另一个带有帮助脚本的测试

在那之后,我编写了一个LINQPad(Checkout for more)脚本,每8分钟(少于卸载应用程序的时间——应该是20分钟)就会出现在我的网站上,然后让它运行几个小时

当脚本运行时,我点击了我的网站,每次我的网站都以惊人的速度出现。这给了我一个好主意,我所经历的最有可能的缓慢是因为ASP.NET MVC启动时间

拿着LinqPad,你就可以
System.Timers.Timer webKeepAlive = new System.Timers.Timer();
Int64 counter = 0;
void Main()
{
    webKeepAlive.Interval = 5000;
    webKeepAlive.Elapsed += WebKeepAlive_Elapsed;
    webKeepAlive.Start();
}

private void WebKeepAlive_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    webKeepAlive.Stop();
    try
    {
        // ONLY the first time it retrieves the content it will print the string
        String finalHtml = GetWebContent();
        if (counter < 1)
        {
            Console.WriteLine(finalHtml);
        }
        counter++;
    }
    finally
    {
        webKeepAlive.Interval = 480000; // every 8 minutes
        webKeepAlive.Start();
    }
}

public String GetWebContent()
{
    try
    {
    String URL = "http://YOURURL.COM";
    WebRequest request = WebRequest.Create(URL);
    WebResponse response = request.GetResponse();
    Stream data = response.GetResponseStream();
    string html = String.Empty;
    using (StreamReader sr = new StreamReader(data))
    {
        html = sr.ReadToEnd();
    }
    Console.WriteLine (String.Format("{0} : success",DateTime.Now));
    return html;
    }
    catch (Exception ex)
    {
        Console.WriteLine (String.Format("{0} -- GetWebContent() : {1}",DateTime.Now,ex.Message));
        return "fail";
    }
}