背景
torque
集群系统可以看成一台计算机,允许多个用户同时使用,资源的分配成为不可回避的问题。开源软件torque为计算机集群资源管理提供了便利。
用户通过特定格式的输入文本(通常称为pbs文件)进行任务提交,系统根据用户的需求与现有计算资源,进行任务调度。用户在编写pbs文件时,往往想要预先知道计算资源使用情况,以进行合理的资源请求。torque也为用户提供了pbsnodes命令以查看计算节点使用情况。
pbsnodes
- 首先看一下
pbsnodes的使用说明
[engzsinger@master ~]$ pbsnodes --help
usage: pbsnodes [-{c|d|l|o|p|r}] [-s server] [-n] [-N "note"] [-q] node ...
pbsnodes [-{a|x}] [-s server] [-q] [node]
# -s 指定想查看的pbs服务器对应的计算资源,一般为一个服务器,所以无需指定
[engzsinger@master ~]$ man pbsnodes
No manual entry for pbsnodes
[engzsinger@master ~]$
pbsnodes命令支持详细查看节点任务信息,也能够通过添加参数查看简略信息
#详细信息,包括节点状态、任务ID、占用CPU情况
#######################################
[engzsinger@master ~]$ pbsnodes
n01
state = job-exclusive
np = 24
properties = new
ntype = cluster
jobs = 0/82129.ILC,1/82129.ILC,2/82129.ILC,3/82129.ILC,4/82129.ILC,5/82129.ILC,6/82129.ILC,7/82129.ILC,8/82129.ILC,9/82129.ILC,10/82129.ILC,11/82129.ILC,12/82129.ILC,13/82129.ILC,14/82129.ILC,15/82129.ILC,16/82129.ILC,17/82129.ILC,18/82129.ILC,19/82129.ILC,20/82129.ILC,21/82129.ILC,22/82129.ILC,23/82129.ILC
status = rectime=1597674798,varattr=,jobs=82129.ILC,state=free,netload=310433250397,gres=,loadave=10.17,ncpus=48,physmem=65930652kb,availmem=101845780kb,totmem=133039508kb,idletime=2359271,nusers=3,nsessions=8,sessions=5342 5699 5703 5704 5730 5732 5756 20886,uname=Linux n01 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64,opsys=linux
mom_service_port = 15002
mom_manager_port = 15003
n02
state = job-exclusive
np = 24
properties = new
ntype = cluster
jobs = 0/82156.ILC,1/82156.ILC,2/82156.ILC,3/82156.ILC,4/82156.ILC,5/82156.ILC,6/82156.ILC,7/82156.ILC,8/82156.ILC,9/82156.ILC,10/82156.ILC,11/82156.ILC,12/82156.ILC,13/82156.ILC,14/82156.ILC,15/82156.ILC,16/82156.ILC,17/82156.ILC,18/82156.ILC,19/82156.ILC,20/82156.ILC,21/82156.ILC,22/82156.ILC,23/82156.ILC
status = rectime=1597674794,varattr=,jobs=82156.ILC,state=free,netload=287160335761,gres=,loadave=10.79,ncpus=24,physmem=65933796kb,availmem=91006004kb,totmem=133042652kb,idletime=2359264,nusers=3,nsessions=8,sessions=4094 4467 4471 4472 4498 4500 4524 15983,uname=Linux n02 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64,opsys=linux
mom_service_port = 15002
mom_manager_port = 15003
# 。。。。。。
gpu01
state = free
np = 28
properties = new
ntype = cluster
jobs = 0/82157.ILC,1/82157.ILC,2/82157.ILC,3/82157.ILC,4/82157.ILC,5/82157.ILC,6/82157.ILC,7/82157.ILC,8/82157.ILC,9/82157.ILC,10/82157.ILC,11/82157.ILC,12/82157.ILC,13/82157.ILC,14/82157.ILC,15/82157.ILC,16/82157.ILC,17/82157.ILC,18/82157.ILC,19/82157.ILC,20/82157.ILC,21/82157.ILC,22/82157.ILC,23/82157.ILC
status = rectime=1597674777,varattr=,jobs=82157.ILC,state=free,netload=1157191776581,gres=,loadave=37.37,ncpus=28,physmem=57638212kb,availmem=80700076kb,totmem=123174208kb,idletime=2362377,nusers=4,nsessions=9,sessions=5731 6262 25757 16162 25204 25208 25209 25216 25219,uname=Linux gpu01 2.6.32-573.el6.x86_64 #1 SMP Thu Jul 23 15:44:03 UTC 2015 x86_64,opsys=linux
mom_service_port = 15002
mom_manager_port = 15003
# 查看简略信息,指定想要查看的状态,列出对应的节点
###################################################
[engzsinger@master ~]$ pbsnodes -n free -l
n04 free
n05 free
n06 free
n07 free
gpu01 free
[engzsinger@master ~]$ pbsnodes -n job-exclusive -l
n01 job-exclusive
n02 job-exclusive
n03 job-exclusive
n08 job-exclusive
存在的问题
一个计算节点上有多个CPU核心,有时候计算任务不需要分配过多计算核心,在提交任务时,就会在pbs文件中添加以下语句指定计算核心。
#PBS -l nodes=n01:ppn=4
想要实现这样精准的设定,就需要知道节点的核心占用情况,而上述提到的pbsnodes命令要么查看详细信息,不够直观,要么就太简略,无法实现这一需求。所以需要自定义脚本查看节点占用信息。
脚本编写
目标
根据以上背景提到的问题,脚本的输出应该是一个计算节点的列表,但是计算节点列表后面不再是简单的节点状态如free之类的,而是一个描述CPU占用情况的数值。
脚本实现
既然pbsnodes已经能够输出我们所需的所有信息,那我们需要做的就是将他的输出信息进行格式化输出,得到简单的同时满足我们需求的信息。这里主要用到linux的文本处理工具sed、awk等。具体代码实现如下:
#! /bin/bash
# to query free nodes and avaliable cpu number
# by engzsinger 2020/01/02 23:45
#先将详细的信息输出到临时文件.pbsnodes中
pbsnodes > .pbsnodes
#sed -i 对文件进行就地修改,删除相应的行
sed -i '/state/d' .pbsnodes
sed -i '/properties/d' .pbsnodes
sed -i '/ntype/d' .pbsnodes
sed -i '/status/d' .pbsnodes
sed -i '/mom/d' .pbsnodes
#采用正则表达式识别节点 n01、n02等,并输出到临时文件中
awk '$1 ~ /[a-z]+[0-9]+/ {print $1}' .pbsnodes > .node
# 逐个节点输出
while read lines
do
sed -n '1,3p' .pbsnodes > .nt
np=`awk '$3 ~ /[0-9][0-9]$/ {print $3}' .nt`
op=`awk -F, '$1 ~ /jobs/ {print NF}' .nt`
if [ -z $op ]
then
let op=0
fi
if [ $op -ne '0' ]
then
sed -i '1,4d' .pbsnodes
else
sed -i '1,3d' .pbsnodes
fi
let fp=$np-$op
echo $lines $fp
done < .node
#删除临时文件
rm .pbsnodes
rm .nt
rm .node
脚本最关键的点在于正确读取被占用CPU的格式,这里是通过设置awk的分隔符为,来实现CPU占用情况计数,当然如果对shell脚本以及linux常用文本处理工具有更深的理解,一定还有更简便的方法实现,这里水平有限,凑合着这么用了。
脚本运行的输出信息
脚本编写完成后,可以改变文件属性,方便后续脚本运行。得到的输出信息如下,正好符合我们的期望。可以看出n04和gpu01各有4个空闲CPU,如果我们的任务对CPU要求不高,而此时其他节点又被占满,设置需求资源以提交到这几个节点也是不错的选择。
[engzsinger@master ~]$ chmod +x node.sh
[engzsinger@master ~]$ ./node.sh
n01 0
n02 0
n03 0
n04 24
n05 28
n06 28
n07 4
n08 0
gpu01 4
写在后面
这里只实现了CPU数量的输出,如果想知道每个节点上对应的任务ID,也可以用过自定义脚本来实现,无非就是将输出信息重定向到一个临时文件,然后删删减减。
在torque集群系统中,为了合理分配计算资源,需要了解节点的CPU占用情况。原pbsnodes命令提供的信息要么过于详细,要么过于简略。因此,编写了一个脚本,该脚本以格式化的输出列出计算节点及其CPU占用情况,便于用户根据需求设定任务的计算核心。脚本主要利用和文本处理工具进行实现,输出结果直观展示了每个节点的空闲CPU数量,有助于任务调度。
6362

被折叠的 条评论
为什么被折叠?



