【问题标题】:IIS 10 Application Pool fall a sleepIIS 10 应用程序池进入睡眠状态
【发布时间】:2018-12-23 05:03:36
【问题描述】:

我们有内部使用的 ASP.NET Core 应用程序,在办公时间使用,还有一个批处理应该在每天早上 3 点处理,由HangFire 安排,如下所示:

RecurringJob.AddOrUpdate(
                () => MyBatch(),
                "0 0 3 1/1 *");

问题是应用程序池进入睡眠状态,如果站点没有手动启动(通常通过访问该网站),批处理不会被处理。

我搜索了 SO 并在应用程序池中篡改了这些设置,但没有成功:

我用来修改设置的一些来源:

应用程序池总共被 7 个应用程序使用(在应该处理批处理的夜间,所有应用程序都处于非活动状态)。使用的应用程序池使用.NET CLR Version 2.0。 我使用的是 IIS 版本 10.0.17134.1。

如何使应用程序池保持活动状态,以便每天早上定期调用批处理?

【问题讨论】:

  • 据我了解,您的设置应该可以工作。您是否尝试过将其移至自己的应用程序池?
  • 感谢您的评论@PieterAlberts!我现在为此应用程序创建了一个新的应用程序池 (AP)。我注意到之前 AP 上的.NET CLR Version2.0。我不确定这是否有任何区别,但根据stackoverflow.com/questions/49185512/…,我可以将No managed code 用于核心应用程序,我将在此AP 中测试这些应用程序以及与之前AP 中相同的更改。
  • @PieterAlberts 将站点移至其自己的 AP 时运气不佳 =/
  • 这真的很糟糕。好吧,我的想法很新鲜......如果你真的需要解决这个问题,可以为你的问题添加 +50 赏金?
  • 在这个post 他们解释说Kestrel 进程在IIS 应用程序池被回收时被杀死并且IIS 可能会重新启动,但对于Kestrel 这只是当有新请求进来时(通过IIS)。除了建议将您的应用程序移动到调度程序或 Windows 服务之外,与此同时,作为一种快速而肮脏的解决方法,您可以安排 CURLPowerShell 脚本向您的网站将所需时间作为“唤醒电话”。

标签: iis iis-10


【解决方案1】:

我遇到了同样的问题,我的 ASP.NET 核心应用程序进入空闲状态,即使应用程序池的启动模式为“AlwaysRunning”,站点的“Preload Enabled”设置为 true,空闲超时设置为 0。 我通过安装 Application Initialization module 并将 .NET CLR 版本设置为 v4.0 使其工作。不要使用“无托管代码”,因为这会阻止始终运行触发应用程序启动。

我为此写了blog post,更详细地解释了我为使应用程序持续运行而采取的步骤。

【讨论】:

  • 感谢您的回答,我现在实施了更改并进行了测试!
  • 将 .NET CLR 版本设置为 v4.0 为我解决了这个问题。
【解决方案2】:

他们获得了有关如何设置服务以在不停止的情况下运行的文档。

http://docs.hangfire.io/en/latest/deployment-to-production/making-aspnet-app-always-running.html#enabling-service-auto-start

我的经验(对于较旧的 IIS 版本 7.5、8.0)是它可以工作,但不适用于应用程序池回收/域卸载。 我的解决方法是在 application_end 事件上发送初始化请求。

【讨论】:

  • 我们终于切换到将核心应用托管为 Windows 服务,而不是 IIS 应用,以解决应用重启问题
  • 在我的例子中,它是一个网络应用程序的一部分,所以最后解决了一个问题。
【解决方案3】:

如上所述-您需要启用服务自动启动-除此之外,如果您遇到多个异常,我发现过去使用 HangFire 时快速故障保护已关闭应用程序池。因此,在应用程序池上禁用(或增加到合理的限制)也是值得的。

【讨论】:

    【解决方案4】:

    我建议您首先在您的进程中对 HTTP 地址进行一次调用,就像 ping 一样,如果由于某种原因它没有运行,这足以触发站点启动。

    另一件事是,根据微软在MSDN 的描述,“AlwaysRunning”选项将是:

    "指定 Windows 进程激活服务 (WAS) 将 始终启动应用程序池。此行为允许应用程序 在任何服务任何 HTTP 之前加载操作环境 请求,这减少了初始 HTTP 的启动处理 应用程序的请求。”

    这可能是为了生成网页编译,该编译在第一次调用时完成,在任何请求到来之前完成,但可能并不总是真正运行应用程序。

    【讨论】:

      【解决方案5】:

      我在共享 IIS 主机上,无法访问大多数设置。我所做的是添加一个循环作业,该作业将在小于 IIS 超时/空闲的分钟间隔内触发。

      RecurringJob.AddOrUpdate<IMyKeepAliveService>("KeepHangFireAlive", svc => svc.KeepHangFireAlive(URL_TO_SELF), "*/4 * * * *");
      

      以上 CRON 足以防止 IIS App pool 进入休眠状态。 我使用 RestSharp 向“Self”发出一个微小的 ping/GET 请求。

      【讨论】:

        猜你喜欢
        • 2011-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-21
        • 1970-01-01
        • 2021-10-01
        • 1970-01-01
        • 2012-07-14
        相关资源
        最近更新 更多