4

对于使用 qsub 调用的 PBS 脚本,我想知道实际分配了多少 CPU,以防 PBS 文件中定义的数字被命令行输入覆盖。例如使用以下 pbs 脚本文件:

作业脚本.pbs:

#!/bin/bash
#PBS -N test_run
#PBS -l nodes=32
#PBS -l walltime=06:00:00
#PBS -j oe
#PBS -q normal
#PBS -o output.txt

cd $PBS_O_WORKDIR

module load gcc-openmpi-1.2.7
time mpiexec visct

该脚本可以使用以下命令行仅使用 16 个 CPU(而不是 32 个)运行:

$ qsub -l nodes=2:ppn=8 jobscript.pbs

因此,我想要一种可靠的方法来确定脚本中实际可用的 CPU 数量。

4

2 回答 2

7

我能够使用环境变量通过以下解决方案回答我自己的问题,该$PBS_NODEFILE环境变量包含文件的路径,其中列出了有关可用节点的信息:

作业脚本.pbs:

#!/bin/bash
#PBS -N test_run
#PBS -l nodes=32
#PBS -l walltime=06:00:00
#PBS -j oe
#PBS -q normal
#PBS -o output.txt

# This finds out the number of nodes we have
NP=$(wc -l $PBS_NODEFILE | awk '{print $1}')
echo "Total CPU count = $NP"

感谢“来源”经过大量的在线搜索。

于 2013-07-23T08:03:08.277 回答
5

MasterHD 我知道你已经找到了答案,但我想我会以另一种方式分享

这段代码更长,但它有助于满足我的特定需求。我实际上使用 pbsnodes 命令。下面是我的代码片段。

@nodes_whole =`pbsnodes -av -s $server | grep "pcpus" `;
$nodes_count = ` pbsnodes -av -s $server | grep "pcpus" | wc -l `;
while($i < $nodes_count){
    @cpu_present = split(/\s+/, $nodes_whole[$i]);
    $cpu_whole_count += $cpu_present[3];
    $i++;
}

我这样做是因为在我的脚本中我检查了诸如 cpus 的数量之类的东西,这取决于 cpus 可能是 4、8、16 的节点。此外,我有多个集群,它们总是在改变大小,我不想要脚本具有硬编码的特定集群或节点信息。主要是,我这样做是因为当用户提交作业时,我会检查他们可以使用多少资源。如果说他们想使用队列并请求 200 cpus 但在集群 A 上,他们的作业将排队,我的脚本可以告诉他们他们将排队但不会在集群 b 或 d 上。因此,他们可以选择在提交之前进行更改。

我还用它来检查节点是否关闭:

@nodes_down=`pbsnodes -l -s $server `;

我看到正在使用哪些资源:

@nodes_used=`pbsnodes -av -s $server | grep "resources_assigned.ncpus" `;

同样在一种情况下,我在等待硬件时有两个集群在一个头节点上运行。在这种情况下,我会检查节点分配给哪个集群,然后根据分配给该集群的节点进行计数。这样,所有用户看到的都是另一个集群,并以他们对任何其他集群的方式使用脚本。

我只是提到,因为我发现了很多有用的方法来使用 pbsnodes,并且它可以很好地满足我的特定需求。

于 2013-07-24T13:17:40.447 回答