2013-07-23 12 views
3

對於用qsub調用的PBS腳本,我想知道在PBS文件中定義的數量是否被命令行輸入覆蓋的情況下實際分配了多少CPU。例如用下面的PBS腳本文件:確定PBS腳本內的qsub之後的CPU總數

jobscript.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數量。

回答

5

我能回答我的問題與使用包含上市有關的可用節點信息的文件路徑的$PBS_NODEFILE環境變量以下解決方案:

jobscript.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" 

感謝「Source」經過多次在線搜索。

+1

繼續並接受你自己的答案,這個問題將被關閉。 –

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++; 
} 

我這樣做,因爲在我的劇本我檢查喜歡這取決於節點上CPU的數量,事情的CPU,也許是4,8,16,我也有多個集羣,其總是在不斷變化的大小和我不希望腳本具有特定的羣集或節點信息硬編碼。主要是,我這樣做是因爲當用戶提交作業時,我會檢查他們可以使用多少資源。如果他們想要使用隊列並請求200 cpu但在羣集A上,他們的作業將排隊,我的腳本可以告訴他們他們將排隊,但不會在羣集b或d上。那麼他們可以選擇在提交之前進行更改。

我還用它來檢查節點下:

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

我看看有什麼資源都在使用:

在一種情況下
@nodes_used=`pbsnodes -av -s $server | grep "resources_assigned.ncpus" `; 

我也有兩個集羣流失一個頭節點,而我等待硬件。在這種情況下,我會檢查該節點分配給哪個集羣,然後根據分配給該集羣的節點進行計數。這樣,所有用戶看到的都是另一個集羣,並使用他們對其他任何集羣的方式。

我只是提到,因爲我發現了很多有用的方法來使用pbsnodes,並且它對我的特殊需求非常有效。