我使用 SLURM 时遇到的问题可以总结如下。考虑一个test.sh
请求 8 个 CPU 但实际上使用 10 个 CPU 启动作业的 bash 脚本:
#!/bin/sh
#SBATCH --ntasks=8
stress -c 10
在具有 32 个 CPU 的服务器上,如果我使用 启动此脚本 5 次sbatch test.sh
,其中 4 次将立即开始运行,最后一个显示为待处理,如下squeue
命令所示:
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
5 main test.sh jack PD 0:00 1 (Resources)
1 main test.sh jack R 0:08 1 server
2 main test.sh jack R 0:08 1 server
3 main test.sh jack R 0:05 1 server
4 main test.sh jack R 0:05 1 server
问题是这 4 个作业实际上使用了 40 个 CPU,导致系统超载。相反,我希望 SLURM 要么不启动实际使用的资源多于用户请求的作业,要么将它们搁置,直到有足够的资源来启动它们。
关于我的文件的一些有用详细信息slurm.conf
:
# SCHEDULING
#DefMemPerCPU=0
FastSchedule=1
#MaxMemPerCPU=0
SchedulerType=sched/backfill
SchedulerPort=7321
SelectType=select/cons_res
SelectTypeParameters=CR_CPU
# COMPUTE NODES
NodeName=server CPUs=32 RealMemory=10000 State=UNKNOWN
# PARTITIONS
PartitionName=main Nodes=server Default=YES Shared=YES MaxTime=INFINITE State=UP
我刚刚开始使用 SLURM,我对这种行为感到困惑。我如何确保我的服务器用户不会启动使用过多 CPU 的作业?我阅读了手册,花了很多时间在论坛上寻找信息,但不幸的是,我没有找到任何有用的信息。
在此先非常感谢您的帮助!
答案1
Slurm 无法知道脚本将创建多少个进程/线程。它只能依靠请求的资源,因此它用它来安排作业。
这里最好的方法是使用 Slurm 中的任何亲和力插件来防止作业使用超过请求的资源。此插件将作业绑定到请求的 CPU。(亲和性文档)
显然,您无法控制用户在其脚本中启动了多少个进程/线程,但限制作业可以使用的核心数量将减少不受控制的用户对其他用户作业造成的影响。
这不会阻止您的系统出现超载现象,但“坏”用户只会影响他们自己。
答案2
下列的我们在 SO 上的讨论我一直在尝试使用--exclusive
参数来实现这一点。我的架构与您的不同(我有 7 个处理器可用于 slurm),但我所做的如下:
#!/bin/sh
#SBATCH --ntasks=2
srun -n 2 --exclusive stress -c 1
然后运行
sbatch test.sh ; sbatch test.sh ; sbatch test.sh ; sbatch test.sh
给了我6个stress
流程:
15050 tom 20 0 7308 212 108 R 100.0 0.0 1:47.46 stress
15054 tom 20 0 7308 208 108 R 100.0 0.0 1:47.47 stress
15063 tom 20 0 7308 208 108 R 100.0 0.0 1:47.47 stress
15064 tom 20 0 7308 212 108 R 100.0 0.0 1:47.47 stress
15080 tom 20 0 7308 208 108 R 100.0 0.0 1:47.46 stress
15076 tom 20 0 7308 212 108 R 99.7 0.0 1:47.45 stress
最后一个在队列中等待:
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
2368 Tom test.sh tom PD 0:00 1 (Resources)
2365 Tom test.sh tom R 5:03 1 Tom
2366 Tom test.sh tom R 5:03 1 Tom
2367 Tom test.sh tom R 5:03 1 Tom
因此,在这种情况下,使用srun -n 2
会导致同一进程启动两次。如果我使用,也会发生同样的事情
#!/bin/sh
#SBATCH --ntasks=2
srun -n 1 --exclusive stress -c 1 &
srun -n 1 --exclusive stress -c 1 &
srun -n 1 --exclusive stress -c 1 &
wait
即 SLURM 知道这个批处理脚本有两个任务,所以它会让两个任务同时运行;第三个任务必须“等待轮到它”。
另一方面
#!/bin/sh
#SBATCH --ntasks=1
srun -n 1 --exclusive stress -c 2
给我你在问题中描述的行为。
不确定这是否能完全回答你的问题但也许有一点帮助。