【问题标题】:Hangfire keeps running SQL queries even when inactive即使在不活动的情况下,Hangfire 也会继续运行 SQL 查询
【发布时间】:2015-05-19 20:16:16
【问题描述】:

我正在开发一个 ASP.net MVC 5 网站,我正在使用 Hangfire 来安排一些任务,在这种情况下每 3 分钟一次。我知道运行这样的任务(以及与之关联的数据库查询)只需要几秒钟。

我面临的问题是,Hangfire 似乎让我的 SQL Server 运行“某事”(我不知道是什么),我可以在 SQL Server 活动监视器中看到我的 CPU 始终保持在 20+ % 使用率和数据库 I/O 操作(平均 1.2 MB/秒)。我知道它是 Hangfire,因为当我不初始化它时,活动监视器(和任务管理器)不会显示额外的开销。我什至已经删除了所有计划任务以及 Hangfire 可以运行的任何/所有内容,但问题仍然存在。

我不能像这样进行生产,因为我担心这可能会导致性能问题。任何帮助将不胜感激,在此先感谢

【问题讨论】:

  • 任何重试失败的任务?
  • 只是一个,很久以前(5 个月),但没有别的,在我注意到 SQL 的任何性能惩罚之前它就失败了

标签: c# sql-server asp.net-mvc hangfire


【解决方案1】:

我在自己的服务器上使用 MVC 应用程序 + hangfire 对此进行了一些调查。事实上,我的 CPU 使用率也是 20-25%。所以我搜索了一个合适的监控应用程序,安装了一个漂亮的小工具,叫做“SQLRanger”,发现到目前为止最热门的查询是这样的:

update top (1) HangFire.JobQueue set FetchedAt = GETUTCDATE()
output INSERTED.Id, INSERTED.JobId, INSERTED.Queue
where FetchedAt is null
and Queue in (@queues1)

所以它基本上是检查等待执行的作业。到目前为止,我还没有遇到任何性能问题或滞后。

这个问题显然是由调整轮询间隔引起的 - 并且已经解决 - 请参阅http://docs.hangfire.io/en/latest/configuration/using-sql-server.html的相应部分

默认间隔为 15 秒,这可确保及时处理作业,同时确保服务器负载恒定。在非时间关键型应用中,较高的间隔(1 分钟、5 分钟等)应该没问题。 了解您的需求并做出反应:需要近乎即时的作业处理或低服务器负载?如果是前者,请保持较短的间隔,并在需要时考虑升级服务器;如果是后者,则将间隔增加到可接受的最小值。

我需要前者,会留意服务器是否能承受负载。

【讨论】:

  • 我认为它必须是这样的,某种重复查询,但我无法看到该查询,我也在 SQL 中搜索它,但到目前为止无济于事
  • 谢谢@LocEngineer,这解释了为什么使用,而不是我们需要找到解决方案,非常感谢你,我对你的答案投了赞成票,但我无法将问题标记为已解决,直到找到了解决办法。
  • 见上面的附录。 TANSTAAFL :-)
  • 谢谢,这也是我的问题。
【解决方案2】:

我还注意到当打开某些仪表板视图时会发出很多查询,并且仪表板统计信息轮询间隔和 sql server 轮询间隔似乎都必须设置为一个足够合理的值以避免泛滥SQL Server(以下来自使用 Hangfire 1.7 的 ASP.NET Core 2.0 实现):

services.AddHangfire(opt => opt.UseSqlServerStorage(Configuration.GetConnectionString("Default"),
    new SqlServerStorageOptions
    {
        CommandBatchMaxTimeout = TimeSpan.FromMinutes(5),
        QueuePollInterval = TimeSpan.FromSeconds(30),
        UseRecommendedIsolationLevel = true,
        UsePageLocksOnDequeue = true,
        DisableGlobalLocks = true
    }));

app.UseHangfireDashboard("/hangfire", new DashboardOptions
{
    Authorization = new [] {new HangfireDashboardAuthorizationFilter()},
    StatsPollingInterval = 30000
});

【讨论】:

  • 当我在本地启动一个项目并看到一个调试工具时,我也很惊讶......我认为很多查询也可能在 Prod 中被垃圾邮件发送......幸运的是,我已经看到我有如我所见,在本地打开的带有hangfire仪表板的选项卡每3秒抓取一次所有统计信息。如果您也在本地开发环境之外使用仪表板,StatsPollingInterval 选项配置可以减少垃圾邮件。我认为在大多数情况下,大约 10000 毫秒要好得多。
  • 我们注意到 Hangfire 的 db 调用量激增,并发现这是因为仪表板在机器上打开。感谢您为我指明方向!
猜你喜欢
  • 2021-05-13
  • 2017-10-06
  • 2019-09-21
  • 2015-08-21
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多