问题背景
最近注意到自己负责的一个任务调度集群碰到了计算资源业务线分配不均的问题(即业务线资源隔离没有做好):
- 在任务高峰期,调度系统会将计算资源偏向分配给(执行耗时比较长的)大任务,而(执行耗时比较短的)小任务却分到较少的计算资源。
- 当某一个业务线的任务都是大任务时,就会出现大部分计算资源都分配到该业务线,而其他业务线只分配到较少的计算资源。
阅读该系统调度相关代码稍加分析就明白了为什么会出现这种情况,在分析之前先讲一下这个任务调度系统工作机制:
- 该系统为master-slave模式,即有一个中心调度节点,多个工作节点。
- 工作节点会不停的尝试请求中心调度节点获取任务并执行,循环往复。
- 当工作节点请求调度节点获取任务时,调度节点会选择一条业务线,并将该业务线的任务返回给工作节点。
问题分析
现在问题就出现在调度节点选择业务线的算法上,目前的算法是:
- 各业务线提前配置好资源上下限,根据任务堆积情况进行自动扩缩,即每条业务线分配的资源是实时计算的。
- 选择业务线则是根据业务线实时配置的计算资源 / 所有业务线实时配置的资源之和 得到一个权重比例,然后根据该权重比例进行选择业务线。权重比例大(即该业务线配置的资源在所有业务线资源之和中所占比例大),被选中的概率就大。
这个算法粗略一看没什么问题,但是仔细分析一下这里忽略了一个关键因素:没有考虑任务执行耗时,默认任务执行耗时都一样。
这样会造成大任务占用了大部分的计算资源(即