异构作业支持
概述
Slurm 版本 17.11 及更高版本支持提交和管理异构作业的能力,其中每个组件几乎所有作业选项均可用,包括分区、账户和 QOS(服务质量)。例如,作业的一部分可能需要四个核心和每个 128 个任务 4 GB 的内存,而作业的另一部分则需要 16 GB 的内存和一个 CPU。
提交作业
salloc、sbatch 和 srun 命令均可用于提交异构作业。每个异构作业组件的资源规格应使用 ":" 字符分隔。例如:
$ sbatch --cpus-per-task=4 --mem-per-cpu=1 --ntasks=128 : \ --cpus-per-task=1 --mem-per-cpu=16 --ntasks=1 my.bash
为异构作业(或作业步骤)指定的选项将用于后续组件,以期望有帮助的程度。传播的选项可以根据需要为每个组件重置(例如,可以为每个异构作业组件指定不同的账户名称)。例如,--immediate 和 --job-name 是传播的,而 --ntasks 和 --mem-per-cpu 在每个组件中重置为默认值。以下是传播选项的列表。
- --account
- --acctg-freq
- --begin
- --cluster-constraint
- --clusters
- --comment
- --deadline
- --delay-boot
- --dependency
- --distribution
- --epilog (仅在 srun 中可用的选项)
- --error
- --export
- --export-file
- --exclude
- --get-user-env
- --gid
- --hold
- --ignore-pbs
- --immediate
- --input
- --job-name
- --kill-on-bad-exit (仅在 srun 中可用的选项)
- --label (仅在 srun 中可用的选项)
- --mcs-label
- --mem
- --msg-timeout (仅在 srun 中可用的选项)
- --no-allocate (仅在 srun 中可用的选项)
- --no-requeue
- --nice
- --no-kill
- --open-mode (仅在 srun 中可用的选项)
- --output
- --parsable
- --priority
- --profile
- --propagate
- --prolog (仅在 srun 中可用的选项)
- --pty (仅在 srun 中可用的选项)
- --qos
- --quiet
- --quit-on-interrupt (仅在 srun 中可用的选项)
- --reboot
- --reservation
- --requeue
- --signal
- --slurmd-debug (仅在 srun 中可用的选项)
- --task-epilog (仅在 srun 中可用的选项)
- --task-prolog (仅在 srun 中可用的选项)
- --time
- --test-only
- --time-min
- --uid
- --unbuffered (仅在 srun 中可用的选项)
- --verbose
- --wait
- --wait-all-nodes
- --wckey
- --workdir
任务分配规范在每个作业组件内单独适用。例如,考虑一个异构作业,每个组件在 2 个节点上分配 4 个 CPU。在我们的示例中,作业组件零在节点 "nid00001" 上分配 2 个 CPU,在节点 "nid00002" 上分配 2 个 CPU。作业组件一在节点 "nid00003" 上分配 2 个 CPU,在节点 "nid00004" 上分配 2 个 CPU。任务分配为 "cyclic" 将以循环方式在节点 "nid00001" 和 "nid00002" 上分配前 4 个任务,然后在节点 "nid00003" 和 "nid00004" 上以循环方式分配下 4 个任务,如下所示。
节点 nid00001 | 节点 nid00002 | 节点 nid00003 | 节点 nid00004 |
等级 0 | 等级 1 | 等级 4 | 等级 5 |
等级 2 | 等级 3 | 等级 6 | 等级 7 |
某些选项应仅在第一个异构作业组件中指定。例如,在第二个异构作业组件的选项中指定批处理作业输出文件将导致第一个异构作业组件(执行批处理脚本的地方)使用默认输出文件名。
用于指定作业提交命令默认选项的环境变量将应用于每个异构作业组件(例如 SBATCH_ACCOUNT)。
批处理作业选项可以包含在提交脚本中以用于多个异构作业组件。每个组件应通过包含行 "#SBATCH hetjob" 的行分隔,如下所示。
$ cat new.bash #!/bin/bash #SBATCH --cpus-per-task=4 --mem-per-cpu=16g --ntasks=1 #SBATCH hetjob #SBATCH --cpus-per-task=2 --mem-per-cpu=1g --ntasks=8 srun run.app $ sbatch new.bash
等同于以下内容:
$ cat my.bash #!/bin/bash srun run.app $ sbatch --cpus-per-task=4 --mem-per-cpu=16g --ntasks=1 : \ --cpus-per-task=2 --mem-per-cpu=1g --ntasks=8 my.bash
批处理脚本将在异构作业的第一个组件的第一个节点上执行。在上述示例中,这将是具有 1 个任务、4 个 CPU 和 64 GB 内存(每个 CPU 16 GB)的作业组件。
如果异构作业被提交到多个不属于同一联合体的集群中(例如 "sbatch --cluster=alpha,beta ..."),则整个作业将被发送到预期能够在最早时间启动所有组件的集群。
在提交异构作业时会进行资源限制测试,以立即拒绝无法在当前限制下启动的作业。异构作业的各个组件将像所有常规作业一样进行验证。整个异构作业也会进行测试,但在服务质量(QOS)限制方面的测试更为有限。每个异构作业的组件在资源限制方面都算作一个 "作业"。
突发缓冲区
突发缓冲区可以是持久的或链接到特定的作业 ID。由于异构作业由多个作业 ID 组成,因此作业特定的突发缓冲区将仅与一个异构作业组件相关联。每个组件可以有自己的突发缓冲区指令,并且它们是单独处理的。只有持久的突发缓冲区可以被所有异构作业组件访问。持久突发缓冲区仅在 datawarp 插件中可用。以下是演示 datawarp 插件的示例批处理脚本。
#!/bin/bash #SBATCH --nodes=1 --constraint=haswell #BB create_persistent name=alpha capacity=10 access=striped type=scratch #DW persistentdw name=alpha #SBATCH hetjob #SBATCH --nodes=16 --constraint=knl #DW persistentdw name=alpha ...
注意:Cray 的 DataWarp 接口直接读取作业脚本,但对 "Slurm 的 "hetjob" 指令没有了解,因此 Slurm 在内部为每个作业组件重建脚本,以便仅包含该作业组件的突发缓冲区指令。作业的批处理脚本的第一个组件将被修改,以便用 "#EXCLUDED directive" 替换其他作业组件的突发缓冲区指令,其中指令为 "DW" 或 "BB"(针对 datawarp 插件),并且是为 lua 插件配置的值。这样可以防止它们被 Cray 基础设施解释,并帮助管理员为 lua 插件编写接口。由于批处理脚本将仅由第一个作业组件执行,因此后续作业组件将不包括原始脚本中的命令。这些脚本由 Slurm 为内部目的构建和管理(并从各种 Slurm 命令中可见),如上所示。以下是示例:
为第一个作业组件重建的脚本 #!/bin/bash #SBATCH --nodes=1 --constraint=haswell #BB create_persistent name=alpha capacity=10 access=striped type=scratch #DW persistentdw name=alpha #SBATCH hetjob #SBATCH --nodes=16 --constraint=knl #EXCLUDED DW persistentdw name=alpha ... 为第二个作业组件重建的脚本 #!/bin/bash #SBATCH --nodes=16 --constraint=knl #DW persistentdw name=alpha exit 0
管理作业
Slurm 为异构作业维护的信息包括:
- job_id:每个异构作业的组件将具有其独特的 job_id。
- het_job_id:此标识号适用于异构作业的所有组件。相同作业的所有组件将具有相同的 het_job_id 值,并且它将等于第一个组件的 job_id。我们称之为 "异构作业领导者"。
- het_job_id_set:正则表达式,标识与作业相关的所有 job_id 值。
- het_job_offset:分配给异构作业每个组件的唯一序列号。第一个组件的 het_job_offset 值为 0,第二个为 1,依此类推。
job_id | het_job_id | het_job_offset | het_job_id_set |
---|---|---|---|
123 | 123 | 0 | 123-127 |
124 | 123 | 1 | 123-127 |
125 | 123 | 2 | 123-127 |
126 | 123 | 3 | 123-127 |
127 | 123 | 4 | 123-127 |
表 1:示例作业 ID
squeue 和 sview 命令使用格式 "<het_job_id>+<het_job_offset>" 报告异构作业的组件。例如 "123+4" 将表示异构作业 ID 123 及其第五个组件(注意:第一个组件的 het_job_offset 值为 0)。
请求特定作业 ID,该 ID 标识异构作业的第一个组件(即 "异构作业领导者"),将返回该作业所有组件的信息。例如:
$ squeue --job=93 JOBID PARTITION NAME USER ST TIME NODES NODELIST 93+0 debug bash adam R 18:18 1 nid00001 93+1 debug bash adam R 18:18 1 nid00011 93+2 debug bash adam R 18:18 1 nid00021
请求取消或以其他方式信号异构作业领导者将适用于该异构作业的所有组件。使用 "#+#" 符号请求取消特定组件的异构作业将仅适用于该特定组件。例如:
$ squeue --job=93 JOBID PARTITION NAME USER ST TIME NODES NODELIST 93+0 debug bash adam R 19:18 1 nid00001 93+1 debug bash adam R 19:18 1 nid00011 93+2 debug bash adam R 19:18 1 nid00021 $ scancel 93+1 $ squeue --job=93 JOBID PARTITION NAME USER ST TIME NODES NODELIST 93+0 debug bash adam R 19:38 1 nid00001 93+2 debug bash adam R 19:38 1 nid00021 $ scancel 93 $ squeue --job=93 JOBID PARTITION NAME USER ST TIME NODES NODELIST
当异构作业处于待处理状态时,仅能取消整个作业,而不能取消其各个组件。请求取消处于待处理状态的异构作业的单个组件将返回错误。在作业开始执行后,可以取消单个组件。
作业状态变化的电子邮件通知(--mail-type 选项)仅支持异构作业领导者。请求其他异构作业组件的电子邮件通知将被静默忽略。
使用 scontrol 命令修改作业的单个组件的请求必须使用 "#+#" 符号指定作业 ID。通过指定 het_job_id 请求修改作业将修改异构作业的所有组件。例如:
# 更改异构作业 123 的组件 2 的账户: $ scontrol update jobid=123+2 account=abc # 更改异构作业 123 的所有组件的时间限制: $ scontrol update jobid=123 timelimit=60
请求执行以下操作的作业只能请求异构作业领导者,并将适用于该异构作业的所有组件。请求对异构作业的单个组件进行操作将返回错误。
- 重新排队
- 恢复
- 挂起
sbcast 命令支持异构作业分配。默认情况下,sbcast 将文件复制到作业分配中的所有节点。可以使用 -j/--jobid 选项将文件复制到单个组件,如下所示。
$ sbcast --jobid=123 data /tmp/data $ sbcast --jobid=123.0 app0 /tmp/app0 $ sbcast --jobid=123.1 app1 /tmp/app1
srun 命令的 --bcast 选项将文件传输到与要启动的应用程序相关的节点,具体由 --het-group 选项指定。
Slurm 有一个配置选项来控制某些命令在异构作业方面的行为。默认情况下,请求取消、保持或释放不是 het_job_id 的作业 ID,但作业组件的作业 ID 将仅操作该异构作业的一个组件。如果 SchedulerParameters 配置参数包含选项 "whole_hetjob",则如果指定了任何作业组件进行操作,则该操作将适用于作业的所有组件。在下面的示例中,如果配置了 SchedulerParameters=whole_hetjob,则 scancel 命令将取消作业 93 的所有组件,否则仅会取消作业 93+1。如果指定了特定的异构作业组件(例如 "scancel 93+1"),则仅该组件会受到影响。
$ squeue --job=93 JOBID PARTITION NAME USER ST TIME NODES NODELIST 93+0 debug bash adam R 19:18 1 nid00001 93+1 debug bash adam R 19:18 1 nid00011 93+2 debug bash adam R 19:18 1 nid00021 $ scancel 94 (其中作业 ID 94 等同于 93+1) # 如果 SchedulerParameters 包含 "whole_hetjob",则取消 93+0、93+1 和 93+2 # 如果 SchedulerParameters 不包含 "whole_hetjob",则仅取消 93+1
计费
Slurm 的计费数据库记录 het_job_id 和 het_job_offset 字段。sacct 命令使用格式 "<het_job_id>+<het_job_offset>" 报告作业,并可以接受作业 ID 规范以进行过滤,使用相同的格式。如果指定了 het_job_id 值作为作业过滤器,则将按默认方式报告该作业的所有组件的信息。--whole-hetjob=[yes|no] 选项可用于强制报告该作业的所有组件的信息或仅报告请求的特定组件的信息,无论作业过滤器是否包含 het_job_id(领导者)。
$ sacct -j 67767 JobID JobName Partition Account AllocCPUS State ExitCode ------- ------- --------- ------- --------- --------- -------- 67767+0 foo debug test 2 COMPLETED 0:0 67767+1 foo debug test 4 COMPLETED 0:0 $ sacct -j 67767+1 JobID JobName Partition Account AllocCPUS State ExitCode ------- ------- --------- ------- --------- --------- -------- 67767+1 foo debug test 4 COMPLETED 0:0 $ sacct -j 67767 --whole-hetjob=no JobID JobName Partition Account AllocCPUS State ExitCode ------- ------- --------- ------- --------- --------- -------- 67767+0 foo debug test 4 COMPLETED 0:0 $ sacct -j 67767+1 --whole-hetjob=yes JobID JobName Partition Account AllocCPUS State ExitCode ------- ------- --------- ------- --------- --------- -------- 67767+0 foo debug test 2 COMPLETED 0:0 67767+1 foo debug test 4 COMPLETED 0:0
启动应用程序(作业步骤)
srun 命令用于启动应用程序。默认情况下,应用程序仅在异构作业的第一个组件上启动,但可以使用选项支持不同的行为。
srun 的 "--het-group" 选项定义哪些异构作业组件将启动应用程序。--het-group 选项接受一个表达式,定义哪些组件将为 srun 命令的单个执行启动应用程序。该表达式可以包含一个或多个组件索引值的逗号分隔列表。可以在连字符分隔列表中指定索引值的范围。默认情况下,应用程序仅在组件编号零上启动。一些示例如下:
- --het-group=2
- --het-group=0,4
- --het-group=1,3-5
重要:在多个作业分配中执行单个应用程序的能力并不适用于所有 MPI 实现或 Slurm MPI 插件。Slurm 执行此类应用程序的能力可以通过将 "disable_hetjob_steps" 添加到 Slurm 的 SchedulerParameters 配置参数来禁用。
重要:虽然 srun 命令可以用于启动异构作业步骤,但 mpirun 需要进行重大修改才能支持异构应用程序。我们目前不知道有任何此类 mpirun 开发工作。
默认情况下,通过单次执行 srun 命令启动的应用程序(即使是异构作业的不同组件)将合并到一个具有不重叠任务 ID 的 MPI_COMM_WORLD 中。
与 salloc 和 sbatch 命令一样,使用 ":" 字符分隔异构作业的多个组件。此约定意味着独立的 ":" 字符不能作为 srun 启动的应用程序的参数使用。这包括为每个作业组件执行不同的应用程序和参数的能力。如果某些异构作业组件缺少应用程序规范,则将使用提供的下一个应用程序规范来填补缺少的早期组件,如下所示。
$ srun --label -n2 : -n1 hostname 0: nid00012 1: nid00012 2: nid00013
如果同时执行多个 srun 命令,可能会导致资源争用(例如,内存限制阻止某些作业步骤组件分配资源,因为两个 srun 命令同时执行)。如果使用 srun --het-group 选项创建多个作业步骤(针对异构作业的不同组件),则这些作业步骤将按顺序创建。当多个 srun 命令同时执行时,这可能导致某些步骤分配发生,而其他步骤被延迟。只有在所有作业步骤分配被授予后,应用程序才会被启动。
作业步骤的所有组件将具有相同的步骤 ID 值。如果在作业组件的子集上启动作业步骤,则可能会出现单个作业组件的步骤 ID 值的间隙。
$ salloc -n1 : -n2 beta bash salloc: Pending job allocation 1721 salloc: Granted job allocation 1721 $ srun --het-group=0,1 true # 启动步骤 1721.0 和 1722.0 $ srun --het-group=0 true # 启动步骤 1721.1,没有 1722.1 $ srun --het-group=0,1 true # 启动步骤 1721.2 和 1722.2
作业步骤分配中指定的最大异构组(无论是显式指定还是通过 ":" 分隔符隐含指定)不得超过异构作业分配中的组件数量。例如:
$ salloc -n1 -C alpha : -n2 -C beta bash salloc: Pending job allocation 1728 salloc: Granted job allocation 1728 $ srun --het-group=0,1 hostname nid00001 nid00008 nid00008 $ srun hostname : date : id error: Attempt to run a job step with het-group value of 2, but the job allocation has maximum value of 1
环境变量
Slurm 环境变量将独立为作业的每个组件设置,通过在常规名称后附加 "_HET_GROUP_" 和序列号。此外,"SLURM_JOB_ID" 环境变量将包含异构作业领导者的作业 ID,"SLURM_HET_SIZE" 将包含作业中的组件数量。请注意,如果使用 srun 与单个特定的异构组(例如 --het-group=1),"SLURM_JOB_ID" 将包含异构作业领导者的作业 ID。特定异构组件的作业 ID 设置在 "SLURM_JOB_ID_HET_GROUP_<component_id>" 中。例如:
$ salloc -N1 : -N2 bash salloc: Pending job allocation 11741 salloc: job 11741 queued and waiting for resources salloc: job 11741 has been allocated resources $ env | grep SLURM SLURM_JOB_ID=11741 SLURM_HET_SIZE=2 SLURM_JOB_ID_HET_GROUP_0=11741 SLURM_JOB_ID_HET_GROUP_1=11742 SLURM_JOB_NODES_HET_GROUP_0=1 SLURM_JOB_NODES_HET_GROUP_1=2 SLURM_JOB_NODELIST_HET_GROUP_0=nid00001 SLURM_JOB_NODELIST_HET_GROUP_1=nid[00011-00012] ... $ srun --het-group=1 printenv SLURM_JOB_ID 11741 11741 $ srun --het-group=0 printenv SLURM_JOB_ID 11741 $ srun --het-group=1 printenv SLURM_JOB_ID_HET_GROUP_1 11742 11742 $ srun --het-group=0 printenv SLURM_JOB_ID_HET_GROUP_0 11741
各种 MPI 实现在正常操作中严重依赖 Slurm 环境变量。单个 MPI 应用程序在单个 MPI_COMM_WORLD 中执行需要一组统一的环境变量,反映单个作业分配。下面的示例展示了 Slurm 如何为 MPI 设置环境变量。
$ salloc -N1 : -N2 bash salloc: Pending job allocation 11741 salloc: job 11751 queued and waiting for resources salloc: job 11751 has been allocated resources $ env | grep SLURM SLURM_JOB_ID=11751 SLURM_HET_SIZE=2 SLURM_JOB_ID_HET_GROUP_0=11751 SLURM_JOB_ID_HET_GROUP_1=11752 SLURM_JOB_NODELIST_HET_GROUP_0=nid00001 SLURM_JOB_NODELIST_HET_GROUP_1=nid[00011-00012] ... $ srun --het-group=0,1 env | grep SLURM SLURM_JOB_ID=11751 SLURM_JOB_NODELIST=nid[00001,00011-00012] ...
示例
创建一个异构资源分配,包含一个具有 256GB 内存和 "haswell" 特性的节点,以及 32 个具有 "knl" 特性的节点上的 2176 个核心。然后在 "haswell" 节点上启动名为 "server" 的程序,在 "knl" 节点上启动 "client"。每个应用程序将处于其自己的 MPI_COMM_WORLD 中。
salloc -N1 --mem=256GB -C haswell : \ -n2176 -N32 --ntasks-per-core=1 -C knl bash srun server & srun --het-group=1 client & wait
上述示例的变体在单个 MPI_COMM_WORLD 中启动程序 "server" 和 "client"。
salloc -N1 --mem=256GB -C haswell : \ -n2176 -N32 --ntasks-per-core=1 -C knl bash srun server : client
SLURM_PROCID 环境变量将被设置为反映全局任务排名。每个生成的进程将具有唯一的 SLURM_PROCID。
类似地,SLURM_NPROCS 和 SLURM_NTASKS 环境变量将被设置为反映全局任务计数(这两个环境变量将具有相同的值)。SLURM_NTASKS 将被设置为所有组件中任务的总数。请注意,任务排名和计数值是 MPI 所需的,通常通过检查 Slurm 环境变量来确定。
限制
回填调度程序在跟踪未来 CPU 和内存使用方面存在限制。这通常要求回填调度程序能够在不同节点上分配异构作业的每个组件,以便开始其资源分配,即使作业的多个组件确实在同一节点上分配了资源。
在集群联合体中,异构作业将完全在提交作业的集群上执行。异构作业将不符合在集群之间迁移或在联合体中的不同集群上执行作业的不同组件的条件。
在提交请求多个重叠分区的异构作业时必须小心。当分区共享相同资源时,可能会通过使第一个作业组件请求足够的节点而使调度程序无法满足后续请求,从而使作业饿死。考虑一个示例,其中您有分区 p1,该分区包含 10 个节点,而分区 p2 在其中 5 个相同节点上存在。如果您提交一个异构作业,请求在 p1 中的 5 个节点和在 p2 中的 5 个节点,则调度程序可能会尝试为第一个作业组件分配来自 p2 分区的一些节点,从而阻止调度程序满足第二个请求,导致作业永远无法启动。
磁性保留不能 "吸引" 异构作业 - 异构作业仅在明确请求保留时才会在磁性保留中运行。
不支持异构作业的作业数组。
srun 命令的 --no-allocate 选项不支持异构作业。
每个异构作业组件只能通过单个 srun 命令启动一个作业步骤(例如 "srun --het-group=0 alpha : --het-group=0 beta" 不受支持)。
sattach 命令只能用于一次附加到异构作业的单个组件。
许可证请求仅允许在第一个组件作业中(例如 "sbatch -L ansys:2 : script.sh")。
异构作业仅由回填调度程序插件调度。更频繁执行的调度逻辑仅按先进先出(FIFO)方式启动作业,并缺乏同时调度异构作业所有组件的逻辑。
异构作业不支持 GANG 调度操作。
Slurm 的 Perl API 不支持异构作业。
srun --multi-prog 选项不能用于跨越多个异构作业组件。
srun --open-mode 选项默认设置为 "append"。
古老版本的 OpenMPI 及其衍生版本(即 Cray MPI)依赖于 Slurm 为其分配通信端口。如果异构作业步骤的 任何 组件无法获取分配的端口,则此类 MPI 作业将经历步骤启动失败。非异构作业步骤将使用新的一组通信端口重试步骤启动(Slurm 行为没有变化)。
异构步骤
Slurm 版本 20.11 引入了在非同质作业分配中请求异构作业步骤的能力。这使您能够灵活地为作业步骤提供不同的布局,而无需使用异构作业,因为为组件分配单独的作业可能并不理想。
异构步骤的一些限制是步骤必须能够在唯一节点上运行。您也不能在异构作业中请求异构步骤。
一个示例场景是,如果您有一个任务需要每个处理器使用 1 个 GPU,而另一个任务需要在只有一个处理器的节点上使用所有可用的 GPU。这可以这样完成:
$ salloc -N2 --exclusive --gpus=10 salloc: Granted job allocation 61034 $ srun -N1 -n4 --gpus=4 printenv SLURMD_NODENAME : -N1 -n1 --gpus=6 printenv SLURMD_NODENAME node02 node01 node01 node01 node01
系统管理员信息
作业提交插件为异构作业的每个组件独立调用。
spank_init_post_opt() 函数为异构作业的每个组件调用一次。这允许在每个作业组件的基础上定义站点选项。
异构作业的调度仅由 sched/backfill 插件执行,所有异构作业组件要么同时调度,要么延迟。异构作业的待处理原因在回填评估之前不会设置。为了确保异构和非异构作业的及时启动,回填调度程序在每次迭代中交替使用两种不同的模式。在第一种模式下,如果异构作业组件无法立即启动,则记录其预期启动时间,并且该作业的所有后续组件将在不早于最新组件的预期启动时间的情况下考虑启动。在第二种模式下,所有异构作业组件将在不早于最新组件的预期启动时间的情况下考虑启动。在第二种模式完成后,所有异构作业的预期启动时间数据将被清除,下一次回填调度程序迭代将使用第一种模式。常规(非异构作业)在回填调度程序的每次迭代中独立调度。
例如,考虑一个具有三个组件的异构作业。当作为独立作业考虑时,组件可以在现在(组件 0)、现在加 2 小时(组件 1)和现在加 1 小时(组件 2)时启动。当回填调度程序在第一种模式下运行时:
- 组件 0 将被记录为可以立即启动,但由于需要启动的其他组件而未被启动
- 组件 1 将被记录为可以在 2 小时后启动
- 组件 2 将在未来的 2 小时内不会被考虑调度,这将为调度其他作业留出一些额外的资源
当回填调度程序下次执行时,它将使用第二种模式,并且(假设没有其他状态变化)所有三个作业组件将在不早于未来 2 小时的情况下被视为可调度,这可能允许其他作业在异构作业组件 0 启动之前分配资源。
在下一次迭代中使用第一种模式之前,将清除异构作业启动时间数据,以便考虑可能允许异构作业在比先前确定的时间更早启动的系统状态变化。
在提交异构作业时会进行资源限制测试,以立即拒绝无法在当前限制下启动的作业。异构作业的各个组件将像所有常规作业一样进行验证。整个异构作业也会进行测试,但在服务质量(QOS)限制方面的测试更为有限。这是因为每个作业组件最多有三组限制(关联、作业 QOS 和分区 QOS)。请注意,成功提交任何作业(无论是异构作业还是其他作业)并不确保该作业能够在不超过某些限制的情况下启动。例如,作业的 CPU 限制测试并未考虑 CPU 可能不会单独分配,而是可能按整个核心、插槽或节点进行资源分配。每个异构作业的组件在资源限制方面都算作一个 "作业"。
例如,用户可能有 2 个并发运行作业的限制,并提交一个具有 3 个组件的异构作业。这样的情况将对调度其他作业,尤其是其他异构作业产生不利影响。
最后修改于 2024 年 1 月 4 日