修复IIS的缓慢初始负载


129

IIS对于低流量的网站具有烦人的功能,在该网站中,它回收未使用的工作进程,从而导致第一位用户在经过一段时间后获得非常长的延迟(超过30秒)。

我一直在寻找解决问题的方法,并且找到了这些潜在的解决方案。

A. 使用应用程序初始化插件

B. 在.NET 4中使用自动启动

C. 禁用空闲超时(在“ IIS重置”下)

D. 预编译站点

我想知道其中哪一个是更可取的,更重要的是,为什么对同一个问题有这么多解决方案?(我的猜测是不是,我只是不正确地理解某些内容)。

编辑

执行C似乎足以使我的网站保持热身,但是我发现我网站缓慢的真正根源与Entity Framework有关,我似乎无法弄清楚它为什么变冷。看到这个问题,很遗憾,尚未回答!

我最终只需要制作一个热身脚本来偶尔访问我的网站,以确保它保持快速运行。


嗨,朋友,表演C够了吗?为什么呢 我们只需要使用它还是需要禁用回收?我总是觉得IIS7.5的第二天第一次请求非常慢
qakmak

Answers:


36

选项A,B和D似乎属于同一类别,因为它们仅影响初始启动时间,它们对网站进行预热,如编译和将库加载到内存中。

使用C来设置空闲超时应该足够了,以便可以快速处理对服务器的后续请求(重新启动应用程序池需要花费一些时间-几秒钟)。

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

除了在用户不活动的情况下关闭应用程序池这一事实之外,默认情况下,应用程序池还将每隔1740分钟(29小时)进行回收。

从technet:

可以定期回收Internet信息服务(IIS)应用程序池,以避免可能导致应用程序崩溃,挂起或内存泄漏的不稳定状态。

只要保留应用程序池回收,就足够了。但是,如果您真的想为大多数组件提供一流的性能,则还应该使用您提到的“应用程序初始化模块”之类的东西。


因此,您是否建议仅禁用空闲超时?这会引起问题吗(我猜它在那里是有原因的)?
卡文·冯·德伊伦

3
这实际上并不能解决我的问题(请参阅我的编辑),但是我接受了,因为您确实回答了我的原始问题。
卡文·冯·戴伦

10

虚拟主机挑战

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

ASP.NET MVC开销

当我的网站在20分钟内没有被点击(并且该网络应用已停止)时,至少需要30秒。这很糟糕。

测试性能的另一种方法

还有另一种方法来测试它是您的ASP.NET MVC启动还是其他。在您的网站上放一个普通的HTML页面,您可以直接点击它。
如果问题与ASP.NET MVC启动有关,则HTML页将几乎立即呈现,即使尚未启动Web应用程序也是如此。
这就是我最初认识到问题出在ASP.NET MVC启动中的方式。我可以随时加载HTML页面,而且加载速度很快。然后,在访问该HTML页面后,我访问了我的ASP.NET MVC URL之一,并且得到了Chrome消息“ Waiting for raddev.us ...”。

另一个有用脚本的测试

之后,我编写了一个LINQPad(更多信息,请访问http://linqpad.net)脚本,该脚本每8分钟(少于应用程序的卸载时间-应该是20分钟)访问我的网站一次,它运行了几个小时。

当脚本运行时,我访问了我的网站,每次我的网站运行起来都非常快。这给了我一个好主意,我最可能遇到的速度缓慢是由于ASP.NET MVC启动时间。

获取LinqPad,您可以运行以下脚本-只需将URL更改为您自己的URL,然后使其运行即可轻松进行测试。祝好运。

注意:在LinqPad中,您需要按F4并添加对System.Net的引用以添加将检索页面的库。

:确保将String URL变量更改为指向将从ASP.NET MVC站点加载路由的URL,以便引擎运行。

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";
    }
}

3

编写ping服务/脚本来访问闲置的网站是最好的方法,因为您将拥有完全的控制权。如果您租用了专用主机箱,则可以使用您提到的其他选项。

在共享主机空间中,热身脚本是最好的一级防御(自助是最好的帮助)。这是一篇文章,分享了有关如何通过自己的Web应用程序执行此操作想法


刚刚更新了这个旧主题,以防有人搜索相同主题
David Chelliah,2016年

2

我之所以使用B,是因为B与工作人员流程回收一起意味着在回收过程中只会有一个延迟。这避免了通常与响应于空闲后的第一个请求的初始化相关的延迟。您还可以保留回收的好处。


2

按计划对站点执行ping操作的一个不错的选择是使用Microsoft Flow,它每月免费提供多达750次“运行”。创建一个每小时都会在您的站点上运行的Flow以使其保持温暖非常容易。您甚至可以通过创建单个流并延迟分隔站点的多个匹配项来解决其750的限制。

https://flow.microsoft.com


1

请参阅本文以获取有关如何解决性能问题的提示。这包括“冷启动”部分下与启动相关的两个性能问题。无论您使用的是本地或生产中的哪种类型的服务器,大多数情况都至关重要。

http://blogs.msdn.com/b/mcsuksoldev/archive/2011/01/19/common-performance-issues-on-asp-net-web-sites.aspx

如果应用程序反序列化XML中的任何内容(包括Web服务…),请确保针对与反序列化有关的所有二进制文件运行SGEN,并将生成的DLL放入全局程序集缓存(GAC)中。这将对运行了SGEN的程序集使用的所有序列化对象进行预编译,并将它们缓存在生成的DLL中。这样可以在磁盘上第一次反序列化(加载)配置文件以及首次调用Web服务时节省大量时间。 http://msdn.microsoft.com/zh-CN/library/bk3w6240(VS.80).aspx

如果任何IIS服务器没有对Internet的出站访问权限,请通过将generatePublisherEvidence =“ false”添加到machine.config中来关闭对证书验证列表进行身份验证的证书吊销列表(CRL)。否则,每个工作进程在启动过程中可能会挂起20秒钟以上,而尝试连接到Internet以获得CRL列表却超时。 http://blogs.msdn.com/amolravande/archive/2008/07/20/startup-performance-disable-the-generatepublisherevidence-property.aspx

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

考虑在所有程序集上使用NGEN。但是,如果不仔细使用,则无法获得很多性能提升。这是因为每个进程加载的所有二进制文件的基本加载地址都必须在构建时仔细设置,以免重叠。如果二进制文件由于地址冲突而在加载时必须重新设置基础,则使用NGEN的几乎所有性能提升都将丢失。 http://msdn.microsoft.com/zh-CN/magazine/cc163610.aspx


0

闲置4分钟后,我对第一个请求的响应持续出现15秒的延迟。我的问题是我的应用程序对SQL Server使用Windows集成身份验证,并且服务配置文件位于与服务器不同的域中。在应用初始化时,这导致了从IIS到SQL的跨域身份验证-这是造成延迟的真正原因。我改为使用SQL登录而不是Windows身份验证。延迟立刻消失了。我仍然拥有所有应用程序初始化设置来帮助提高性能,但是就我而言,可能根本不需要它们。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.