Skip to content

Commit 9674de1

Browse files
Harry-CheniBug
authored andcommitted
scheduler: s/结点/节点/g
Signed-off-by: Shengqi Chen <[email protected]>
1 parent 2b6d11b commit 9674de1

File tree

1 file changed

+23
-23
lines changed

1 file changed

+23
-23
lines changed

docs/advanced/hpc/scheduler.md

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ icon: fontawesome/solid/tasks
1010

1111
!!! warning "本文已完成,等待校对"
1212

13-
在中到大型的高性能计算集群上,为了高效地分配计算资源、管理用户作业、实施权限控制和计费等,通常会部署作业调度系统(Job Scheduler)。用户只能登录到少数(甚至一台)登录结点(login node),向调度系统提交作业请求;调度系统会根据资源使用情况和调度策略,将用户的作业分配到计算结点(compute node)上运行,并记录作业的状态和资源使用情况。
13+
在中到大型的高性能计算集群上,为了高效地分配计算资源、管理用户作业、实施权限控制和计费等,通常会部署作业调度系统(Job Scheduler)。用户只能登录到少数(甚至一台)登录节点(login node),向调度系统提交作业请求;调度系统会根据资源使用情况和调度策略,将用户的作业分配到计算节点(compute node)上运行,并记录作业的状态和资源使用情况。
1414

