在Slurm集群中,有很多组件需要能够相互通信。有些站点有安全要求,不能打开机器之间的所有通信,需要有选择地打开必要的端口。本文件将介绍不同的组件需要怎样才能相互交流。
下面是一个相当典型的集群图,slurmctld
和slurmdbd
在不同的机器上。在较小的集群中,MySQL可以和slurmdbd
运行在同一台机器上,但在大多数情况下,最好是让它运行在一台专门的机器上。 slurmd
运行在计算节点上,客户端命令可以在你选择的机器上安装和运行。
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
用于监听传入请求的默认端口是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
用于监听来自slurmctld
的传入请求的默认端口是6818
,这个端口可以通过slurm.conf
上的SlurmdPort
参数来改变。
运行srun
的机器也使用一系列的端口,以便能够与slurmstepd
通信。默认情况下,这些端口是从短暂的端口范围中随机选择的,但是你可以使用SrunPortRange
来指定一个可以从中选择的端口范围。这对于在防火墙后面的登录节点是必要的。
运行slurmd
的机器需要能够在默认的6817
端口与slurmctld
建立连接。
默认情况下,slurmd
通过IPv4进行通信。由于slurm.conf
参数也会影响slurmd
守护进程,请参见slurmctld
部分,以了解如何改变这一点。
大多数客户端命令默认会在6817
端口与slurmctld
进行通信(关于如何改变这一点,请参见slurmctld
部分),以获得它们需要的信息。这包括以下命令。
还有一些命令与slurmdbd
直接通信,默认端口为6819
,下面的命令从slurmdbd
获取信息:
当用户使用srun
启动一个作业时,必须有一个从调用srun
的机器到作业分配的节点的通信路径。通信遵循下面的顺序。
你可以配置一个次要的slurmctld
和或slurmdbd
,作为主控制器发生故障时的后备。所涉及的端口不会改变,但有额外的通信路径需要考虑到。客户端命令需要能够到达运行slurmctld
的两台机器,以及运行slurmdbd
的两台机器。slurmctld
的两个实例都需要能够到达slurmdbd
的两个实例,每个slurmdbd
都需要能够到达MySQL服务器。
在多个slurmctld实例共享同一个slurmdbd的环境中,你可以将每个集群配置成独立的,并允许用户指定一个集群来提交他们的作业。不同守护进程使用的端口不会改变,但所有slurmctld实例都需要能够与同一个slurmdbd实例通信。你可以在多集群操作文档中阅读更多关于多集群配置的内容。
Slurm还提供了在多个集群之间以点对点方式安排作业的能力,允许作业首先在有可用资源的集群上运行。这与多集群配置在通信需求上的区别在于,slurmctld的两个实例需要能够相互通信。在文档中有更多关于使用federation的细节。
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。这不一定说明有问题。