Как контролировать ресурсы во время работы с грязью?

Я выполняю задания в нашем университетском кластере (обычный пользователь, без прав администратора), который использует систему планирования SLURM, и мне интересно составить график использования процессора и памяти с течением времени, то есть во время выполнения задания. Я знаю о sacct а также sstat и я подумывал включить эти команды в мой сценарий представления, например, что-то в строке

#!/bin/bash
#SBATCH <options>

# Running the actual job in background
srun my_program input.in output.out &

# While loop that records resources
JobStatus="$(sacct -j $SLURM_JOB_ID | awk 'FNR == 3 {print $6}')"
FIRST=0
#sleep time in seconds
STIME=15
while [ "$JobStatus" != "COMPLETED" ]; do
    #update job status
    JobStatus="$(sacct -j $SLURM_JOB_ID | awk 'FNR == 3 {print $6}')"
    if [ "$JobStatus" == "RUNNING" ]; then
        if [ $FIRST -eq 0 ]; then
            sstat --format=AveCPU,AveRSS,MaxRSS -P -j ${SLURM_JOB_ID} >> usage.txt
            FIRST=1
        else
            sstat --format=AveCPU,AveRSS,MaxRSS -P --noheader -j ${SLURM_JOB_ID} >> usage.txt
        fi
        sleep $STIME
    elif [ "$JobStatus" == "PENDING" ]; then
        sleep $STIME
    else
        sacct -j ${SLURM_JOB_ID} --format=AllocCPUS,ReqMem,MaxRSS,AveRSS,AveDiskRead,AveDiskWrite,ReqCPUS,AllocCPUs,NTasks,Elapsed,State >> usage.txt
        JobStatus="COMPLETED"
        break
    fi
done

Тем не менее, я не совсем уверен в этом решении:

  • sstat к сожалению, не показывает, сколько процессоров используется в данный момент (только среднее)

  • MaxRSS также не помогает, если я пытаюсь записывать использование памяти с течением времени

  • Кажется, все еще есть какая-то ошибка (скрипт не останавливается после завершения работы)

У кого-нибудь есть идеи, как это сделать правильно? Может быть, даже с top или же htop вместо sstat? Буду признателен за любую оказанную помощь.

1 ответ

Slurm предлагает плагин для записи профиля работы (использование ПК, использование памяти, даже дисковый / сетевой ввод-вывод для некоторых технологий) в файл HDF5. Файл содержит временные ряды для каждой отслеживаемой меры, и вы можете выбрать разрешение по времени.

Вы можете активировать его с

#SBATCH --profile=<all|none|[energy[,|task[,|filesystem[,|network]]]]>

Смотрите документацию здесь.

Чтобы убедиться, что этот плагин установлен, запустите

scontrol show config | grep AcctGatherProfileType

Должен вывести AcctGatherProfileType = acct_gather_profile/hdf5,

Что касается вашего сценария, вы можете попробовать заменить sstat с подключением SSH к вычислительным узлам для запуска ps, Если предположить, pdsh или же clush установлен, вы можете запустить что-то вроде:

pdsh -j $SLURM_JOB_ID ps -u $USER -o pid,state,cputime,%cpu,rssize,command --columns 100 >> usage.txt

Это даст вам процессор и использование памяти на процесс.

В заключение, ваша работа никогда не прекращается просто потому, что она закончится, когда while цикл завершается, и while цикл завершится, когда работа завершится... Условие "$JobStatus" == "COMPLETED" никогда не будет наблюдаться изнутри сценария. Когда работа завершена, скрипт убит.

Другие вопросы по тегам