即使处于非活动状态,Hangfire也会继续运行SQL查

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了即使处于非活动状态,Hangfire也会继续运行SQL查相关的知识,希望对你有一定的参考价值。

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

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

我不能这样做,因为我担心这可能会导致性能问题。任何帮助将非常感谢,提前感谢

答案

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

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

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

默认时间间隔为15秒,可确保快速处理作业,但也可确保持续的服务器负载。在非时间关键型应用中,更高的间隔(1分钟,5分钟等)应该没问题。了解您的需求并做出反应:需要立即处理作业或低服务器负载吗?如果是前者,请保持间隔时间,并考虑在需要时增大服务器的大小;如果是后者,则将间隔增加到可接受的最低值。

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

另一答案

我还注意到在打开一些仪表板视图时发出了很多查询,并且似乎必须将仪表板统计信息轮询间隔和sql server轮询间隔设置为足够合理的值以避免泛滥SQL Server(以下内容来自ASP使用Hangfire 1.7)实现.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
});

以上是关于即使处于非活动状态,Hangfire也会继续运行SQL查的主要内容,如果未能解决你的问题,请参考以下文章

即使应用程序处于非活动状态,CursorLoader 如何自动更新视图?

即使用户杀死应用程序,NSURLSessionDownloadTask 也会继续下载

如何处理 HTTP 412(前提条件失败)- 设备处于非活动状态

当应用程序处于非活动状态时可以接收 UIAccelerometer 更新吗?

检测应用程序处于后台/非活动状态时是不是触发了本地通知

Unity 2D 中的视频播放器播放音频但在处于非活动状态后设置为活动时不显示视觉效果