HPC作业调度
声明
本系列分享,主要内容为ChatGPT创作, 仅供参考学习。
基本概念
HPC作业(job)调度是指在高性能计算环境中,将用户提交的作业分配到合适的计算资源上,并进行有效的管理和调度,以提高计算效率和资源利用率。作业调度是HPC系统的关键组成部分,它涉及到作业的提交、排队、调度和执行等多个方面。
下面是HPC作业调度的一般流程和涉及的关键概念:
作业提交(Job Submission):用户将待执行的作业提交到作业调度系统。作业可以包括计算任务、资源需求、作业优先级等信息。
作业排队(Job Queueing):作业调度系统将已提交的作业放置在作业队列中,按照一定的规则进行排序和排队。作业队列可以根据优先级、提交时间、资源需求等因素进行排序。
资源分配(Resource Allocation):当资源可用时,作业调度系统会根据作业的资源需求和系统当前的可用资源情况,将作业分配给合适的计算节点。资源分配通常涉及到计算节点、处理器核心、内存等资源的分配和管理。
作业调度(Job Scheduling):作业调度系统根据一定的调度策略,决定哪个作业在什么时间、使用哪些资源来执行。调度策略可以根据作业的优先级、作业类型、系统负载等进行调整。
作业执行(Job Execution):作业调度系统将已调度的作业发送给计算节点进行执行。在计算节点上,作业可以并行执行、分布式执行等,以充分利用集群中的计算资源。
作业监控(Job Monitoring):作业调度系统会跟踪和监控作业的执行状态、资源使用情况、错误信息等。用户可以通过监控系统来了解作业的进度和性能。
作业完成(Job Completion):当作业执行完成后,作业调度系统会将执行结果返回给用户,并将作业从系统中移除。
HPC作业调度系统的目标是最大化资源利用率、最小化作业等待时间、保证作业公平性和可靠性。不同的作业调度系统具有不同的调度策略和功能,常见的HPC作业调度系统包括Slurm、PBS/Torque、LSF等。
下面我们熟悉下调度器相关内容,以超算使用较多的Slurm为例。
Slurm介绍
Slurm(Simple Linux Utility for Resource Management)是一个开源的作业调度系统,用于管理和调度计算集群中的作业和资源。下面是Slurm作业调度系统的基本概念、架构和功能的介绍:
基本概念:
- 作业(Job):用户提交给Slurm的计算任务称为作业。作业可以是单个进程、多个并行进程或者任务的集合。
- 分区(Partition):分区是集群中的逻辑划分,用于对资源进行管理和调度。每个分区可以具有不同的调度策略和资源限制。
- 节点(Node):节点是计算集群中的物理计算单元,包含处理器(CPU)、内存和其他资源。节点可以是单个计算机或者是计算机集群中的一个计算单元。
- 任务(Task):任务是作业中的一个独立执行单元。作业可以包含多个任务,每个任务可以在一个节点上运行。
架构:
Slurm作业调度系统的架构是分布式的,由多个组件组成:
- Slurmctld:Slurmctld是Slurm的中央控制守护进程,负责协调整个系统的操作。它接收作业请求,进行作业调度和资源分配,并跟踪作业的状态和进度。
- Slurmd:Slurmd是每个计算节点上运行的守护进程,负责管理节点上的资源和执行作业。它与Slurmctld通信,接收作业的指令并进行任务的调度和执行。
- Slurmdbd:Slurm使用数据库来存储集群的配置信息、作业状态和其他相关数据。常用的数据库包括MySQL和SQLite。
功能:
Slurm作业调度系统具有以下功能和特点:
- 作业调度:Slurm提供灵活的作业调度功能,根据作业的优先级、资源需求和可用性等因素进行作业的调度和分配。
- 资源管理:Slurm可以管理集群中的资源,包括计算节点、处理器核心、内存和其他硬件资源。它可以有效地分配和管理这些资源,以满足不同作业的需求。
- 作业控制:Slurm提供作业的提交、取消、暂停和恢复等操作,使用户可以方便地控制作业的执行。
- 任务并行:Slurm支持任务级别的并行,可以将一个作业的任务分配到多个计算节点上并行执行,提高计算效率。
- 作业监控:Slurm可以跟踪和监控作业的状态、进度和资源使用情况,提供详细的作业监控和统计信息
通过合理的作业调度和管理,可以提高HPC系统的整体效率,充分利用计算资源,实现快速、高效的科学计算和工程计算。
Slurm作业提交和管理
使用Slurm作业调度系统,可以通过以下步骤来提交作业、查询作业状态和删除作业等操作:
编写作业脚本:
- 创建一个作业脚本
script.sh
,其中包含作业的相关配置和执行命令。作业脚本可以使用任何编程语言或脚本语言编写,并指定作业所需的资源、执行命令、环境变量等。
- 创建一个作业脚本
作业提交(Job Submission):
- 使用
sbatch
命令提交作业:sbatch script.sh
。 - 也可以使用
sbatch
命令的参数来指定作业名称、作业队列、资源需求等信息。例如:sbatch --job-name=myjob --partition=compute --nodes=2 --ntasks-per-node=4 script.sh
。
- 使用
查询作业状态(Job Status):
- 使用
squeue
命令来查看当前集群中的作业状态:squeue
。 - 可以使用
squeue
命令的参数来筛选特定的作业状态、队列、用户等信息。例如:squeue --user=myuser
。
- 使用
查询作业详情(Job Details):
- 使用
scontrol
命令结合作业ID来查询作业的详细信息:scontrol show job <job_id>
,其中<job_id>
是作业的ID。 - 可以使用
scontrol
命令的参数来查询特定作业的状态、资源使用情况等详细信息。例如:scontrol show job <job_id> --details
。
- 使用
取消作业(Job Deletion):
- 使用
scancel
命令取消已提交的作业:scancel <job_id>
,其中<job_id>
是要取消的作业的ID。 - 可以使用
scancel
命令的参数来指定取消作业的条件,如作业状态、用户等。例如:scancel --state=running --user=myuser
。
- 使用
查看作业输出:
- Slurm会将作业的输出重定向到文件中。可以使用文件查看命令(如
cat
或less
)来查看作业的输出。作业输出文件通常以slurm-jobID.out
的形式命名,其中jobID
是作业的唯一标识符。
- Slurm会将作业的输出重定向到文件中。可以使用文件查看命令(如
以上命令仅是Slurm作业调度系统中的一部分常用命令示例,更多详细的命令和参数可以参考Slurm的官方文档或使用man
命令查看相应的命令手册。
Slurm作业资源管理
在Slurm中,可以使用以下方法来管理计算资源:
节点分配策略:
- Slurm使用节点分配策略来决定将作业分配给哪些节点。节点分配策略可以基于不同的因素进行配置,例如节点的可用性、负载情况、内存容量、GPU数量等。您可以通过配置Slurm的调度器来定义节点分配策略,以满足特定的需求。
任务限制:
- Slurm允许您设置作业的资源限制。这些资源限制可以包括CPU核数、内存大小、运行时间、节点数量等。您可以在作业脚本中或使用
sbatch
命令的选项中指定这些限制。Slurm将根据这些限制来分配适当的资源并控制作业的执行。
- Slurm允许您设置作业的资源限制。这些资源限制可以包括CPU核数、内存大小、运行时间、节点数量等。您可以在作业脚本中或使用
优先级管理:
- Slurm允许您为作业设置优先级,以控制作业在资源分配中的顺序。您可以使用
sbatch
命令的选项来指定作业的优先级,也可以使用scontrol
命令进行更高级的优先级管理。通过设置适当的优先级,您可以确保重要的作业在资源有限的情况下得到优先考虑。
- Slurm允许您为作业设置优先级,以控制作业在资源分配中的顺序。您可以使用
资源限制和保留:
- Slurm还支持资源限制和保留功能。您可以为特定用户或用户组设置资源限制,以确保他们不会超过指定的资源配额。此外,您还可以设置资源保留,即保留一定数量的资源供特定作业或用户使用,以满足特殊需求或紧急情况。
通过合理配置节点分配策略、设置适当的任务限制和优先级,您可以在Slurm中有效地管理计算资源,以满足不同作业的需求并提高整体系统的利用率。建议参考Slurm的官方文档或与集群管理员进行交流,以获取更详细的配置和管理指导。