核心专业化

核心专业化是一项旨在将系统开销(系统中断等)隔离到计算节点指定核心的功能。这可以减少应用程序中的上下文切换,从而提高完成时间。作业进程将无法直接使用专业化核心。

命令选项

所有作业分配命令(sallocsbatchsrun)都接受 -S--core-spec 选项,后面跟一个核心数量值参数(例如 "-S 1" 或 "--core-spec=2")。该数量标识每个分配的计算节点上为系统开销保留的核心数量。请注意,如果在您的 slurm.conf 中未启用 AllowSpecResourcesUsage 选项,则 --core-spec 选项将被忽略。每个作业的核心专业化数量可以使用 scontrolsviewsqueue 命令查看。作业步骤的核心专业化数量的指定将被忽略(即在使用 sallocsbatch 命令创建的作业分配中的 srun 命令)。使用 squeue 命令并带有 "%X" 格式选项可以查看该数量(在默认输出格式中不会报告)。scontrolsview 命令也可以用于修改待处理作业的数量。

显式设置作业的专业化核心值隐式设置其 --exclusive 选项,为作业保留整个节点。作业将为节点上所有非专业化的 CPU 收费,并且通过 scontrolsviewsqueue 命令报告的作业的 NumCPUs 值将反映所有分配节点上的所有非专业化 CPU,以及作业的会计。

请注意,由于隐式的 --exclusive,如果请求的专业化核心/线程数量低于分配节点的 CoreSpecCount 或 CpuSpecList 中的核心数量,则步骤将可以访问所有非专业化核心以及为该作业释放的专业化核心。

例如,假设一个节点在 slurm.conf 中配置了 AllowSpecResourcesUsage=yesCoreSpecCount=2,总共有 16 个核心。如果作业指定了 --core-spec=1,隐式的 --exclusive 将导致节点的独占分配,留下 15 个核心供作业使用,并保留 1 个核心用于系统使用。

sacct 中,步骤分配的 CPU 将包括它可以访问的专业化核心或线程。然而,作业的分配 CPU 数量永远不包括专业化核心或线程,以确保利用率报告的准确性。

以下是一个示例配置,将核心 0 和 1 设置为专业化:

AllowSpecResourcesUsage=yes
Nodename=n0 Port=10100 CoresPerSocket=16 ThreadsPerCore=1 CpuSpecList=0-1

提交一个请求核心规格数量为 1 的作业(释放核心编号 1 供作业使用)。

$ salloc --core-spec=1
salloc: 授予作业分配 4152
$ srun bash -c 'cat /proc/self/status |grep Cpus_'
Cpus_allowed:        fffe
Cpus_allowed_list:   1-15

注意作业 CPU 数量与步骤 CPU 数量的区别。

$ sacct -j 4152 -ojobid%20,alloccpus
               JobID  AllocCPUS
-------------------- ----------
                4152         14
    4152.interactive         15
              4152.0         15

核心选择

要用于专业化的特定资源可以使用与每个节点相关的 CPUSpecList 配置参数来标识,位于 slurm.conf 文件中。如果配置了 CoreSpecCount,但未配置 CPUSpecList,则选择用于专业化的核心将遵循下面描述的分配算法。第一个选择的核心将是编号最高的核心,位于编号最高的插槽上。后续选择的核心将是编号最高的核心,位于编号较低的插槽上。如果需要额外的核心,它们将来自每个插槽上下一个编号最高的核心。举个例子,考虑一个有两个插槽的节点,每个插槽有四个核心。专业化核心将按以下顺序选择:

  1. 插槽:1 核心:3
  2. 插槽:0 核心:3
  3. 插槽:1 核心:2
  4. 插槽:0 核心:2
  5. 插槽:1 核心:1
  6. 插槽:0 核心:1
  7. 插槽:1 核心:0
  8. 插槽:0 核心:0

Slurm 可以通过配置 SchedulerParameters=spec_cores_first 来设置优先选择第一个而不是最后一个核心。在这种情况下,第一个选择的核心将是编号最低的核心,位于编号最低的插槽上。后续选择的核心将是编号最低的核心,位于编号较高的插槽上。如果需要额外的核心,它们将来自每个插槽上下一个编号最低的核心。

请注意,核心专业化保留可能会影响某些作业分配请求选项的使用,特别是 --cores-per-socket。

系统配置

核心专业化需要 SelectType=cons_tres 和 task/cgroup 任务插件。专业化资源应在 slurm.conf 中的节点规格行中配置,使用 CoreSpecCountCPUSpecList 选项来标识要保留的 CPU。MemSpecLimit 选项可用于保留内存。这些资源将使用 Linux cgroups 进行保留。计算节点守护进程 slurmd 将受到保留资源的约束,除非指定 TaskPluginParam SlurmdOffSpec。如果使用 cgroup/v1,slurmstepd 进程也将受到保留资源的约束。希望拥有不同数量专业化核心的用户应使用上述描述的 --core-spec 选项。

作业的核心专业化选项将在其他配置中静默清除。此外,每个计算节点的核心数量必须配置,或者 CPU 数量必须配置为节点的核心数量。如果未配置核心数量而 CPU 值配置为超线程的数量,则将为系统使用保留超线程而不是核心。

如果要授予用户控制其作业的专业化核心数量的权利,配置参数 AllowSpecResourcesUsage 必须设置为 1

最后修改于 2025 年 4 月 4 日