私はN
のレコードを持つデータベーステーブルを持っています。それぞれのテーブルは4時間ごとにリフレッシュする必要があります。 「リフレッシュ」操作はかなりリソースを消費します。私は時折実行されるスケジュールされたタスクを書いて、それらをリフレッシュして、負荷のスパイクを滑らかにしたいと思います。定期的な作業を時間外に分散/平滑化する
every 10 minutes:
find all records that haven't been refreshed in 4 hours
for each record:
refresh it
set its last refresh time to now
(技術的な詳細::;それだけピックアップして実行するワーカースレッドプールのタスクをキューに上記非同期であり、「それはリフレッシュ」
私が始めた、最も単純なタスクは、この(擬似コード)であります)
この原因は、4時間ごとに巨大なリソース(CPU/IO)の使用が急増し、残りの時間が空転することです。マシンは他のものもやっているので、これは悪いです。
これらのリフレッシュを多かれ少なかれ均等に配置する方法を見つけようとしています。つまり、N/(10mins/4hours)
の周りに、N/24
のように、毎回リフレッシュしたいと思います走るもちろん、正確である必要はありません。
注:
- 私だけではめったにとして、私は、(その最初の24時間のスパイクがあるでしょうが、それらは、時間をかけて滑らかになり、言う)アルゴリズムは、作業を開始するために時間を割いてと大丈夫ですよスケジューラーをオフラインにする予定です。
- レコードは他のスレッドによって絶えず追加されたり削除されているので、反復の間には
N
の値については何も想定できません。 - 4時間+/- 20分ごとにレコードが更新されても問題ありません。
レコードが頻繁に更新される場合(10分に2回など)は問題ですか?もちろん、長期的にはそうではありませんが、最初の移行中に許可されていれば事態を単純化するかもしれません。 –
ええ、それはいいです。夕方になると全体的な作業が増えることは明らかですが、平均的なケースではCPUが駄目にならない限りは問題ありません。 – nitwit
通常、アップデートにはどのくらいの時間がかかりますか? (ジョブキューが空になるまでの時間) –