我正在尝试使用 docker 堆栈构建完全 docker 化的 slurm 部署,但作业无法一致完成。有谁知道为什么会这样?
除了这个问题之外,系统可以正常工作:所有节点都启动,我可以提交作业,并且它们运行。我遇到的问题是有些工作无法正确完成。现在它正在单节点群上运行。
我可以提交一堆:
salloc -t 1 srun sleep 10
我可以用
squeue
观看它们。其中一些将按预期在 10 秒后完成,但大多数会继续运行,直到达到 -t 1
的 1 分钟超时。
系统由五个docker服务组成:
slurm-stack_mysql
slurm-stack_slurmdbd
slurm-stack_slurmctld
slurm-stack_c1
slurm-stack_c2
c1
和 c2
是工作节点。所有五个服务都运行相同的 docker 映像(下面的 Dockerfile
),并使用下面链接的 docker-compose.yml
进行配置。
以下是我注意到并尝试过的一些事情:
我将
Dockerfile
和docker-compose.yml
基于基于docker-compose
的版本(即没有堆栈或群)。该版本工作得很好——工作照常完成。因此,似乎是向 Docker Stacks 过渡过程中的一些问题造成了麻烦。原文在这里:https://github.com/giovtorres/slurm-docker-cluster
我在日志中注意到
slurmdbd
收到“在 10.0.2.6:6817 连接 slurm 流套接字时出错:连接被拒绝”错误,与 swarm 负载均衡器对应的 IP 地址失败。我通过在 docker-compose.yml
中将所有服务声明为全局部署来摆脱这些问题。除了消除连接故障之外,它似乎没有改变任何东西。 编辑 @chris-becke 指出我误用了 global
,所以我把它关掉了。没有帮助,但返回了“连接被拒绝”错误。
当我从其中一个容器内对系统中的任何服务执行
host c2
、host c1
或 host <service>
时,我总是会得到两个 IP 地址。其中之一对应于我在 containers
的 docker network inspect slurm-stack_default
部分中看到的内容。另一个是较低的(例如,10.0.38.12
和 10.0.38.11
)。如果我在其中一个容器中运行 ip addr
,它报告的 IP 地址与 docker network inspect
的输出中为该主机列出的地址相匹配。
以下是系统的所有配置文件:
Dockerfile
:https://gist.github.com/stevenjswanson/b819ab3a68cc7d9aea72099263ef10bddocker-compose.yml
:https://gist.github.com/stevenjswanson/4b50e085385a0ffcb0d6ffed9186ed02slurm.conf
:https://gist.github.com/stevenjswanson/d8c48fcd6b19b504fda3a32c34227878slurmdb.conf
:https://gist.github.com/stevenjswanson/84b31b5ae793379f16eff16678f75b47install_slurm.sh
:
https://gist.github.com/stevenjswanson/bcd04828dbc69eb25acd48c3d4c8ef31docker-entrypoint.sh
:https://gist.github.com/stevenjswanson/0b3650a123fd93f54a1fd9b973ed2e65我以
docker stack deploy -c docker-compose.yml slurm-stack
开始。
这些是作业未一致完成时的代表性日志。在这种情况下,作业 2(在
c2
上运行)和 3(在 c1
上运行)无法正确完成,但作业 1(在 c1
上运行)可以正确完成。
slurmctld
日志:https://gist.github.com/stevenjswanson/67ca4c76bc00200d52b2d05ab7bfb422slurmdbd
日志:https://gist.github.com/stevenjswanson/b49d9571dbf6b9160555db3a0867410fc1
日志:https://gist.github.com/stevenjswanson/fab9ce8510804919fafe36804fd417f6c2
日志:https://gist.github.com/stevenjswanson/dd03f5bdf77851115086801691410099mysql
日志:https://gist.github.com/stevenjswanson/d7cfb82adde9c260ea4673e2037363d1Slurm 版本信息:
$ sinfo -V
slurm-wlm 21.08.5
Docker版本信息:
$ docker version
Client:
Version: 20.10.12
API version: 1.41
Go version: go1.17.3
Git commit: 20.10.12-0ubuntu4
Built: Mon Mar 7 17:10:06 2022
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.22
API version: 1.41 (minimum version 1.12)
Go version: go1.18.9
Git commit: 42c8b31
Built: Thu Dec 15 22:25:49 2022
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.14
GitCommit: 9ba4b250366a5ddde94bb7c9d1def331423aa323
runc:
Version: 1.1.4
GitCommit: v1.1.4-0-g5fd4c4d
docker-init:
Version: 0.19.0
GitCommit: de40ad0
Linux版本:
$ uname -a
Linux slurmctld 5.15.0-76-generic #83-Ubuntu SMP Thu Jun 15 19:16:32 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
编辑: 为了更好地衡量,我使用最新的 docker (24.0.5) 和内核 (5.15.0-78) 在全新的云实例上重建了所有内容。结果是一样的。
我不完全明白发生了什么,但我相信内部负载均衡器是罪魁祸首。
我为主机设置了
endpoint_mode: dnsrr
,问题就消失了,每个容器的双 IP 地址也消失了。
我的猜测是,负载均衡器正在将绑定到同一容器的请求分配到两个 IP 地址,这在某种程度上使 Slurm 感到困惑。
但是,我还是不明白为什么一开始就有两个地址。