2

有一大堆对象。集合是动态的:可以随时添加或删除对象。我们称对象总数为N

每个对象都有两个属性:上次更新的质量 ( M ) 和时间 ( T )。

X分钟应该选择一小批进行处理,这会将它们的T更新为当前时间。批次中所有对象的总M是有限的:不超过L

我希望在这里解决三个任务:

  1. 找到下一批对象拾取算法;
  2. 引入对象类:简单优先(至少适合每个第 n 个批次)和频繁(适合每个批次);
  3. 预测系统容量耗尽(添加下一个服务器的时间 = 增加L)。

什么样的模型最能描述这样的系统?

整个事情是关于按时间间隔处理“对象”的服务。每个对象应每 N 小时“测量”一次。N 可以在一个范围内变化。X是固定的。

对象由人类添加/删除。N呈指数增长,相当缓慢,有一些由出版物引起的峰值。当然预测不能准确,只是一些估计。M在 0 到 1E7 之间变化,呈指数分布,大多数接近于 0。

我看到这里可以有几种策略:

A.全油门——每批包装尽可能接近 100%。随着N的增长,特定对象被击中的平均间隔将会增长。

B.平等的气质:) - 尝试将平均间隔保持在某个值附近。批次填充水平将从某个低水平增长。当它接近 100% 时——是时候获得更多服务器了。

C. - ?

4

2 回答 2

3

这是针对您的问题的非常完整的设计。

您的问题与您对系统的描述不匹配。所以我假设描述是准确的。

当您安排测量时,您应该传递一个对象,第一次可以测量它,并且当您希望测量发生时。对象应该有一个weight属性和一个measured方法。当测量发生时,该measured方法将被调用,而您的类之间的区别在于它们是否以及使用什么参数会重新安排自己。

在内部,您将需要几个优先级队列。有关如何实现的详细信息,请参阅http://en.wikipedia.org/wiki/Heap_(data_structure) 。

第一个队列是按时间进行测量,所有尚未测量的对象。每次安排批次时,您都将使用它来查找可能发生的所有新测量。

第二个队列是现在准备好进行的测量,并按它们应该在哪个调度周期发生,然后是权重进行组织。我会让他们都上升。您可以通过从该队列中拉出项目来安排批次,直到您有足够的发送时间。

现在你需要知道每批放多少。鉴于您所描述的系统,可以手动输入事件尖峰,但随着时间的推移,您希望这些尖峰平滑。所以我会推荐选项B,平等的气质。因此,要做到这一点,当您将每个对象放入“立即就绪”队列时,您可以将其“平均工作量”计算为它的权重除以它应该发生的周期数。将其与对象一起存储,并保持您应该达到的运行速度的运行总和。每个时期我都建议您继续添加批次,直到满足以下三个条件之一:

  1. 你用完了对象。
  2. 您达到了最大批量容量。
  3. 您的跑步总重量超过平均工作重量的 1.1 倍。额外的 10% 是因为现在使用更多的容量比以后用完容量要好。

最后,容量规划。

为此,您需要使用一些启发式方法。这是一个合理的,可能需要对您的系统进行一些调整。保持你过去 10 次测量的平均工作重量的数组。保持“高水位线的指数衰减平均值”。通过根据公式每次更新来做到这一点:

average_high_water_mark = 0.95 * average_high_water_mark + 0.5 * max(最后 10 次跑步工作重量)

例如,如果average_high_water_mark达到最大容量的 2 台服务器,则添加更多服务器。(这个想法是服务器应该能够在不让你被冲洗的情况下死掉。)

于 2014-10-20T16:45:39.100 回答
0

我认为答案A很好。装箱是最大化或最小化,你只有一批。按 m 和 n 对对象进行排序。

于 2014-10-20T10:52:26.623 回答