10

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

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

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

4

2 回答 2

12

我使用 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 分钟等)应该没问题。了解您的需求并做出反应:需要近乎即时的作业处理或低服务器负载?如果是前者,请保持较短的间隔,并在需要时考虑升级服务器;如果是后者,则将间隔增加到可接受的最高最小值。

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

于 2015-05-19T20:42:44.847 回答
5

我还注意到在打开某些仪表板视图时会发出很多查询,并且似乎仪表板统计信息轮询间隔和 sql 服务器轮询间隔都必须设置为足够合理的值以避免淹没 SQL Server(以下来自 ASP .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
});
于 2019-04-08T09:02:50.807 回答