如何修复 dockerized slurm 中的间歇性作业完成失败问题?

问题描述 投票:0回答:1

我正在尝试使用 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
进行配置。

以下是我注意到并尝试过的一些事情:

  1. 我将

    Dockerfile
    docker-compose.yml
    基于基于
    docker-compose
    的版本(即没有堆栈或群)。该版本工作得很好——工作照常完成。因此,似乎是向 Docker Stacks 过渡过程中的一些问题造成了麻烦。原文在这里:https://github.com/giovtorres/slurm-docker-cluster

  2. 我在日志中注意到

    slurmdbd
    收到“在 10.0.2.6:6817 连接 slurm 流套接字时出错:连接被拒绝”错误,与 swarm 负载均衡器对应的 IP 地址失败。我通过在
    docker-compose.yml
    中将所有服务声明为全局部署来摆脱这些问题。除了消除连接故障之外,它似乎没有改变任何东西。 编辑 @chris-becke 指出我误用了
    global
    ,所以我把它关掉了。没有帮助,但返回了“连接被拒绝”错误。

  3. 当我从其中一个容器内对系统中的任何服务执行

    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
    的输出中为该主机列出的地址相匹配。

配置文件

以下是系统的所有配置文件:

我以

docker stack deploy -c docker-compose.yml slurm-stack
开始。

示例日志

这些是作业未一致完成时的代表性日志。在这种情况下,作业 2(在

c2
上运行)和 3(在
c1
上运行)无法正确完成,但作业 1(在
c1
上运行)可以正确完成。

软件版本信息

Slurm 版本信息:

$ 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) 在全新的云实例上重建了所有内容。结果是一样的。

docker docker-compose docker-swarm slurm docker-stack
1个回答
0
投票

我不完全明白发生了什么,但我相信内部负载均衡器是罪魁祸首。

我为主机设置了

endpoint_mode: dnsrr
,问题就消失了,每个容器的双 IP 地址也消失了。

我的猜测是,负载均衡器正在将绑定到同一容器的请求分配到两个 IP 地址,这在某种程度上使 Slurm 感到困惑。

但是,我还是不明白为什么一开始就有两个地址。

© www.soinside.com 2019 - 2024. All rights reserved.