我已经使用 Batch 有一段时间了,它的行为似乎一直大致是 FIFO 方式。先提交的作业通常会先启动,但由于分布式系统的限制,这个一般规则不会完美运行。具有依赖关系的作业保持在 PENDING 状态,直到它们的依赖关系完成,然后它们进入 RUNNABLE 状态。根据我的经验,每当 Batch 准备好从 RUNNABLE 状态运行更多作业时,它都会选择提交时间最早的作业。
但是,有一些警告。首先,如果 Job A 先提交但需要 8 个 core,而 Job B 后提交但只需要 4 core,如果 Batch 只有 4 core 可用,则可能会先选择 Job B。其次,在作业离开 RUNNABLE 状态后,它会进入 STARTING 状态,同时 Batch 会下载 Docker 映像并让容器准备好运行。根据许多因素,同时提交的作业在 STARTING 状态下可能需要更长或更短的时间。最后,如果一个作业失败并被重试,它会回到 PENDING 状态,并以其原始时间提交。当 Batch 决定选择更多的作业来运行时,它一般会选择提交日期最早的作业,也就是失败的作业。如果在第一个作业失败之前已经启动了其他作业,则第一个作业将在其他作业之后开始第二次运行。
没有办法将 Batch 配置为完美的 FIFO,因为它是一个分布式系统,但通常如果您提交具有相同计算要求且间隔几秒钟的作业,它们将按照您提交的顺序执行。