slurm: есть ли способ вернуть неиспользованный номер ядра? - PullRequest
0 голосов
/ 29 апреля 2018

Как известно, squeue возвращает состояние запущенных заданий.

squeue
         JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
           130     debug   run.sh    user PD       0:00      1 (Resources)
           131     debug   run.sh    user PD       0:00      1 (Resources)
           128     debug 52546914    user  R       7:28      1 node1
           129     debug   run.sh    user  R       0:02      1 node1

Например, мой номер ядра 2.

[Q] Можно ли вернуть только неиспользованный номер ядра? В этом примере неиспользуемый номер ядра должен возвращать 0.

Должен ли я написать парсер для этого, чтобы получить номер ядра рядом с каждым R, добавить их и вычесть его из общего числа ядра следующим образом:

squeue | grep -P ' R       ' | awk '{print $7}' | paste -sd+ - | bc

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Чтобы узнать количество core (процессоров), доступных в вашем кластере, вы можете использовать команду sinfo:

$ sinfo -o%C
CPUS(A/I/O/T)
0/1920/0/1920

Вы можете легко получить числа в переменные Bash с помощью

IFS=/ read A  I O T <<<$(sinfo -h -o%C)

После выполнения вышеуказанной команды A будет содержать количество выделенных ядер, I будет количеством свободных ядер, O будет содержать количество «других» ядер, то есть опустошенных, выключенных и т. Д. и T будет общим количеством ядер в системе.

Обратите внимание, что в своем вопросе вы говорите о ядрах , но на самом деле вычисляете количество узлов . Если вам нужно количество узлов, вы можете использовать:

$ sinfo -o%A
NODES(A/I)
0/80

Подробнее см. Справочную страницу sinfo .

0 голосов
/ 29 апреля 2018

Решение Python, этот код будет находиться в спящем режиме до тех пор, пока не будет запущено простое ядро:

import os
def slurmPendingJobCheck(): #{
    totalCore = os.popen('sinfo | awk \'{print $4}\' | tail -n +2 | paste -sd+ - | bc').read().rstrip('\n');

    usedCoreNum = os.popen('squeue | grep -P \' R      \' | awk \'{print $7}\' | paste -sd+ - | bc').read().rstrip('\n');

    if usedCoreNum == '':
       usedCoreNum = 0;

    while True: #{
       if int(totalCore) - int(usedCoreNum) > 0: # Here we obtain unused code number.
          log('There is ' +  usedCoreNum + ' used core out of ' + totalCore + '.', 'green')
          break;

       log('Waiting running jobs to be completed.', 'blue')
       time.sleep(10);
       usedCoreNum = os.popen('squeue | grep -P \' R      \' | awk \'{print $7}\' | paste -sd+ - | bc').read().rstrip('\n');
    #}
#}
...