slurm:有没有办法返回未使用的核心号码?

时间:2018-04-29 06:58:14

标签: slurm

我们知道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.

[问] 有没有办法只返回未使用的核心号码?在该示例中,未使用的核心编号应返回0.

我应该为此编写一个解析器,以便检索每个R旁边的核心编号,添加它们,然后从总核心编号中减去它,如下所示:

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

2 个答案:

答案 0 :(得分:2)

要了解群集中可用的核心(CPU)的数量,您可以使用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将包含其他&#39;其他& #39;核心,即排水,下降等,T将是系统中的核心总数。

请注意,在您的问题中,您谈论的是核心,但实际上计算了节点的数量。如果你想要的是节点数,你可以使用:

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

有关详细信息,请参阅sinfo man page

答案 1 :(得分:1)

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');
    #}
#}