IIS 8 AppPool使用过多的资源,如何找到罪魁祸首?

时间:2015-04-15 08:41:55

标签: asp.net-mvc performance iis umbraco

在我的工作场所,我们一直忙着保持.NET网络应用程序(基于Umbraco),并且运行起来非常庞大的数据库。我们已经完成了本书中几乎所有可能的技巧,以降低资源使用率,但它根本不起作用。

这是一个非常繁忙的网站,现场网站遭遇严重的性能问题。我们最初在Azure上运行该站点并进行升级,看起来没那么好(仍然很迟钝),但由于Umbraco无法正确处理Azure上的多个实例*并且需要花费大量时间来修复这些内容,因此我们不得不将其移至单个而不是非天蓝色的专用服务器。

拥有6个内核和12GB内存,当网站真正活跃时,该网站仍然可以使用(假设每分钟有100个请求)。

寻求帮助的呼声:任何人都可以协助我们如何确定造成这种情况的原因,因为我们实际上已经没有想法了,只是想知道网站正在做什么那么耗尽很多CPU以及为什么它的存储容量接近2GB。

当网站没有那么活跃时,比如午夜,它表现不错,所以看起来IIS似乎无法处理那么多请求(这对我来说似乎不太可能,但没关系)。有没有我们不知道的技巧?我们可以在多个处理程序中分离应用程序池吗?

*我们不确定这是Azure正在做的还是Umbraco的,我们经历了源代码,它似乎正确地锁定文件和线程,但我们仍然遇到很多问题,其中实例发生冲突。

1 个答案:

答案 0 :(得分:2)

这是一个非常广泛的问题,但根据我对umbraco的经验,我看到的最大性能是在缓存部分视图之后。这是我的实施:

public static class CachedPartialExtensions
{
    public static IHtmlString MyCachedPartial(
                        this HtmlHelper htmlHelper,
                        string partialViewName,
                        object model,
                        int seconds,
                        bool cacheByPage = false)
    {

        var cacheKey = "fpc-";  //prefix to know which keys to clear on page publish 
        cacheKey += cacheByPage ? "page-" + UmbracoContext.Current.PageId : "global";
        cacheKey += partialViewName;

        var partial = HttpContext.Current.Cache[cacheKey] as MvcHtmlString;
        if (partial == null)
        {
            partial = htmlHelper.Partial(partialViewName, model);
            if(partial != null)
            {
                HttpContext.Current.Cache.Add(cacheKey, partial, null,
                    DateTime.Now.AddSeconds(seconds), Cache.NoSlidingExpiration, CacheItemPriority.Normal, null);
            }
        }
        return partial;
    }

    public static DateTime Hours(this int hours)
    {
        return DateTime.Now.AddHours(hours);
    }
}

例如,如果您调用的每个页面的菜单都相同

@Html.MyCachedPartial("Global/_Menu", Model, 24.Hours())

如果您有特定于页面的部分视图,则可以调用

@Html.MyCachedPartial("Global/_PageLeftMenu", Model, 24.Hours(), cacheByPage: true)

我们缓存24小时或发布/取消发布事件:

public class MyApplicationEventHandler : ApplicationEventHandler
{
    protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
    {
        ContentService.Published += ContentServicePublished;
        ContentService.UnPublished += ContentService_UnPublished;
    }

    void ContentService_UnPublished(IPublishingStrategy sender, PublishEventArgs<IContent> e)
    {
        ClearCache(e.PublishedEntities);
    }

    private void ContentServicePublished(IPublishingStrategy sender, PublishEventArgs<IContent> args)
    {
        ClearCache(args.PublishedEntities);
    }

    private void ClearCache(IEnumerable<IContent> nodes)
    {
        var cacheKeys = ((IEnumerable)HttpContext.Current.Cache).Cast<DictionaryEntry>()
                                                                .Select(de => de.Key.ToString())
                                                                .ToList();

        var cacheKeysToClear = cacheKeys.Where(key => key.StartsWith("fpc-global")).ToList(); 
        foreach (var node in nodes)
        {
            cacheKeysToClear.AddRange(cacheKeys.Where(key => key.StartsWith("fpc-page-" + node.Id)));
        }

        cacheKeysToClear.ForEach(key => HttpContext.Current.Cache.Remove(key)); 
    }
}

在此之后,我们看到了前端性能的显着提升以及CPU使用率的急剧下降。

希望这有帮助。