随着时间推移传播/平滑周期性任务

时间:2012-02-04 09:34:57

标签: algorithm language-agnostic statistics probability

我有一个包含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分钟。

3 个答案:

答案 0 :(得分:1)

执行完全刷新,以使所有时间戳同步。从那时起,每10分钟刷新最旧的N / 24条记录。

负载从一开始就是稳定的,经过24次运行(4小时)后,所有记录将以4小时为间隔进行更新(如果N是固定的)。插入将减少刷新间隔;删除可能会导致增加或减少,具体取决于删除的记录的时间戳。但我怀疑你需要删除相当多的东西(比如,你的桌子的10%),然后再开始推动40分钟窗口以外的任何东西。为了安全起见,每次运行可以做到N / 24以上。

答案 1 :(得分:0)

Each minute: 
  take all records older than 4:10 , refresh them
  If the previous step did not find a lot of records:
      Take some of the oldest records older than 3:40, refresh them.

这最终应该使最后更新时间更均匀地间隔开。什么“很多”和“一些”意味着你应该自己决定(可能基于N)。

答案 2 :(得分:0)

为每条记录提供自己的刷新间隔时间,这是3:40到4:20之间的随机数。