Какая работа выполняется на каком узле? - PullRequest
3 голосов
/ 10 апреля 2019

Вот быстрый вопрос, который часто возникает и ставит под сомнение мои навыки работы с AWK. Как составить список всех заданий в кластере вместе со списком узлов, в которых они размещены.

Что-то вроде:

 JobId          Job Name    State      Hosts
               . . .
 29428   _2.0_cont_7.job        R      fm3/6
 29429   _2.2_cont_7.job        R      fm3/6
 29430   _2.4_cont_8.job        R      fm1/6
 29431   _2.6_cont_8.job        R      fm1/6
 29835           taverna        R   mathserv/40
               . . .

Есть ли параметр для sinfo или qstat, который бы обеспечивал аналогичный вывод без дальнейшей обработки? Или какой хороший perl или awk однострочный для этой работы?

Вот что я сейчас запускаю

qstat -f | awk \
   '/Job Id/ {job=$3 ; 
        if (s > 0) {printf("%6s\t%16s\t%5s\t%8s\n",job,name,state,host); } s+=1} 
   /exec_host/ {host=$3} 
   /Job_Name/ {name=$3} 
   /job_state/ {state = $3} 
   END {printf("%6s\t%16s\t%5s\t%8s\n",job,name,state,host)}
   BEGIN {printf("%6s\t%16s\t%5s\t%8s\n","JobId","Job Name","State","Hosts")}'

UPDATE

Вот фрагмент вывода qstat -f:

Job Id: 29835
    Job_Name = taverna
    Job_Owner = meos@taverna
    interactive = True
    job_state = R
    queue = all
    qtime = Wed Apr 10 12:02:10 2019
    mtime = Wed Apr 10 12:02:10 2019
    ctime = Wed Apr 10 18:02:10 2019
    exec_host = mathserv/40
    Priority = 4294873206
    euser = meos(1006)
    egroup = meos(1000)
    Resource_List.walltime = 06:00:00
    Resource_List.nodect = 1
    Resource_List.ncpus = 40

Такие блоки печатаются для каждого задания, выполняемого в кластере.

Здесь параметр exec_host определяет узел и количество слотов на этом узле или наименьшее количество узлов с соответствующим количеством слотов, выделенных для задания. Остальные параметры самоочевидны.

Ожидаемый результат только для этого блока будет

 JobId          Job Name    State      Hosts
 29835           taverna        R   mathserv/40

ОБНОВЛЕНИЕ 2

Для всех, кто интересуется, обновлена ​​оригинальная программа AWK, чтобы исправить некоторые ошибки и улучшить форматирование. Это хорошо работает и на управляемых кластерах Torque и PBS.

qstat -f | awk '/Job Id/ {job=$3 ; 
        if (s > 0) {printf(format,lastjob,user,name,state,host)} ;
        lastjob=job ; s+=1} 
   /exec_host/ {host=$3} 
   /Job_Name/ {name=$3} 
   /job_state/ {state = $3} 
   /Job_Owner/ {user=$3; sub("@.*","",user)}
   END {printf(format,lastjob,user,name,state,host)}
   BEGIN {format="%10s\t%10s\t%25s\t%5s\t%8s\n";
          printf(format,"JobId","Owner","Job Name","State","Hosts")}'

Ответы [ 3 ]

3 голосов
/ 10 апреля 2019

Если вам не по вкусу страница справки qstat, проанализируйте вывод, как и вы.

Вот это с Perl

qstat -f | perl -wne'
    /Job Id:\s+(.*)/                              && push(@r, [$1])   or 
    /(?:Job_Name|job_state|exec_host)\s+=\s+(.*)/ && push(@{$r[-1]}, $1) 
    }{ 
    printf("%6s\t%16s\t%5s\t%8s\n", ("JobId", "Job Name", "State", "Hosts")
    printf("%6s\t%16s\t%5s\t%8s\n", @$_) for @r'

, где я копирую ваш выходной формат. Синтаксис }{ отмечает начало блока END.

Строка Job Id начинает новый массивref в наших результатах @r с идентификатором, являющимся его первым элементом. Другие требуемые поля добавляются в порядке появления к последнему (так текущему) arrayref в @r.

2 голосов
/ 10 апреля 2019

Это можно сделать без блока END, поскольку ваши входы и выходы расположены в одном и том же порядке.Ширина 0 запускает новую строку.

qstat -f | perl -nle'
   BEGIN { 
       @fields=("Job Id",qw( Job_Name job_state exec_host )); 
       @width{@fields}=(6,20,9,0); 
       $"="|"; $re=qr/^\s*(@fields)\s*[:=]\s*(.*\S)/; 
       printf "%$width{$_}s\t",$_ for @fields; print "";
   } 
   printf "%$width{$1}s\t%s", $2, $width{$1}?"":"\n" if /$re/
'
1 голос
/ 10 апреля 2019

Вы можете напрямую установить выходной формат squeue для большинства из них. AFAICT, он не обеспечивает загрузку ЦП для каждого узла отдельно, хотя:

squeue -t R --format="%.20i %.20j %.5t %.5C %R"

Пример вывода:

               JOBID                 NAME    ST  CPUS NODELIST(REASON)
            18206767 job_TR1_11_run007188     R     1 node05
            18206768 job_TR2_11_run007188     R     1 node13
            18207078 job_T1_11_run007188_     R     1 node24
            18207079 job_T2_11_run007188_     R     1 node14
            18207080 job_T3_11_run007188_     R     1 node17

Подробнее см. man squeue или https://slurm.schedmd.com/squeue.html.

...