纲要:本文介绍slurm之以下几个方面:
- Slurm 概述
- Slurm 架构
- Slurm 提交作业模式与原理
一、Slurm概述
1.1 概念
Slurm(Simple Linux Utility for Resource Management),是一个开源、容错、高可伸缩的集群管理和大型小型 Linux 集群作业调度系统。
1.2 主要功能
a. slurm可在一段时间内为用户分配独占或者非独占的计算资源,以便他们能够执行工作任务;
b. slurm提供一个框架,以便管理并行任务在节点上的启动、执行和监视;
c. slurm通过管理挂起的工作队列,来仲裁资源争夺。
1.3 特性
a. 简单:源码简单,可以让用户理解其源码并添加功能;
b. 开源:任何一个使用者都可以在网上免费下载;
c. 便携:Slurm用C语言编写的,可以移植于任何一个类UNIX系统上;
d. 可扩展:可搭载于数十个节点的小集群,也可搭载于数千个节点的大集群上。
二、Slurm架构
2.1 网络架构
a.三维环面结构
Cray XT和XE支持此模式,此模式不需要作业在物理上相邻节点执行。在此模式下,Slurm使用希尔伯特曲线将节点从三维空间映射到一维空间。
b.层次网络结构
此模式下,slurm网络拓扑结构为一棵树,非叶子节点为交换机,叶子节点为计算节点,如图2.1所示,Slurm使用最佳匹配算法来选择最低层的交换机,使得此交换机层下面的叶子层资源满足作业需求。
其网络拓扑结构需在topology.conf文件中明确写出。图2.1所对应的topology.conf如图2.2所示。
2.2 资源管理架构
如图2.3所示,slurm资源管理架构主要包括四部分。
管理员———slurmctld
计算节点——slurmd
数据库———slurmdbd
用户————用户命令
2.2.1 slurmctld
slurmctld (Slurm Central Daemon)为多线程进程,支持对多种数据结构的读写锁机制,当该进程启动时,它会读取slurm.conf文件,根据文件对系统进行配置。Slurmctld包含三大部分:Node Manager:负责监视集群中每个节点的状态,周期性地检查slurmd的信息,并异步地从slurmd接受更新后的配置信息。Partition Manager:依据节点和分区的状态为作业分配分区。Job Manager:接受用户的作业请求,并根据调度算法和优先级决定是否对作业执行挂起、执行、完成等操作。
2.2.2 slurmd
slurmd(Slurm local daemon)是一个运行在每个compute node上的多线程进程,负责通知central daemon此节点处于等待、执行、返回等状态。如图2.4所示,slurmd主要包含5个功能。
Machine and Job Status Services:周期性地向slurmctld反馈节点和作业的状态信息。Remote Execution:在user执行完命令或slurmctldf指定完任务后,对该任务执行开始、监视和清除操作。其中开始执行进程之前要设置进程的limits,设置实际和有效的user id,建立环境变量,设置工作目录,设置核心文件路径、初始化Stream Copy Service等。Stream Copy Service:负责处理输入输出流重定向。Job Control:负责将Job终端请求传递给任何一组本地管理进程。
2.3 slurm 安全认证机制
Slurm提供了一个简单的安全模型:
a.任何一个用户可以提交、执行和删除自己的任务;
b.任何一个用户可以查看slurm configuration and state information
c.只有授权用户可以更改slurm configuration and cancel any jobs
其认证原理如图2.5所示。
Slurm采用munge机制进行安全认证:
a.Munge 进程运行在每一个节点上,通过getpeername()函数来确认用户信息,并产生一个凭证信息。该凭证信息包括:user ID,组ID,时间戳,生命周期,伪随机数等。
b.Munge利用私钥生成一个MAC(Message Authentication Code)用于认证。
c.然后Munge 用公钥加密包含MAC信息的认证。
d.Slurm进程之间互相传递加密后的认证信息,并将自己接受到的认证信息发送给自己的munge。
e.Munge利用自己的私钥去解密认证,获得user ID,group ID等信息。
三、Slurm提交作业模式与原理
3.1 Job Initiation Survey
如图3.1所示。
1. Srun进程连接slurm central daemon并请求资源和作业步初始化信息(包括job ID,可分配节点列表,job认证以及该作业是否可以被授权执行);
2. Slurmctld issue 一个应答给srun,该应答包括节点列表和作业认证
3. Srun 为每个任务初始化一个监听端口,并向slurmd发送一个message,要求该节点做初始化准备
4. Slurmd初始化作业步,并连接srun等待输入流
3.2 Three Modes for Submission of Jobs
3.2.1 Interactive Mode
如图3.2所示,交互模式以用户运行srun开始执行。Srun会向slurmctld发送一个信息,来请求资源和作业步的初始化。由于资源分配优先级的问题,srun可能不会立即得到回应。当资源可用时,slurmctld向srun发送回应信息,该信息包括作业步的认证,可用节点列表等。收到回复信息后srun向slurmd发送作业步初始化请求,slurmd判断收到的请求作业是否合法,然后回复srun。每一个slurmd调用一个作业线程来处理请求,对每一个请求返回一个任务线程,任务线程连接srun主机的端口来准备stdout和stderr线程。一旦此连接成功,任务线程便开始初始化用户在计算节点上的运行环境,工作目录和所需资源等。一旦用户进程退出,任务线程便记录退出时状态然后发送任务结束信息给srun,当所有的进程结束,作业线程便退出。当所有任务完成,srun便向slurmctld发送信息释放资源。当slurmctld确认srun不在需要资源,便向slurmd发送执行epilog命令。Slurmd向slurmctld发送epilog运行成功信息后,所有资源才会被归还到分区中。
3.2.2 Batch Mode
如图3.3所示,一旦batch作业提交,srun给slurmctld发送一个batch作业请求,该请求包含作业input/output的位置,当前工作目录环境,请求的节点数。Slurmctld将所有的请求按照某种优先级队列规则对他们进行排序。一旦资源满足并且作业优先级当前可以执行,slurm central daemon将给该作业分配资源并且告诉第一个被分配的节点该作业可以开始执行。此时作业为一个包含多个srun命令的作业脚本。计算节点上的slurmd应答slurmctld的运行作业请求、初始化作业线程、任务线程。脚本中的srun进程检测到分配给它的资源,然后开始初始化作业步,准备执行。当作业步执行完毕,脚本中的srun进程通知slurmctld并终止执行。而作业脚本此时继续执行下一条srun进程。一旦作业脚本执行完毕,运行该脚本的任务线程便收集退出状态,将任务退出信息发送给slurm central daemon,slurm central daemon注意到作业执行完毕,要求所有分配的节点执行epilog程序。当所有slurmd回应成功执行完毕epilog后,节点才会被归还给作业分区。
3.2.3 Allocate Mode
如图3.4所示,在此模式中,用户希望能申请资源,交互式地在资源上运行任务。Srun给slurmctld发送一个分配请求,如果资源可分配,则slurmctld应答srun。Srun在用户终端产生一个shell以便其使用资源。shell退出,则认定作业执行完毕。Shell中的srun读取环境变量和用户命令,并通知slurmctld,此时执行的作业为当前作业下的一个作业步。Slurmctld记录作业步信息并返回一个作业认证。接下来Srun用和交互模式相同的方法来初始化作业步。当用户退出shell,原始的srun接收到退出状态信息,通知slurmctld作业已完成,并退出。Slurm central daemon在每一个被分配节点上运行epilog程序,当所有被分配节点运行完毕该程序,节点才会被放回分区。
本文主要参考:
1.https://slurm.schedmd.com/quickstart.html
2.https://slurm.schedmd.com/slurmctld.html
3.https://slurm.schedmd.com/slurmd.html
4.Andy B. Yoo, Morris A. Jette, Mark Grondona SLURM: Simple Linux Utility for Resource Management. JSSPP 2003: 44-60.