概述
在Slurm集群中,有很多组件需要能够相互通信。有些站点有安全要求,不能打开机器之间的所有通信,需要有选择地打开必要的端口。本文件将介绍不同的组件需要怎样才能相互交流。
下面是一个相当典型的集群图,slurmctld和slurmdbd在不同的机器上。在较小的集群中,MySQL可以和slurmdbd运行在同一台机器上,但在大多数情况下,最好是让它运行在一台专门的机器上。 slurmd运行在计算节点上,客户端命令可以在你选择的机器上安装和运行。
slurmctld的通讯方式
slurmctld用于监听传入请求的默认端口是6817,这个端口可以通过slurm.conf修改SlurmctldPort
参数改变。Slurmctld在该端口监听传入的请求,并在请求者打开的同一连接上作出回应。
运行slurmctld的机器也需要能够建立对外的连接,它需要在默认的6819端口与slurmdbd进行通信。它还需要与计算节点上的slurmd进行通信,默认端口为6818。
默认情况下,slurmctld会监听IPv4流量。通过在slurm.conf的CommunicationParameters中加入EnableIPv6
,可以启用IPv6通信。在启用IPv6后,你可以通过在CommunicationParameters
中加入DisableIPv4
来禁用IPv4。这些设置必须在slurmdbd.conf和slurm.conf中匹配。
slurmdbd的通信
slurmdbd用于监听传入请求的默认端口是6819,这个端口可以通过slurmdbd.conf上的SlurmctldPort
参数改变。Slurmdbd在该端口监听传入的请求,并在请求者打开的同一连接上进行响应。
运行slurmdbd的机器需要能够到达MySQL或MariaDB服务器,默认端口为3306。这个端口可以通过slurmdbd.conf上的StoragePort
参数来改变。它还需要能够启动与slurmctld的连接,默认端口为6819。
默认情况下,slurmdbd将监听IPv4流量。通过在slurmdbd.conf的CommunicationParameters
中加入EnableIPv6
,可以启用IPv6通信。在启用IPv6后,你可以通过在CommunicationParameters
中加入DisableIPv4
来禁用IPv4。这些设置必须在slurmdbd.conf和slurm.conf中匹配。
slurmd的通信
slurmd用于监听来自slurmctld的传入请求的默认端口是6818,这个端口可以通过slurm.conf上的SlurmdPort
参数来改变。
运行srun的机器也使用一系列的端口,以便能够与slurmstepd通信。默认情况下,这些端口是从短暂的端口范围中随机选择的,但是你可以使用SrunPortRange
来指定一个可以从中选择的端口范围。这对于在防火墙后面的登录节点是必要的。
运行slurmd的机器需要能够在默认的6817端口与slurmctld建立连接。
默认情况下,slurmd通过IPv4进行通信。由于slurm.conf参数也会影响slurmd守护进程,请参见slurmctld部分,以了解如何改变这一点。
客户端命令的通信
大多数客户端命令默认会在6817端口与slurmctld进行通信(关于如何改变这一点,请参见slurmctld部分),以获得它们需要的信息。这包括以下命令。
- salloc
- sacctmgr
- sbatch
- sbcast
- scancel
- scontrol
- sdiag
- sinfo
- sprio
- squeue
- sshare
- sstat
- strigger
- sview
还有一些命令与slurmdbd直接通信,默认端口为6819,下面的命令从slurmdbd获取信息:
- sacct
- sacctmgr
- sreport
当用户使用srun启动一个作业时,必须有一个从调用srun的机器到作业分配的节点的通信路径。通信遵循下面的顺序。
- srun向slurmctld发送作业分配请求
- slurmctld批准分配并返回详细信息
- srun向slurmctld发送步骤创建请求
- slurmctld用步骤凭证进行响应
- srun为I/O打开套接字
- srun将带有任务信息的凭证转发给slurmd
- slurmd根据需要转发请求(按扇出)。
- slurmd forks/execs slurmstepd
- slurmstepd连接I/O并启动任务
- 在任务终止时,slurmstepd会通知srun
- srun通知slurmctld任务终止
- slurmctld通过slurmd验证所有进程的终止,并为下一个作业释放资源
与多个控制器的通信
你可以配置一个次要的slurmctld和/或slurmdbd,作为主控制器发生故障时的后备。所涉及的端口不会改变,但有额外的通信路径需要考虑到。客户端命令需要能够到达运行slurmctld的两台机器,以及运行slurmdbd的两台机器。slurmctld的两个实例都需要能够到达slurmdbd的两个实例,每个slurmdbd都需要能够到达MySQL服务器。
与多个集群的通信
在多个slurmctld实例共享同一个slurmdbd的环境中,你可以将每个集群配置成独立的,并允许用户指定一个集群来提交他们的作业。不同守护进程使用的端口不会改变,但所有slurmctld实例都需要能够与同一个slurmdbd实例通信。你可以在多集群操作文档中阅读更多关于多集群配置的内容。
federation中的通信
Slurm还提供了在多个集群之间以点对点方式安排作业的能力,允许作业首先在有可用资源的集群上运行。这与多集群配置在通信需求上的区别在于,slurmctld的两个实例需要能够相互通信。在文档中有更多关于使用federation的细节。
与IPv6的通信
slurmctld、slurmdbd和slurmd守护进程默认使用IPv4通信,但它们可以被配置为使用IPv6。这可以通过在slurm.conf和slurmdbd.conf中设置CommunicationParameters=EnableIPv6
,然后重新启动所有的守护进程来处理。在这种模式下,slurmd可以通过IPv4或IPv6运行。可以通过设置CommunicationParameters=EnableIPv6,DisableIPv4
来禁用IPv4。在这个模式下,所有的东西都必须有一个有效的IPv6地址,否则连接会失败。
slurmctld希望一个节点能映射到一个IP地址(这将是用getaddrinfo()查找节点的IP时返回的第一个地址)。如果你在一个现有的集群上启用了IPv6,并且节点有IPv6地址,你必须重新启动slurmd守护进程以建立IPv6的通信。
在 /etc/gai.conf 中出现的优先级 ::fff:0:0/96 100 将导致 IPv4 地址在 IPv6 地址之前被返回。这可能会导致这样一种情况:你已经为 Slurm 启用了 IPv6,但仍然看到节点在用 IPv4 通信。如果对哪个地址被使用感到困惑,你可以调用 scontrol setdebugflags +NET 来在 slurmctld.log 中启用网络相关的调试日志。
如果启用了 IPv4 和 IPv6,环回接口可能仍然解析为 127.0.0.1。这不一定说明有问题。