原创作者:zhangguangping
转载自:点击打开链接
最近配置集群的时候,遇到了一个问题:我们的集群组分比较复杂,想对不同的用户对不同的节点有不同的使用权。所以需要将节点对用户分配。这个问题困扰了几天。几天来,看手册,上网搜资料,将所有能找到的办法都试了,还是不理想。并且发现Torque和maui的讨论区以及小木虫论坛上都有人问过这个问题。
下面我把我的解决办法分享给大家,希望对大家有用。如果有虫友有更高级的办法,欢迎跟帖指教,将不胜感激。
首先我介绍一下我尝试过的思路。
第一:maui手册上提到,可以对节点进行partition,利用这个功能可以实现将节点分配给用户。(但是这个办法操作了之后,发现不好用,并且maui讨论区里面有人说这个功能有许多bug,还不成熟)
具体做法是:
1.编辑/usr/local/maui下面的maui.cfg文件(这个是maui的配置文件)
添加
NODECFG PARTITION=sugon
NODECFG PARTITION=sugon
NODECFG PARTITION=sugon
NODECFG PARTITION=sugon
NODECFG PARTITION=sugon
NODECFG PARTITION=sugon
NODECFG PARTITION=sugon
NODECFG PARTITION=sugon
NODECFG PARTITION=sugon
NODECFG PARTITION=sugon
NODECFG PARTITION=sugon
NODECFG PARTITION=sugon
NODECFG PARTITION=powerlead
NODECFG PARTITION=powerlead
NODECFG PARTITION=powerlead
NODECFG PARTITION=powerlead
NODECFG PARTITION=powerlead
NODECFG PARTITION=powerlead
NODECFG PARTITION=powerlead
NODECFG PARTITION=powerlead
NODECFG PARTITION=powerlead
NODECFG PARTITION=dell
NODECFG PARTITION=dell
NODECFG PARTITION=dell
NODECFG PARTITION=dellmolpro
NODECFG PARTITION=dellmolpro
NODECFG PARTITION=dellmolpro
中的*是计算节点的名字,后面的sugon,powerlead,dell,dellmolpro是给节点分的区,总共将所有节点分为四个块。
然后再在文件中添加:
GROUPCFG PLIST=dellmolpro PDEF=dellmolpro
GROUPCFG PLIST=sugon:powerlead:dell PDEF=sugon
GROUPCFG PLIST=sugon:powerlead:dell PDEF=sugon
GROUPCFG PLIST=sugon:powerlead:dell PDEF=powerlead
GROUPCFG PLIST=dell:powerlead PDEF=dell
表示用户组siesta的用户可以使用的分区列表是sugon:powerlead:dell,其中sugon分区是默认的分区,任务优先提交到这个分区。
剩下的就是将不同的用户分配到不同的用户组就可以了。
上面看着挺好的想法。但是具体计算的时候发现,编写完了脚本之后,提交任务的时候,确实按照上面说的操作了。比如siesta用户组的成员将sugon:powerlead:dell 分区提交满了之后,他会侵占dellmolpro分区,这个是不希望看到。
因为想让用户的任务在规定的分区上计算,分区满了,就排队,直到自己的分区有资源位置,用户在提交任务的时候,脚本里面添加
#PBS -W x=PARTITION:powerlead
就表示将任务只提交到powerlead分区。但是这个具体操作起来不能用。表现为有时候可以用,有的时候不能用,有的分区可以这样写,有的分区却不能这样写。总之一句话,不稳定。(确实如maui论坛里面说的那样,bug有点多)
第二:看到maui论坛上,每有人问及这个问题,总是有人回答说最好用standing reservation功能。仔细看了看手册,并且看到论坛里面还有人说用这个功能的时候,用户没法同时使用两个reservation,并且看到配置起来较麻烦,所以放弃了这个思路。
第三:万般无奈之时想到了Torque的队列和nodes文件的备注。
1.修改/var/spool/torque/server_priv/nodes文件
node01 np=12 sugon siesta dalton gaussian
node02 np=12 sugon siesta dalton gaussian
node03 np=12 sugon siesta dalton gaussian
node04 np=12 sugon siesta dalton gaussian
node05 np=12 sugon siesta dalton gaussian
node06 np=12 sugon siesta dalton gaussian
node07 np=12 sugon siesta dalton gaussian
node08 np=12 sugon siesta dalton gaussian
node09 np=12 sugon siesta dalton gaussian
node10 np=12 sugon siesta dalton gaussian
node11 np=12 sugon siesta dalton gaussian
node12 np=12 sugon siesta dalton gaussian
node31 np=8 powerlead siesta dalton gaussian others
node32 np=8 powerlead siesta dalton gaussian others
node33 np=8 powerlead siesta dalton gaussian others
node34 np=8 powerlead siesta dalton gaussian others
node35 np=8 powerlead siesta dalton gaussian others
node36 np=8 powerlead siesta dalton gaussian others
node38 np=8 powerlead siesta dalton gaussian others
node39 np=8 powerlead siesta dalton gaussian others
node40 np=8 powerlead siesta dalton gaussian others
node41 np=8 dell siesta dalton gaussian others
node42 np=8 dell siesta dalton gaussian others
node43 np=8 dell siesta dalton gaussian others
node44 np=8 dell molpro
node45 np=8 dell molpro
node46 np=8 dell molpro
将每一个节点分配上属性,每一个节点可以加多个属性,这一点是该方法成功的关键所在。
2.然后创建一系列的队列,并且指定队列只接受哪个用户组的任务,为了简单起见,每一个用户组创建一个相似的队列。然后给队列指定默认的资源。
举一例如下:
创建siesta用户对应的队列SIESTA
qmgr -c "create queue SIESTA queue_type=execution"
创建SIESTA队列,并且指定类型为execution
qmgr -c "set queue SIESTA started=true"
指定SIESTA队列中的任务可以被调度执行
qmgr -c "set queue SIESTA enabled=true"
指定SIESTA队列可以接受新的任务
qmgr -c "set queue SIESTA acl_group_enable=true"
指定SIESTA队列专属某一个用户组
qmgr -c "set queue SIESTA acl_groups=siesta"
指定SIESTA队列的专属用户组为siesta用户组,只有属于siesta用户组的用户才能向改队列中提交任务,其他的用户组不可以。当然,一个用户可以属于多个用户组。
qmgr -c "set queue SIESTA acl_group_sloppy=true"
指定是不是只看用户的第一用户组来决定对队列的使用权。如果该项没有,则只有第一用户组为siesta的用户组才能向该队列对提交任务,如果该项为true,表示检查用户的其他用户组属性。
qmgr -c "set queue SIESTA resources_default.neednodes=siesta"
指定SIESTA队列使用的计算节点是siesta属性的(上面1中指定的)
创建完毕后,可以用qmgr -c "p s"查看创建的队列情况,如下
# Create and define queue SIESTA
#
create queue SIESTA
set queue SIESTA queue_type = Execution
set queue SIESTA resources_default.neednodes = siesta
set queue SIESTA acl_group_enable = True
set queue SIESTA acl_groups = siesta
set queue SIESTA acl_group_sloppy = True
set queue SIESTA enabled = True
set queue SIESTA started = True
其他的用户组都可以类比着创建自己的专属队列。
3.启动服务节点的pbs_server服务和maui服务:
qterm -t quick
停止pbs_server服务
pbs_server
重启pbs_server服务
ps -A |grep maui
找出maui的进程号
18066 ? 00:00:00 maui
杀掉maui进程
kill 18066
重新启动maui
/usr/local/software/maui-3.3.1/sbin/maui
好了,到此为止,大功告成。可以使用了
属于siesta用户组的用户提交任务,就可以默认提交到node01-node43上,只要提交满了,就排队,不能提交到node44-node46上。
但是siesta用户组的成员如果想将自己的某一个任务提交到sugon上,而不是powerlead或者dell上,则可以在自己的脚本中写上:
#PBS -l nodes=1:sugon:ppn=8
表示该任务只向sugon机器提交,如果sugon满了,就排队,即使powerlead和dell有空闲。
如果写为#PBS -l nodes=1:dell:ppn=8
那么siesta用户组的用户只能提交到node41,42,43这三个上,如果满了,就排队,直到这三个节点有空余。不会侵占到node44-node46上。
也就是说这儿对节点属性的要求和队列本身对节点的要求是 “与(and)”的关系。
如果写成:
#PBS -l nodes=1:ppn=8
那么就会从node43倒序向node01检查,看是否有空闲资源。也就是说dell机器优先。
这种做法有一个不令人满意的地方:如果other用户组的用户用OTHER队列向sugon提交任务的话,那么可以提交,并且不出错,但是任务始终在排队状态,永远不会被执行。