Hangfire保持运行SQL查询,即使是非活动的

本文关键字:即使是 非活动 查询 SQL 运行 Hangfire | 更新日期: 2023-09-27 17:49:43

我正在开发一个ASP.net MVC 5网站,我正在使用Hangfire来调度一些任务,在这种情况下每3分钟一个。我知道一个事实,它只需要几秒钟来运行这样的任务(以及与之相关的DB查询)。

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

我不能这样投入生产,因为我担心这会导致性能问题。任何帮助将是最感激的,谢谢提前

Hangfire保持运行SQL查询,即使是非活动的

我在自己的服务器上用MVC app + 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)

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

这个问题显然是通过调整轮询间隔引起并修复的,请参阅http://docs.hangfire.io/en/latest/configuration/using-sql-server.html

的相应部分。

默认间隔为15秒,这既确保了作业的及时处理,又保证了服务器负载的恒定。在非时间关键型应用程序中,较长的时间间隔(1分钟、5分钟等)应该是可以的。了解您需要什么并对其做出反应:需要近乎即时的作业处理还是低服务器负载?如果是前者,保持间隔较短,并考虑在需要时扩大服务器;如果是后者,则将间隔增加到可接受的最高最小值。

我需要前者,我会密切关注服务器是否能承受负载

我也注意到当打开一些仪表板视图时发出了许多查询,似乎仪表板统计轮询间隔和sql server轮询间隔必须设置为足够合理的值,以避免sql server泛滥(以下是来自ASP. js . html)。. NET Core 2.0与Hangfire 1.7的实现):

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
});