在我的工作场所,我们一直忙着保持.NET网络应用程序(基于Umbraco),并且运行起来非常庞大的数据库。我们已经完成了本书中几乎所有可能的技巧,以降低资源使用率,但它根本不起作用。
这是一个非常繁忙的网站,现场网站遭遇严重的性能问题。我们最初在Azure上运行该站点并进行升级,看起来没那么好(仍然很迟钝),但由于Umbraco无法正确处理Azure上的多个实例*并且需要花费大量时间来修复这些内容,因此我们不得不将其移至单个而不是非天蓝色的专用服务器。
拥有6个内核和12GB内存,当网站真正活跃时,该网站仍然可以使用(假设每分钟有100个请求)。
寻求帮助的呼声:任何人都可以协助我们如何确定造成这种情况的原因,因为我们实际上已经没有想法了,只是想知道网站正在做什么那么耗尽很多CPU以及为什么它的存储容量接近2GB。
当网站没有那么活跃时,比如午夜,它表现不错,所以看起来IIS似乎无法处理那么多请求(这对我来说似乎不太可能,但没关系)。有没有我们不知道的技巧?我们可以在多个处理程序中分离应用程序池吗?
*我们不确定这是Azure正在做的还是Umbraco的,我们经历了源代码,它似乎正确地锁定文件和线程,但我们仍然遇到很多问题,其中实例发生冲突。
答案 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使用率的急剧下降。
希望这有帮助。