10

私は ASP.net MVC 5 Web サイトを開発しており、いくつかのタスクをスケジュールするために Hangfire を使用しています。この場合は 3 分ごとに 1 つだけです。そのようなタスク (およびそれに関連付けられた DB クエリ) を実行するのに数秒しかかからないことを私は知っています。

私が直面している問題は、Hangfire で SQL Server が "何か" を実行しているように見え (何なのかわかりません)、SQL Server アクティビティ モニターで、CPU の使用率が常に 20% 以上であることがわかります。 (平均 1.2 MB/秒) のデータベース I/O 操作があります。初期化しないと、Activity Monitor (および Task Manager) に余分なオーバーヘッドが表示されないため、Hangfire であることはわかっています。スケジュールされたすべてのタスクと Hangfire が実行できるあらゆるものを削除するところまで行きましたが、それでも問題は解決しません。

パフォーマンスの問題が発生する可能性があるため、このような本番環境に行くことはできません。どんな助けでも大歓迎です、事前に感謝します

4

2 に答える 2

12

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 分など) で問題ありません。必要なものを把握し、それに対応する: すぐにジョブを処理する必要があるか、サーバーの負荷を低くする必要がありますか? 前者の場合は、間隔を短く保ち、必要に応じてサーバーのサイズを大きくすることを検討してください。後者の場合は、間隔を最大許容最小値まで増やします。

前者が必要で、サーバーが負荷に耐えられるかどうかを監視します。

于 2015-05-19T20:42:44.847 に答える