Я использую slurm для управления некоторыми нашими вычислениями, но иногда задания убиваются из-за ошибки нехватки памяти, даже если это не так.Эта странная проблема была с заданиями Python, использующими, в частности, многопроцессорность.
Вот минимальный пример, чтобы воспроизвести это поведение
#!/usr/bin/python
from time import sleep
nmem = int(3e7) # this will amount to ~1GB of numbers
nprocs = 200 # will create this many workers later
nsleep = 5 # sleep seconds
array = list(range(nmem)) # allocate some memory
print("done allocating memory")
sleep(nsleep)
print("continuing with multiple processes (" + str(nprocs) + ")")
from multiprocessing import Pool
def f(i):
sleep(nsleep)
# this will create a pool of workers, each of which "seem" to use 1GB
# even though the individual processes don't actually allocate any memory
p = Pool(nprocs)
p.map(f,list(range(nprocs)))
print("finished successfully")
Несмотря на то, что это может нормально работать локально, кажется, что при подсчете памяти из-за слухаувеличение резидентной памяти для каждого из этих процессов, что приводит к использованию памяти nprocs x 1 ГБ, а не просто 1 ГБ (фактическое использование памяти).Я думаю, что это не то, что нужно делать, и дело не в том, что делает ОС, похоже, что это не перестановка или что-то в этом роде.
Вот вывод, если я запускаю код локально
> python test-slurm-mem.py
done allocation memory
continuing with multiple processes (0)
finished successfully
И скриншот htop
А вот вывод, если я запускаю ту же команду, используя slurm
> srun --nodelist=compute3 --mem=128G python test-slurm-mem.py
srun: job 694697 queued and waiting for resources
srun: job 694697 has been allocated resources
done allocating memory
continuing with multiple processes (200)
slurmstepd: Step 694697.0 exceeded memory limit (193419088 > 131968000), being killed
srun: Exceeded job memory limit
srun: Job step aborted: Waiting up to 32 seconds for job step to finish.
slurmstepd: *** STEP 694697.0 ON compute3 CANCELLED AT 2018-09-20T10:22:53 ***
srun: error: compute3: task 0: Killed
> $ sacct --format State,ExitCode,JobName,ReqCPUs,MaxRSS,AveCPU,Elapsed -j 694697.0
State ExitCode JobName ReqCPUS MaxRSS AveCPU Elapsed
---------- -------- ---------- -------- ---------- ---------- ----------
CANCELLED+ 0:9 python 2 193419088K 00:00:04 00:00:13