SLURM позволяет заданиям использовать больше процессоров, чем запрошено для запуска
Проблема, с которой я сталкиваюсь с SLURM, может быть кратко изложена следующим образом. Рассмотрим скрипт bash test.sh
который запрашивает 8 процессоров, но фактически запускает работу с использованием 10 процессоров:
#!/bin/sh
#SBATCH --ntasks=8
stress -c 10
На сервере с 32 процессорами, если я запускаю этот скрипт 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 процессоров и перегружают систему. Напротив, я бы ожидал, что 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, и я озадачен этим поведением. Как я могу убедиться, что пользователи моего сервера не запускают задания, которые используют слишком много процессоров? Я прочитал руководство и потратил много времени на поиск информации на форумах, но, к сожалению, я не нашел ничего полезного.
Заранее большое спасибо за вашу помощь!
2 ответа
Slurm не может знать, сколько процессов / потоков собирается создать скрипт. Он может полагаться только на запрошенные ресурсы и, следовательно, именно это он использует для планирования заданий.
Наилучшим подходом здесь будет использование любого из подключаемых плагинов в Slurm, чтобы запретить заданиям использовать больше ресурсов, чем запрошено. Эти плагины связывают работу с запрошенным процессором. ( Документация по сходству)
Очевидно, что вы не можете контролировать, сколько процессов / потоков запускает пользователь в своем сценарии, но ограничивая количество ядер, которые может использовать задание, вы уменьшите влияние, которое неконтролируемый пользователь может оказать на задания других пользователей.
Это не помешает вашей системе выглядеть перегруженной, но "плохие" пользователи будут влиять только на себя.
После нашего обсуждения в 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
дает мне поведение, которое вы описываете в своем вопросе.
Не уверен, что это отвечает на 100%, но, возможно, это немного помогает.