一、一个所有人都遇到过的问题
1.1 直觉上的归因,常常是错的
提交任务之后没有立刻开始,多数人的第一反应是“资源不够”。但如果去看资源总览,常常发现还有若干加速卡处于空闲状态。于是问题就变成了:明明有空闲,为什么不用我?这在调度领域是一个正常现象,原因通常有四类:空闲的资源形状与任务要求不匹配、任务在队列里的位置靠后、所属项目的配额已经用满、前方有长任务占着位置且没有空隙可填。这四类原因对应四种不同的处理方式,归错因就会用错办法。
1.2 调度器在每个时刻只做三件事
把调度器想象成一个不停运转的分配窗口,它在每个时刻做的事情可以简化为三步:先排序,把当前所有等待中的任务按规则列出先后;再匹配,看排在前面的任务与当下可用的资源能否对上;最后放行,条件满足的就开始运行,条件不满足的回到队列里继续等。理解这三步,就能明白为什么“有空闲但不用我”——空闲可能过不了匹配这一关,也可能根本没轮到我排序的位置。
1.3 为什么简单的“先到先得”行不通
先到先得看起来最公平,实际用起来问题很多。一个占用大量资源、运行时间很长的任务排在前面,后面所有小任务都被堵住,哪怕集群里有大量零散空闲资源,也用不起来。反过来,如果允许任意插队,长任务可能长期得不到资源,永远排在后面。真实系统因此需要在两者之间找平衡,这就产生了优先级、配额、回填与预留这些机制。
二、三个必须先弄明白的专业名词
2.1 队列与优先级
队列是等待任务的集合,优先级决定了任务在队列里被取出的先后。把任务分到不同的队列,相当于按业务属性先分了一次类:有的队列服务在线推理,要求快速响应;有的队列服务离线训练,可以等上几小时。两类任务混在一个队列里,就会出现“在线任务被离线任务堵住”的情况。
2.1.1 优先级不等于插队特权
优先级的意义在于表达“这件事更急”,而不是给某个任务永久通行证。如果高优先级任务长期占满资源,低优先级任务就失去了运行机会,整个系统的实际吞吐反而下降。合理的做法是把优先级与配额一起使用:高优先级在资源紧张时优先获得,但总量仍受所在项目的额度约束。
2.1.2 怎么设置才不至于混乱
建议控制在三到四档,档位太多时,使用者很难判断自己该选哪一档,最后往往全部选最高档,优先级就失效了。每一档应当有明确的适用说明,例如“对外服务、应急恢复类任务用第一档;有明确交付时间的训练任务用第二档;探索性实验用第三档”。
2.2 配额与公平份额
配额是按项目、团队或业务线预先划定的可用量上限,它保证每个单位至少有一份可预期的资源,不会被其他单位全部占走。公平份额则是一种动态调整思路:当某个单位暂时用不完自己的额度时,其他单位可以借用,等原单位需要时再归还。这套“借与还”的机制,是提升整体利用率的关键,也是“我的配额明明没用完、为什么还是排不上”的常见原因——因为额度还在,但物理资源被借出后尚未归还。
2.3 回填与预留
回填指的是把较小的任务填进大任务等待期间的空隙。比如一个需要整机资源的任务还要等两小时才能开始,这期间集群里有些零散的卡闲着,调度器可以把预计一小时内能跑完的小任务放进去,既不耽误大任务,也不浪费空隙。预留则是反过来的做法:为即将到来的重要任务提前留出位置,让它在预定时间一定能开始。两者一个提高利用率,一个保证确定性,常常搭配使用。
三、一条任务从提交到开始,要经过哪几道判断
把前面的机制串起来看,一条任务从提交到真正跑起来,通常会依次经过四道判断。任何一道不通过,任务就会停留在等待状态。
① 能不能放:任务的资源形状与集群现有空闲能否对上。要求八张卡,而每台机器只剩七张空闲,就放不进去;
② 什么时候放:任务在队列里的位置与优先级,决定它相对其他等待任务是先还是后;
③ 抢不抢:若允许抢占,高优先级任务可以顶替正在运行的低优先级任务,被顶替的通常保留进度后让位;
④ 放多少:是否允许先用部分资源启动,边跑边等剩余资源,这决定了任务能否“部分开始”。
四、四种等待,成因各不相同
4.1 资源形状不匹配
这类等待最容易让人困惑:总览有空闲,任务就是不动。原因是调度以整份资源为单位匹配,零散的空闲拼不成任务需要的形状。处理办法是把任务需要的资源形状调小,或把大任务拆成若干小任务分批跑。
4.2 队列结构不合理
所有任务挤在一个队列里,在线服务与离线训练互相排队,结果是两边都不满意:在线服务嫌慢,离线训练嫌被频繁打断。按业务属性分层,是投入不大、见效较快的一种改善。
4.3 配额被其他项目借用
在允许借用的机制下,其他项目用掉了本应归还的资源,本单位提交任务时就会发现额度还在、资源却排不上。这种情况下需要的是回收机制与优先级保障,而不是继续提高任务的优先级。
4.4 前方长任务挡路
没有回填机制时,一个长任务会让后面所有任务一起等。启用回填之后,短任务可以先填进空隙,等待时间明显缩短。这也是为什么同一套资源,在启用回填前后,使用者的体感差异会很大。
五、天翼云息壤算力调度如何让等待变短、变可预期
规则设计得再好,也需要平台把这些机制真正提供出来。天翼云息壤算力调度在这方面的能力,正好对应前面提到的几组机制。
5.1 统一纳管与任务级调度
分散在不同区域、不同归属的算力被纳入同一张网络,按任务而不是按设备进行分配。任务提交后,调度层能看到全局的资源状况,不必由使用者逐个指定机器。这解决的是“看得见才调得动”的前提问题。
5.2 多队列与配额管理
平台支持按项目、团队划分队列并设置配额,让不同业务各有一条可预期的通道。在线服务与离线训练可以分开排队,互不干扰;各单位的额度清楚可见,避免出现“谁都以为资源够、结果都被别人用掉”的局面。
5.3 抢占与让位
在资源紧张时,高优先级任务可以顶替正在运行的低优先级任务。这项能力让紧急任务不必排在几小时之后,也避免了为应对紧急情况而长期闲置一批资源。关键在于让位的一方不白等——这就涉及下一项能力。
5.3.1 什么情况下值得启用抢占
抢占适合两类场景:一是存在明确的紧急任务,例如对外服务需要临时扩容;二是资源长期偏紧,只靠排队无法保证重要任务的开始时间。如果任务大多可等、资源总体宽裕,启用抢占反而会增加不必要的任务切换。
5.4 断点续训让让位不等于重来
任务被顶替时,系统按设定节奏保存训练进度,之后从最近的保存点继续,而不是从头开始。这一点让抢占从“高代价操作”变成了可接受的常规安排:低优先级任务愿意让位,是因为让位之后还能接上;管理者敢于启用抢占,是因为不必担心任务反复重跑带来的时间损耗。
5.5 跨区域调配
本地排不上时,调度层可以在更大范围内寻找可用资源,把任务安排到其他节点运行,任务结束后结果回流。这对周期性峰值明显的单位尤其实用:不必为了应对短时高峰而长期预留一批设备。
5.6 公开可查的成果
息壤相关成果曾入选央企十大超级工程、获得算力中国年度突破成果、获评十大硬核科技,并获得世界互联网大会杰出贡献奖等评价。这些信息可作为内部说明调度能力来源时的旁证,具体内容以天翼云官网和官方渠道发布为准。
六、四条建议:让等待更短、也更可预期
规则是平台定的,但等待时间有一半由使用者自己决定。以下四条,前两条面向提交任务的人,后两条面向管理资源的人。
1、写准资源形状:卡数与时长上限按实际需要填写,不用“宁多勿少”的方式占位;
2、长短任务分开处理:长任务拆阶段提交,碎片任务合批提交;
3、队列按业务分层:对外服务、定时交付、探索实验各走一条通道,优先级只用三档;
4、看等待时长的分布:关注长尾落在哪个队列、哪种资源形状上,而不是只看平均值。
6.1 写任务时把资源形状写准
很多长等待源于一行随手填写的参数:卡数写得过大、时长上限设得过长。卡数按实际需要填写,时长上限按历史耗时上浮适当比例,任务就更容易被匹配到空隙里。
6.2 长任务拆短,短任务合批
把一次长训练拆成若干阶段,每个阶段单独提交,既便于中途检查结果,也更容易被回填机制接纳。反过来,大量碎片化的小任务可以合并成批次提交,减少排队次数。
6.3 队列按业务分层,优先级只用三档
把对外服务、定时交付、探索实验分到不同队列,再给每档写清适用场景。规则简单,执行起来才不容易走样。
6.4 定期看等待时长的分布
平均等待时长这个数字意义有限,它会把长尾掩盖掉。更值得关注的是分布:有多少任务在一小时内开始,有多少等了半天以上,这些长等待集中在哪个队列、哪种资源形状上。看清分布,调整才有方向。
天翼云息壤算力调度解决的是资源如何被合理分配的问题,而分配的公平与效率,最终取决于规则是否清楚、参数是否贴近真实需求。当使用者知道自己的任务为什么排队,也知道怎么做能让它更快开始,算力这件事才真正从“抢”变成“用”。