slurm资源监控
超级计算机是军备竞赛的经典例子。 当现代超级计算机的性能不断提高扩展到新的问题领域时,这些庞大的系统为解决新问题提供了平台。 随着公司和国家努力提高LINPACK分数,超级计算机成为国家和公司荣誉的来源。 图1说明了超级计算机军备竞赛的过去五年,其中IBM Sequoia超级计算机是当前预计的2012年领导者。如图所示,IBM Roadrunner是第一台突破持久petaflops障碍的超级计算机(IBM BlueGene®/ L保持了领先地位)。从2004年到2008年排名第一)。
早期的超级计算机被设计用来模拟核武器。 如今,它们的应用变得更加多样化,解决了气候研究,分子建模,大规模物理模拟甚至暴力破解代码领域中的大量计算问题。
第一台超级计算机通常被认为是1964年发布的Control Data Corporation(CDC)6600(由Seymour Cray设计)。 6600在四个机柜中装有硬件,氟利昂冷却系统和一个能够每秒进行300万次浮点运算(FLOPS)的CPU。 尽管并不缺乏美观性,但其机柜中显然充满了彩色导线,将其外围单元处理器与单个CPU捆绑在一起,以使其尽可能保持繁忙。
快进到今天,当前的超级计算机领导者是日本的Kei计算机(由Fujitsu制造)。 该系统使用分散在864个机柜中的88,000多个SPARC64处理器,专注于强力计算能力。 Kei超级计算机的独特之处在于打破了10 petaflop的壁垒。 与CDC 6600相似,Kei不仅使用水冷,还使用水冷。
超级计算机不是关于任何特定的体系结构,而仅仅是处于计算性能前沿的设计。 如今,这意味着该系统可以在LINPACK基准测试的petaflops(或FLOPS的四千万)性能范围内运行。
不管超级计算机如何实现这些FLOPS,任何超级计算机体系结构的低级目标都是在有工作要做时以最佳方式保持计算资源繁忙。 类似于CDC 6600外围处理器(为了保持其单个CPU繁忙而存在),现代超级计算机需要相同的基本功能。 让我们看一下这样一种计算节点资源管理的实现,称为资源管理的简单Linux®实用程序 (SLURM)。
SLURM是用于大型计算节点群集的高度可扩展且容错的群集管理器和作业调度系统。 SLURM维护一个待处理的工作队列,并通过该工作管理资源的整体利用率。 它还以排他或非排他的方式(根据资源需求的功能)管理可用的计算节点。 最后,除了监视并行作业的完成之外,SLURM还将作业分配到一组分配的节点以执行该作业。
在幕后,SLURM是一个健壮的集群管理器(着重于功能丰富性上的需求),它具有高度可移植性,可扩展到大型节点集群,容错能力,并且最重要的是开源。 SLURM最初是开源资源管理器,由多家公司(包括劳伦斯·利弗莫尔国家实验室)共同开发。 如今,SLURM是许多最强大的超级计算机上的领先资源管理器。
SLURM实现了相当传统的集群管理架构(请参见图2 )。 顶部是一对冗余的集群控制器(尽管冗余是可选的)。 这些群集控制器充当计算群集的管理器,并实现一个称为slurmctld
的管理守护程序。 slurmctld
守护程序提供对计算资源的监视,但最重要的是,它将传入的作业(工作)映射到基础计算资源。
每个计算节点都实现一个名为slurmd
的守护程序。 slurmd
守护程序管理在其上执行的节点,包括监视节点上正在运行的任务,从控制器接受工作以及将工作映射到节点内核心上的任务。 如果控制器发出请求, slurmd
守护程序也可以停止执行任务。
该体系结构中还存在其他守护程序,例如,以实现安全身份验证。 但是群集不仅仅是节点的随机集合,因为其中一些节点可以在逻辑上关联时间点以进行并行计算。
可以将一组节点收集到称为分区的逻辑组中,该逻辑组通常包括传入工作队列。 可以对分区进行配置,限制条件涉及哪些用户可以使用分区或分区支持的时间限制。 分区的进一步改进是在一段时间内将分区内的一组节点映射到用户,这称为工作。 一个作业中有一个或多个作业步骤,这些步骤是在该节点子集上执行的一组任务。
图3显示了这种层次结构,它进一步说明了资源的SLURM分区。 注意,该划分包括对资源邻近性的了解,以确保协作节点之间的低延迟通信。
安装SLURM的方式最终取决于您的特定Linux环境,但是该过程可以像使用软件包管理器一样简单。 SLURM已完全打包,可轻松安装和配置。 对于我最喜欢的发行版Ubuntu,我使用高级打包工具(APT)安装SLURM软件包及其所有依赖项:
$ sudo apt-get install slurm-llnl
此操作占用的空间不到40MB,不仅包括SLURM,还包括每个依赖项,基本插件和其他必要的软件包。
在启动SLURM之前,必须为您的特定环境配置它。 为了创建我的配置文件,我使用了在线SLURM配置器,该配置器根据表单数据为我生成配置文件。 请注意,最后需要对文件进行处理,以删除不再受支持的选项。 清单1显示了我生成的配置文件(存储在/etc/slurm-llnl/slurm.conf中)。
# slurm.conf file generated by configurator.html.
# Put this file on all nodes of your cluster.
# See the slurm.conf man page for more information.
#
ControlMachine=mtj-VirtualBox
#
AuthType=auth/none
CacheGroups=0
CryptoType=crypto/openssl
MpiDefault=none
ProctrackType=proctrack/pgid
ReturnToService=1
SlurmctldPidFile=/var/run/slurmctld.pid
SlurmctldPort=6817
SlurmdPidFile=/var/run/slurmd.pid
SlurmdPort=6818
SlurmdSpoolDir=/tmp/slurmd
SlurmUser=slurm
StateSaveLocation=/tmp
SwitchType=switch/none
TaskPlugin=task/none
#
# TIMERS
InactiveLimit=0
KillWait=30
MinJobAge=300
SlurmctldTimeout=120
SlurmdTimeout=300
Waittime=0
#
# SCHEDULING
FastSchedule=1
SchedulerType=sched/backfill
SchedulerPort=7321
SelectType=select/linear
#
# LOGGING AND ACCOUNTING
AccountingStorageType=accounting_storage/none
ClusterName=cluster
JobCompType=jobcomp/none
JobCredentialPrivateKey = /usr/local/etc/slurm.key
JobCredentialPublicCertificate = /usr/local/etc/slurm.cert
JobAcctGatherFrequency=30
JobAcctGatherType=jobacct_gather/none
SlurmctldDebug=3
SlurmdDebug=3
#
# COMPUTE NODES
NodeName=mtj-VirtualBox State=UNKNOWN
PartitionName=debug Nodes=mtj-VirtualBox Default=YES MaxTime=INFINITE State=UP
请注意,在实际群集中, NodeName
将引用一定范围的节点,例如snode[0-8191]
,以指示群集中的8192个唯一节点(命名为snode0
至snode8191
)。
最后一步是为我的站点创建一组作业凭据密钥。 我选择对我的凭据密钥使用openssl
(在清单1的配置文件中称为JobCredential*
。我只是使用openssl
生成这些凭据,如清单2所示) 。
$ sudo openssl genrsa -out /usr/local/etc/slurm.key 1024
Generating RSA private key, 1024 bit long modulus
.................++++++
............................................++++++
e is 65537 (0x10001)
$ sudo openssl rsa -in /usr/local/etc/slurm.key -pubout -out /usr/local/etc/slurm.cert
writing RSA key
完成这些步骤后,我将需要向SLURM介绍我的配置。 我现在可以启动SLURM并与其进行交互。
要启动SLURM,只需使用/etc/init.d/slurm中定义的管理脚本。 该脚本接受start
, stop
, restart
和startclean
(以忽略所有先前保存的状态)。 使用此方法启动SLURM会导致slurmctld
守护程序(以及在此简单配置中的节点上的slurmd
守护程序)开始:
$ sudo /etc/init.d/slurm-llnl start
要验证SLURM现在正在运行,请使用sinfo
命令。 sinfo
命令返回有关SLURM节点和分区(在这种情况下,一个节点组成您的集群)的信息,如清单3所示 。
$ sinfo
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
debug* up infinite 1 idle mtj-VirtualBox
$
您可以从SLURM中可用的各种命令中获取有关SLURM群集的更多信息。 在启动SLURM中 ,您看到了sinfo
命令,用于了解您的集群。 您可以使用scontrol
命令获得更多信息,该命令使您可以查看有关集群各个方面的详细信息(如清单4 ,分区和节点所示)。
$ scontrol show partition
PartitionName=debug
AllocNodes=ALL AllowGroups=ALL Default=YES
DefaultTime=NONE DisableRootJobs=NO Hidden=NO
MaxNodes=UNLIMITED MaxTime=UNLIMITED MinNodes=1
Nodes=mtj-VirtualBox
Priority=1 RootOnly=NO Shared=NO PreemptMode=OFF
State=UP TotalCPUs=1 TotalNodes=1
$ scontrol show node mtj-VirtualBox
NodeName=mtj-VirtualBox Arch=i686 CoresPerSocket=1
CPUAlloc=0 CPUErr=0 CPUTot=1 Features=(null)
Gres=(null)
OS=Linux RealMemory=1 Sockets=1
State=IDLE ThreadsPerCore=1 TmpDisk=0 Weight=1
BootTime=2012-03-07T14:59:01 SlurmdStartTime=2012-04-17T11:10:43
Reason=(null)
要测试您的简单SLURM集群,可以使用srun
命令。 srun
命令分配计算资源并为您的工作启动任务。 请注意,您也可以单独执行此操作(通过salloc
和sbatch
)。 如清单5所示,您将一个简单的shell命令作为作业来演示srun
,然后提交一个sleep
命令(带有一个参数)并演示squeue
命令的使用来显示集群中存在的作业。
$ srun -l hostname
0: mtj-VirtualBox
$ srun -l sleep 5 &
[1] 24127
$ squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
15 debug sleep mtj R 0:03 1 mtj-VirtualBox
$
[1]+ Done srun -l sleep 5
$
请注意,在清单5中 ,您提交给集群的作业可以是简单的Linux命令,shell脚本文件或适当的可执行文件。
作为最后一个示例,请看如何停止工作。 在这种情况下,您将启动一个运行时间更长的作业,并使用squeue
来标识其ID。 然后,将作业ID与scancel
命令一起使用以终止该作业步骤(请参见清单6 )。
$ srun -l sleep 60 &
[1] 24262
$ squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
16 debug sleep mtj R 0:03 1 mtj-VirtualBox
$ scancel 16
srun: Force Terminated job 16
$ srun: Job step aborted: Waiting up to 2 seconds for job step to finish.
0: slurmd[mtj-VirtualBox]: error: *** STEP 16.0 CANCELLED AT 2012-04-17T12:08:08 ***
srun: error: mtj-VirtualBox: task 0: Terminated
[1]+ Exit 15 srun -l sleep 60
$
最后,您可以使用相同的slurm-llnl
脚本停止集群,如清单7所示 。
$ sudo /etc/init.d/slurm-llnl stop
* Stopping slurm central management daemon slurmctld [ OK ]
* Stopping slurm compute node daemon slurmd [ OK ]
slurmd is stopped
$
与Apache Hadoop不同,SLURM没有分布式文件系统的概念。 这样,需要更多的处理才能将数据分发给节点以进行给定的计算。 SLURM包含一个名为sbcast
的命令,该命令用于将文件传输到为SLURM作业分配的所有节点。 在SLURM群集的节点上使用并行或分布式文件系统是可能的,并且可能会更有效,因此不需要sbcast
即可分发数据进行处理。
在SLURM的这个简单演示中,您使用了这些命令的子集以及这些命令的一小部分可用选项(例如,请参见srun
命令中的可用选项)。 即使可用的命令数量最少,SLURM仍可实现功能强大且高效的集群管理器。
SLURM不是静态资源管理器,而是可以合并新行为的高度动态的资源管理器。 SLURM实现了插件应用程序编程接口(API),该接口允许在运行时动态加载运行时库。 此API已用于开发各种新行为,包括互连结构,身份验证和调度。 插件接口支持各种其他功能,例如作业统计,加密功能,消息传递接口(MPI),过程跟踪和资源选择。 所有这些使SLURM可以轻松支持不同的群集体系结构和实现。 有关详细信息,请查阅“ 相关主题 ”中的《 SLURM程序员指南》。
2011年,对SLURM进行了更新,增加了许多新功能,其中包括对IBM Blue Gene / Q超级计算机以及Cray XT和XE计算机的部分支持。 还添加了对Linux控制组(cgroups)的支持,它可以更好地控制Linux进程容器。
在2012年,将全面实施Blue Gene / Q支持,并根据工作需求和资源功能(例如,节点功能AMD)改进资源选择。 计划使用一种新工具来报告调度统计信息,并在不久的将来使用一种基于Web的管理工具。 SLURM的另一个未来计划是在云爆发的环境中,这涉及在云提供商中分配资源,并将溢出工作从本地群集迁移到云(也运行SLURM守护程序)。 该模型可能非常有用,并支持某些超级计算机工作负载中的弹性思想。
最后,SLURM开发人员正在考虑使用功率和热数据来更有效地在集群中分配工作,例如,将消耗高功率(从而产生更多热量)的作业放置在集群中更可能发生故障的区域中。散发热量。
SLURM的简短介绍说明了此开源资源管理器的简单性。 尽管现代超级计算机的价格超出了大多数人的承受能力,但SLURM为可伸缩的集群管理器提供了基础,该管理器可以将商用服务器转变为高性能集群。 此外,SLURM的体系结构可轻松为任何超级计算机(或商品集群)体系结构定制资源管理器。 这可能是为什么它是超级计算机领域领先的集群管理器的原因。
翻译自: https://www.ibm.com/developerworks/opensource/library/l-slurm-utility/index.html
slurm资源监控