1515
常见的开源作业调度系统包括 [Slurm](https://github.com/SchedMD/slurm)[OpenPBS](https://github.com/openpbs/openpbs)[HTCondor](https://github.com/htcondor/htcondor) 等。其中由 SchedMD 开发的 Slurm(Simple Linux Utility for Resource Management)是目前最流行的作业调度系统之一,广泛应用于各大超算计算中心和超级计算机。
1616

@@ -36,20 +36,20 @@ icon: fontawesome/solid/tasks
3636

3737
根据上图所示,Slurm 的控制守护进程(或称为服务端)主要由以下几个核心组件组成:
3838

39-
* [`slurmctld`][slurmctld.8]:Slurm 控制守护进程,运行在管理结点上,负责资源管理和作业调度。
40-
* [`slurmd`][slurmd.8]:Slurm 计算守护进程,运行在每个计算结点上,负责执行分配给该结点的作业
39+
* [`slurmctld`][slurmctld.8]:Slurm 控制守护进程,运行在管理节点上,负责资源管理和作业调度。
40+
* [`slurmd`][slurmd.8]:Slurm 计算守护进程,运行在每个计算节点上,负责执行分配给该节点的作业
4141
* [`slurmdbd`][slurmdbd.8](可选):Slurm 数据库守护进程,与其他进程通信,作为它们访问数据库的代理。
4242

4343
上述组件可以任意组合,管理员应当通过根据集群的功能、规模和冗余需求来决定具体的部署方案。例如,一个常见的中小型计算集群上的部署方案是:
4444

4545
* 登录/控制/数据库复合节点 `foo00`:部署 `slurmctld``slurmdbd`,同时也安装 Slurm 客户端工具,供用户登录和提交作业。
46-
* 计算节点 `foo[01-15]`:部署 `slurmd`,不允许用户登录,作为计算结点执行用户作业
46+
* 计算节点 `foo[01-15]`:部署 `slurmd`,不允许用户登录,作为计算节点执行用户作业
4747

4848
### 前置要求 {#prerequisites}
4949

50-
需要保证集群上的所有结点,可以通过主机名(hostname)解析所有结点的 IP 地址。建议使用静态 IP 或 DHCP 绑定,并配置好 DNS 服务,或者同步 `/etc/hosts` 文件。
50+
需要保证集群上的所有节点,可以通过主机名(hostname)解析所有节点的 IP 地址。建议使用静态 IP 或 DHCP 绑定,并配置好 DNS 服务,或者同步 `/etc/hosts` 文件。
5151

52-
运行控制守护进程的结点使用 `munge` 进行身份验证和通信,需要提前使用 apt 安装,并同步 `/etc/munge/munge.key`。munge 的正常工作还依赖于集群内时间的同步,请参阅 [网络时间同步](../../ops/network-service/ntp.md) 进行配置。
52+
运行控制守护进程的节点使用 `munge` 进行身份验证和通信,需要提前使用 apt 安装,并同步 `/etc/munge/munge.key`。munge 的正常工作还依赖于集群内时间的同步,请参阅 [网络时间同步](../../ops/network-service/ntp.md) 进行配置。
5353

5454
??? tip "munge 测试"
5555

@@ -76,7 +76,7 @@ icon: fontawesome/solid/tasks
7676

7777
### Slurm 配置文件 {#slurm-config-files}
7878

79-
Slurm 需要的所有配置文件均存储在 `/etc/slurm` 下,管理员**务必**时刻保证集群中所有结点上文件内容一致(Slurm 会检查 hash),否则可能导致不可预期的错误。目前推荐的方式是使用 Configless Slurm(见后文),仅在管理结点上维护配置文件,其他结点实时进行拉取,以减少管理负担。
79+
Slurm 需要的所有配置文件均存储在 `/etc/slurm` 下,管理员**务必**时刻保证集群中所有节点上文件内容一致(Slurm 会检查 hash),否则可能导致不可预期的错误。目前推荐的方式是使用 Configless Slurm(见后文),仅在管理节点上维护配置文件,其他节点实时进行拉取,以减少管理负担。
8080

8181
Debian 打包的 Slurm 没有提供默认配置文件,可通过官方的 [Configuration Tool](https://slurm.schedmd.com/configurator.html) 生成 `slurm.conf`,并根据实际情况进行修改。一些关键的配置项包括:
8282

@@ -88,7 +88,7 @@ Debian 打包的 Slurm 没有提供默认配置文件,可通过官方的 [Conf
8888

8989
对于配置文件的详尽解释,请参考官方文档的[`slurm.conf`][slurm.conf.5] 章节,亦可参阅[Slurm 资源管理与作业调度系统安装配置](https://scc.ustc.edu.cn/hmli/doc/linux/slurm-install/slurm-install.html#id17)中的示例配置文件。
9090

91-
`slurm.conf` 的底部是对所有结点(node)和分区(partition)的定义,根据实际情况修改即可。如果需要配置 GRES 资源(如 GPU),则还需要额外提供 [`gres.conf`][gres.conf.5] 文件描述每个结点上的设备情况,或者使用 NVML 等插件进行自动检测。
91+
`slurm.conf` 的底部是对所有节点(node)和分区(partition)的定义,根据实际情况修改即可。如果需要配置 GRES 资源(如 GPU),则还需要额外提供 [`gres.conf`][gres.conf.5] 文件描述每个节点上的设备情况,或者使用 NVML 等插件进行自动检测。
9292

9393
如果需要 Slurm 对资源分配施加控制,尤其是限制用户对 GRES 的使用,则还需要提供 [`cgroup.conf`][cgroup.conf.5] 文件,并打开(默认不启用的)相关选项:
9494

@@ -98,7 +98,7 @@ ConstrainDevices=yes # 启用设备约束
9898
ConstrainRAMSpace=yes # 启用内存约束
9999
```
100100

101-
如此配置下,`slurmd` 会在计算结点启动作业时自动创建和管理相应的 cgroups,从而实现对资源的限制和隔离,避免用户占据未申请的资源,影响其他用户的作业运行。需要注意:目前 cgroups v1 已被绝大部分用户(如 Slurm、容器运行时、systemd 等)标记为过时,因此使用的是 cgroups v2。
101+
如此配置下,`slurmd` 会在计算节点启动作业时自动创建和管理相应的 cgroups,从而实现对资源的限制和隔离,避免用户占据未申请的资源,影响其他用户的作业运行。需要注意:目前 cgroups v1 已被绝大部分用户(如 Slurm、容器运行时、systemd 等)标记为过时,因此使用的是 cgroups v2。
102102

103103
如果修改了任何 slurm 配置文件,通常需要执行 `scontrol reconfigure` 使得修改生效;在部分情况下,可能还需要重启 slurmctld。在一般情况下,重启 slurmctld 不会影响正在运行的作业,也不会导致作业丢失,但依旧需要谨慎操作。
104104

@@ -110,7 +110,7 @@ slurmdbd 是其他守护进程访问数据库的代理,可以避免在配置
110110

111111
Slurm 数据库中存储了用户组织关系、作业历史记录、资源使用情况等重要信息,务必定期备份数据库,以防止数据丢失。
112112

113-
slurmdbd 需要单独安装,并提供 [`/etc/slurm/slurmdbd.conf`][slurmdbd.conf.5] 配置文件,指定数据库的连接信息和认证方式。此文件只需要保留在运行 slurmdbd 的结点上,不需要复制到其他结点,并且文件权限必须为 `600`
113+
slurmdbd 需要单独安装,并提供 [`/etc/slurm/slurmdbd.conf`][slurmdbd.conf.5] 配置文件,指定数据库的连接信息和认证方式。此文件只需要保留在运行 slurmdbd 的节点上,不需要复制到其他节点,并且文件权限必须为 `600`
114114

115115
```shell
116116
touch /etc/slurm/slurmdbd.conf # 填入相关配置
@@ -120,26 +120,26 @@ systemctl enable --now slurmdbd
120120

121121
多个不同的 slurm 集群在技术上可以共享同一个 slurmdbd,但作者不推荐这样做,除非有明确的需要(如同样的用户群体需要访问多个集群的资源,又确实无法实现统一管理)。
122122

123-
### 管理结点:slurmctld {#slurmctld}
123+
### 管理节点:slurmctld {#slurmctld}
124124

125-
在管理结点上安装并启用 Slurm 控制守护进程:
125+
在管理节点上安装并启用 Slurm 控制守护进程:
126126

127127
```shell
128128
touch /etc/slurm/slurm.conf # 填入相关配置
129129
apt-get install -y slurmctld slurm-client
130130
systemctl enable --now slurmctld
131131
```
132132

133-
此时运行 `sinfo`应当能看到集群的分区和结点信息。由于没有 slurmd 在计算结点上运行,所有结点都应该均显示为 `UNK` 状态。
133+
此时运行 `sinfo`应当能看到集群的分区和节点信息。由于没有 slurmd 在计算节点上运行,所有节点都应该均显示为 `UNK` 状态。
134134

135-
### 计算结点:slurmd {#slurmd}
135+
### 计算节点:slurmd {#slurmd}
136136

137137
```shell
138138
apt-get install -y slurmd
139139
systemctl enable --now slurmd
140140
```
141141

142-
此时在装有客户端的结点上运行 `sinfo`,应当能看到启动了 `slurmd` 的结点的状态转变为 `idle`。执行 `srun hostname`可以看到作业确实被分配到了计算结点上运行。再运行 `sacct -a`,可以看到作业的记录已经被写入数据库。这样,一个基本的 Slurm 集群就搭建完成了。
142+
此时在装有客户端的节点上运行 `sinfo`,应当能看到启动了 `slurmd` 的节点的状态转变为 `idle`。执行 `srun hostname`可以看到作业确实被分配到了计算节点上运行。再运行 `sacct -a`,可以看到作业的记录已经被写入数据库。这样,一个基本的 Slurm 集群就搭建完成了。
143143

144144
如果需要使用 Slurm 管理硬件,则需要保证 `gres.conf` 中提及的设备文件在 slurmd 启动前已经存在,否则 slurmd 会因为找不到设备而无法启动,或者将自己标记为 `DOWN` 的不可用状态(具体行为根据版本不同而有变化)。一个缓解办法是,让 `slurmd.service` 依赖 `systemd-modules-load.service`,即执行 `systemctl edit slurmd`,增加:
145145

@@ -204,9 +204,9 @@ Slurm 的权限管理依赖于其账户数据库,因此需要 slurmdbd 的支
204204

205205
### pam_slurm_adopt
206206

207-
为了方便用户调试,超算集群通常会允许用户登录到此刻正在运行其任务的计算结点上,以方便调试程序,或者使用交互式的分配(salloc)。此前的 `pam_slurm` 虽然实现了这一功能,但无法在任务结束后自动收回资源,导致进程残留等一系列的问题。为此,Slurm 提供了新的 PAM 模块 [`pam_slurm_adopt`](https://slurm.schedmd.com/pam_slurm_adopt.html),可以在用户登录时自动“认领”其正在运行的作业,并在用户退出登录后自动释放资源。
207+
为了方便用户调试,超算集群通常会允许用户登录到此刻正在运行其任务的计算节点上,以方便调试程序,或者使用交互式的分配(salloc)。此前的 `pam_slurm` 虽然实现了这一功能,但无法在任务结束后自动收回资源,导致进程残留等一系列的问题。为此,Slurm 提供了新的 PAM 模块 [`pam_slurm_adopt`](https://slurm.schedmd.com/pam_slurm_adopt.html),可以在用户登录时自动“认领”其正在运行的作业,并在用户退出登录后自动释放资源。
208208

209-
首先在 `slurm.conf` 中确认已经设置 `PrologFlags=contain`,并启用了 `task/cgroup``proctrack/cgroup` 插件。在所有计算结点上安装 `libpam-slurm-adopt`,修改如下配置文件:
209+
首先在 `slurm.conf` 中确认已经设置 `PrologFlags=contain`,并启用了 `task/cgroup``proctrack/cgroup` 插件。在所有计算节点上安装 `libpam-slurm-adopt`,修改如下配置文件:
210210

211211
* `/etc/ssh/sshd_config`:确认 `UsePAM` 已启用。
212212
* `/etc/pam.d/sshd`:在 account 部分添加:
@@ -225,7 +225,7 @@ Slurm 的权限管理依赖于其账户数据库,因此需要 slurmdbd 的支
225225
!!! note "潜在影响"
226226
227227
禁用 `pam_systemd` 可能会导致某些依赖于 systemd 用户会话的功能(如用户级别的定时任务、用户级别的服务等)无法正常工作。
228-
考虑到计算结点通常不需要这些功能,作者认为这是可以接受的权衡。
228+
考虑到计算节点通常不需要这些功能,作者认为这是可以接受的权衡。
229229
230230
??? example "样例 PAM 配置"
231231
@@ -255,15 +255,15 @@ Slurm 的权限管理依赖于其账户数据库,因此需要 slurmdbd 的支
255255
256256
### Configless Slurm
257257
258-
在 20.02 版本后,Slurm 增加了 [Configless](https://slurm.schedmd.com/configless_slurm.html) 的功能,只需要在运行 slurmctld 的控制结点上维护一份配置,其他结点的 slurmd 或者 slurm 客户端在有需要时会自动拉取最新的配置,而在运行时进行 reconfig 也不用担心受到本地残留配置的影响。
258+
在 20.02 版本后,Slurm 增加了 [Configless](https://slurm.schedmd.com/configless_slurm.html) 的功能,只需要在运行 slurmctld 的控制节点上维护一份配置,其他节点的 slurmd 或者 slurm 客户端在有需要时会自动拉取最新的配置,而在运行时进行 reconfig 也不用担心受到本地残留配置的影响。
259259
260260
文档指出,实现 configless 需要满足以下要求:
261261
262262
1. 在 `slurm.conf` 中配置 `SlurmctldParameters=enable_configless` 并重启 slurmctld;
263263
2. 使得 slurmd 能找到 slurmctld:可以通过 DNS SRV 记录或者启动时传递 `--conf-server` 参数,或者传递 `SLURM_CONF_SERVER` 环境变量;
264264
3. 如果使用 SRV 记录,需要保证 slurmd 启动时本地没有任何配置(因为 [搜索顺序](https://slurm.schedmd.com/configless_slurm.html#NOTES) 中 SRV 记录优先级最低)。
265265
266-
简单起见,可以选择传参的方案,即在所有安装 slurmd 的结点上修改 `/etc/default/slurmd`,在 `SLURMD_OPTIONS` 中添加:
266+
简单起见,可以选择传参的方案,即在所有安装 slurmd 的节点上修改 `/etc/default/slurmd`,在 `SLURMD_OPTIONS` 中添加:
267267
268268
```text
269269
SLURMD_OPTIONS="--conf-server your_ctl_server:6817"
@@ -285,7 +285,7 @@ TemporaryFileSystem=/etc/slurm
285285
ConditionPathExists=
286286
```
287287

288-
如果有未安装任何 slurm 守护进程的结点(即“瘦”登录结点),需要安装 [`sackd`][sackd.8](从 25.05 开始提供),负责请求控制器、拉取缓存的配置供 `srun` 等客户端程序使用:
288+
如果有未安装任何 slurm 守护进程的节点(即“瘦”登录节点),需要安装 [`sackd`][sackd.8](从 25.05 开始提供),负责请求控制器、拉取缓存的配置供 `srun` 等客户端程序使用:
289289

290290
```shell
291291
apt-get install -y sackd
@@ -301,9 +301,9 @@ systemctl enable --now sackd
301301

302302
目前有大量的高性能计算工作负载已经迁移到了容器化环境中运行,Slurm 也提供了对容器的原生支持,这包括两步:
303303

304-
首先,Slurm 任务可以运行在容器中:通过配置 Slurm 的 [oci.conf][oci.conf.5],让 Slurm 可以在计算结点上调用容器 OCI 运行时(如 `runc`, `crun`, `nvidia-container-runtime` 等)。用户可以通过 `srun --container $OCI_BUNDLE` 来提交作业,Slurm 会根据配置,在计算结点上启动指定的容器,并在容器内运行用户的作业。也就是说,具体的容器运行时对 Slurm 用户是透明的。
304+
首先,Slurm 任务可以运行在容器中:通过配置 Slurm 的 [oci.conf][oci.conf.5],让 Slurm 可以在计算节点上调用容器 OCI 运行时(如 `runc`, `crun`, `nvidia-container-runtime` 等)。用户可以通过 `srun --container $OCI_BUNDLE` 来提交作业,Slurm 会根据配置,在计算节点上启动指定的容器,并在容器内运行用户的作业。也就是说,具体的容器运行时对 Slurm 用户是透明的。
305305

306-
进一步地,Slurm 还可以作为 OCI 容器运行时(“后端”):用户在提交作业时不需要使用 slurm 相关命令,而是直接使用 `podman`, `dockers` 或者 `singularity` 等前端工具,它们通过标准 OCI 接口调用 Slurm 的 [`scrun`][scrun.1] 命令来创建和运行容器,而 Slurm 会将容器提交到计算结点上运行。也就是说,Slurm 本身也对容器用户是透明的;最终效果是,用户可以像在单机上运行容器一样,在集群上运行容器,而不需要关心底层的调度和资源分配。
306+
进一步地,Slurm 还可以作为 OCI 容器运行时(“后端”):用户在提交作业时不需要使用 slurm 相关命令,而是直接使用 `podman`, `dockers` 或者 `singularity` 等前端工具,它们通过标准 OCI 接口调用 Slurm 的 [`scrun`][scrun.1] 命令来创建和运行容器,而 Slurm 会将容器提交到计算节点上运行。也就是说,Slurm 本身也对容器用户是透明的;最终效果是,用户可以像在单机上运行容器一样,在集群上运行容器,而不需要关心底层的调度和资源分配。
307307

308308
!!! warning "配置复杂"
309309

0 commit comments

Comments
 (0)