我正在寻找适合以下问题的算法:
有多台计算机(确切数量未知)。每台计算机从某个中央队列中拉出作业,完成作业,然后拉下一个。工作由一些用户组生成。有些用户提交了大量工作,有些用户提交了一些作业消耗相同的CPU时间(不是真的,只是近似值)。
在安排作业时,中央队列应该是公平的。此外,提交大量工作的用户应该拥有一些最小的资源份额。
我正在为这种安排搜索一个很好的算法。
考虑两位候选人:
1 - (normalized penalty)
。这就像步幅调度一样,但我找不到任何好的解释。答案 0 :(得分:1)
当我实现了一个非常相似的作业运行器(对于生产系统)时,我结束了让每个服务器随机选择工作类型。这是我的推理 -
来自一个用户的大量工作不应影响其他用户工作的机会(用户 - 用户公平)
过多的工作类型不应影响其他工作类型的运行机会(用户工作和工作公平)
如果一个用户只有一个等待运行的作业类型,则所有服务器都应该运行这些作业(没有浪费的容量)
系统应该运行作业"公平",即与等待用户和作业类型的数量成比例,而不是总等待作业(一个大型的一个作业类型不应该导致调度支持()(工作类型公平)
服务器数量可能会有所不同,事先不知道
调度程序知道等待作业,作业类型和用户元数据,但不知道作业数据(即用户名,作业名和计数,而不是有效负载)
我还希望每台服务器都是独立的,可以自主安排自己的工作,而无需了解其他服务器
我解决的解决方案是通过{user,jobtype}属性元组跟踪等待作业,并让每个调度步骤随机选择5个元组,并从每个元组中选择最多10个作业来运行。所选择的工作被入围,由下一个可用的跑步者运行。每当释放容量以运行更多作业时(无论是因为作业完成还是因为次要限制而无法运行),请运行另一个计划步骤以获取更多工作。
作为获取的一部分,乔布斯被原子地锁定;锁阻止了它们再次被提取或参与进一步的调度决策。如果他们无法运行,他们就会解锁,有效地将他们送回游泳池。锁定超时,因此运行它们的服务器负责保持锁定刷新(如果服务器崩溃,其他人会超时锁定并启动并运行它启动但尚未完成的作业)
对于我的用例,我希望用户A和B的工作A.1,A.2,A.3和B.1分别获得25%的资源(即使这意味着用户A获得75%的资源)用户B的25%)。在四个元组之间随机选择概率收敛到25%。
如果您希望用户A和B各自拥有50-50的资源分配,并且让A的A.1,A.2和A.3与B&B的B分享相同的份额.1,您可以运行两级调度程序,并随机选择用户并从这些用户中选择作业。这将在用户之间平均分配资源,并在每个用户的工作中平均分配资源。
特定工作类型的大量工作需要很长时间才能完成,但情况总是如此。通过从跨用户中挑选,然后在工作类型中,工作处理的响应性不会受到不利影响。
可以添加许多次要限制(例如,每秒不超过5次调用到Linkedin),但以上是系统的核心。
答案 1 :(得分:0)
您可以尝试Adaptive Computing的Torque资源管理和Maui批处理作业调度软件。毛伊岛政策足够灵活,可满足您的需求。它支持回填,可配置的作业和用户优先级以及资源预留。