在我实现简单的负载均衡服务时,我认为Big-O是其未来性能和可扩展性的关键因素。但我找不到关于两种算法的大O的参考(WRR& RR)。
我试着计算它们。
(警告我的计算可能有误,但我会在得到正确答案后立即编辑帖子)
正>服务节点数(和权重)
Z->等待/未完成任务的数量
对于WRR:O(n n z)
对于RR:O(z ^ 2)
For WRR: O(1)
For RR: O(1)
所以真正的问题是,如果我的计算是正确的,但最重要的是哪种算法在连续负载平衡(每个运行节点)的情况下执行速度最快,每秒提交数千个任务。
一些有用的参考资料:
干杯!
答案 0 :(得分:0)
那么您需要测量的是什么?由于大O用于算法性能,因此测量合理的是每个调度决策的时间复杂度,即将一个任务与一个节点匹配需要多少操作。
就绪节点列表和等待任务列表都可以实现为队列,队列上的操作可以实现恒定的摊销时间。因此,除了需要为队列分配新内存所需的时间外,您还可以在O(1)中运行。
如果您的权重是固定的并且commensurable,那么您也可以在这里实现相同的复杂性:只需将每个节点放入循环队列中几次,与其权重成比例。可以制定算法以在队列中均匀地分隔它们。对于大多数实际应用,一些中等量化将导致权重,可以表示为(即缩放到)合理的小整数。
您是否收到有关您的节点是忙还是空闲的反馈?如果你这样做,那么RR应该运作得很好,因为你没有说明任何公平要求。如果您没有闲置的反馈,那么WRR可能有意义。但在这种情况下,公式中的z
数字似乎有些令人困惑,因为如果您不知道节点是否已准备好接受它们,那么任务如何等待?如果他们正在等待,因为平衡器无法足够快地处理它们,那么这对您的考虑仍然不重要,因为您可以将任务队列想象为之前调度算法:该队列的长度对调度程序中发生的事情没有影响。再次假设所有任务对您来说都是相同的,没有优先级,QoS保证或类似的元信息。