【问题标题】:Sitecore - No App Pool RecycleSitecore - 没有应用程序池回收
【发布时间】:2013-10-19 06:57:59
【问题描述】:

我在使用 Sitecore CMS 时遇到了一个相当耗时的问题。

是否可以缩短每次对 bin 文件夹或 web.config 进行更改时应用程序池回收所需的时间?

更改后服务器需要 2 到 5 分钟才能立即响应。

有什么想法吗?

【问题讨论】:

  • 我目前在客户的网站上遇到了类似的问题,我很好奇 - 您是否使用 Lucene 索引以及它们有多大? (在文档计数和文件大小方面)。我有一种暗示,Sitecore 在启动时会花费大量时间将这些加载到内存中。

标签: c# iis sitecore application-pool


【解决方案1】:

我也有这个问题。

无论出于何种原因,在进行任何更改或重新启动网站后,我的本地副本都需要大约 5 分钟才能完全启动。测试任何东西绝对是可怕的。这只是当地的一个问题。我的开发服务器环境和生产似乎没有受到影响。

我发现了一个分析工具,它可以让我找到一个异常值控件,该控件需要花费大量时间来渲染。试试这个...

  1. 编译后启动您的网站。
  2. 登录此管理页面:http://local.example.com/sitecore/admin/stats.aspx
  3. 您会看到这样的屏幕: 寻找任何平均时间或最大时间高得离谱的东西。您的问题可能出在逻辑上。
  4. 作为奖励,如果您可以在长时间重新编译后继续点击页面而不会遇到太多麻烦,您应该注意到如果您的问题与我的问题类似,则每个页面点击的平均时间大致减半,以便您控制问题。

在我的例子中,我发现最大的问题来自一个控件,它对一个项目进行了昂贵的搜索。 看起来像这样 -> Sitecore.Context.Database.SelectItems("" + Sitecore.Context.Item.Paths.Path + "/ancestor-or-self::*[@@templateid='" + templateId + "']"); 这主要是一个本地问题,因为 SQL 服务器在我的机器上是远程的,而其他服务器在同一栋楼中。因此,开发和生产相对不受影响。

祝你好运!

【讨论】:

  • 然后您将这个缓慢的 XSLT 查询替换为 Sitecore 快速查询之类的东西?如果项目路径包含破折号字符 - 或其他保留字,则此查询还包含错误。你需要用 # 来逃避它
  • 我没有以这种方式搜索它,而是将其融入到 Sitecore.Context.Item 之外的一些逻辑中,如果父项的模板相同,我会在其中递归检查项的父项我正在寻找的 id。
  • @JanBluemink 我知道你对转义字符是正确的。它使俄勒冈州“或”成为一个非常有趣的州,有一个登陆页面。 :)
【解决方案2】:

您可以减少核心、主数据库和 Web 数据库上的预取缓存大小,但不建议这样做,仅在开发机器上执行此操作,而不是在生产服务器上执行此操作。

【讨论】:

    【解决方案3】:

    这里有一篇来自 sitecore 的 alex shyba 的文章Reducing Sitecore Startup time

    文章摘要是

    • 在 machine.config 中:禁用进程以检查程序集签名
    <runtime>  
        <generatePublisherEvidence enabled="false"/>
    </runtime>
    
    • 在 Sitecore web.config 中禁用性能计数器
    <setting name="Counters.Enabled" value="false" />
    

    关于提高站点核心性能的文章很多,我在下面列出了几个链接:

    【讨论】:

    • 在 MSDN 上它说这个元素不会影响 .NET 4 之后的程序集加载时间。我不确定这是否仍然适用。
    • @subkamran 我现在使用的是 .Net 4.5,但在 Sitecore 7.2 中我仍然面临同样的问题。
    • @SachinB.R.如果您没有在开发环境中使用分析,即没有在 Sitecore DMS 上工作,那么您可以禁用此设置 &lt;setting name="Analytics.Enabled" value="true" /&gt;。它位于Sitecore.Analytics.config 这将有所帮助。
    【解决方案4】:

    你可以关注Alex Shyba's post here

    但是 2-5 分钟听起来很极端。这不正常。你的硬件是最新的吗? 另外我会查看您的预取缓存。在您的开发环境中,您可能不希望 i 在启动时获取太多信息,因为这在开发中不需要。

    我还会查看初始化管道和 global.asax,看看您是否正在执行任何自定义启动作业。

    【讨论】:

      【解决方案5】:

      他需要重新启动应用程序池才能加载新的 dll。
      您可以尝试最小化您在启动时所做的事情(但我猜它主要是您无法影响的站点核心内容)所以我可以给出的最佳建议是拥有 2 个带有内容切换的网络服务器。

      您将在 2 台服务器上运行您的应用程序,内容切换决定哪台服务器处理哪个请求(注意会话和静态,因为每台服务器都不知道对方)。
      如果在某个时候您需要发布一个新版本,您只需指示您的内容切换将所有流量定向到网络服务器 A。然后部署到网络服务器 B,通过不通过内容切换的直接 url 打开网站并确保它工作正常+预热。
      然后你告诉内容开关将所有流量指向 B,你就有时间更新网络服务器 A 并将内容开关切换回正常模式。

      【讨论】:

      • 也许我用错了,回收是不可避免的,但整个过程对我来说似乎太长了。我可以以某种方式缩短它吗?
      • 除了升级硬件或使用内容开关外,您只能查看您控制的代码。回收后,应用程序池将再次实例化,因此请查看在应用程序启动时运行的代码,并确保它尽可能少地运行。
      猜你喜欢
      • 2015-01-07
      • 1970-01-01
      • 2011-09-20
      • 2016-06-13
      • 2013-01-01
      • 2011-01-12
      • 1970-01-01
      • 1970-01-01
      • 2014-10-16
      相关资源
      最近更新 更多