如何在Sun Grid Engine上保留完整的节点?

你如何使用SGE来保留集群上的完整节点?

我不需要一台机器的2个处理器,另一台机器的3个处理器,等等。 我有一个四核群集,我想保留4个完整的机器,每个有4个插槽。 我不能只指定我想要16个插槽,因为它不能保证每台机器上都有4个插槽。

将分配规则更改为FILL_UP是不够的,因为如果没有完全空闲的机器,SGE将尽可能简单地“填满”最less装载的机器,而不是等待4个空闲机器, 然后调度任务。

有什么办法可以做到这一点? 有没有更好的地方来问这个问题?

SGE对此很奇怪,在一般情况下,我还没有find一个好办法。 有一件事你可以做,如果你知道你想要的节点的内存大小是qsub,而预留的内存量几乎等于节点的全部容量。 这将确保它抓住一个没有其他运行的系统。

我想我find了一个方法,但是对于像我这样的老SGE来说可能不起作用。 看来SGE的新版本内置独家排程。

https://web.archive.org/web/20101027190030/http://wikis.sun.com/display/gridengine62u3/Configuring+Exclusive+Scheduling

我考虑过的另一种可能性,但很容易出错,是使用qlogin而不是qsub,并手动在每个所需的quadcore机器上预留4个插槽。 可以理解的是,自动化并不是特别简单或有趣。

最后,也许这是一个可以使用主机组的情况。 因此,例如,创build一个包含4个quadcore机器的主机组,然后qsubbing这个特定的子集的队列,请求数量的处理器等于组中的最大总数。 不幸的是,这就像硬编码,有很多缺点,例如不得不等待人们腾出一个特定的硬编码主机组,如果你想切换到8而不是4台机器,需要改变。

好像有这个隐藏的命令行请求添加:

-l excl=true 

但是,您必须将其configuration到SGE或OpenGridScheduler中,方法是将其添加到复杂值列表(qconf -mc)并启用每个主机(qconf -me主机名)

有关详细信息,请参阅以下链接: http : //web.archive.org/web/20130706011021/http : //docs.oracle.com/cd/E24901_01/doc.62/e21978/management.htm#autoId61

综上所述:

types:

 qconf -mc 

并添加行:

 exclusive excl BOOL EXCL YES YES 0 1000 

然后:

 qconf -me <host_name> 

然后编辑complex_values行来读取:

 complex_values exclusive=true 

如果您有任何特定于主机的complex_values,那么只需用逗号分隔它们。

我正在尝试做几乎完全相同的事情,并正在寻找想法。 我认为pe_hostsfile是最好的select,但我不是我们SGE系统的pipe理员,也没有configurationhosts文件,所以我需要快速解决。 刚刚检查出configuration独占调度链接,看到这也需要pipe理权限…

我认为一个包装脚本可以做到这一点。 我写了一个bash单线程计算出一台机器上剩余的可用内核数量(下图)。 我们的网格是异构的,一个节点有24个核心,大约8个,大多数只有4个,这使得事情有点尴尬。

无论如何,这是一个单线程。

 n_processors=`qhost | awk 'BEGIN{name="'\`hostname\`'"} ; {if($1==name){print int($3)-int($4+0.99)}}'` 

现在的问题是如何获得这个bashvariables成SGE启动脚本预处理指令? 也许我只是在shell脚本中提供了下面的参数,就像pvm环境在SGE中一样。 不代表它已经configuration好了…

 #$ -pe pvm 24-4 

Sun的“pipe理并行环境”页面非常有帮助,但是这些说明主要针对pipe理员。

我们将分配规则设置为节点上可用的插槽数量(在本例中为4)。 这意味着您只能使用n * 4个CPU启动作业,但可以达到预期的效果:16个CPU将分配为4个节点,每个CPU有4个CPU。

在PEconfiguration中指定分配规则为$ pe_slots

这将导致所有的插槽在一台主机上分配

我终于find了答案。 起初,我使用上述的-l excl=True设置。 但是这并不能解决问题。

要完全解决这个问题,我必须设置和额外的pe_environment。 在我的集群上,我们有12个核心节点。 所以我会用这个作为我的例子。

我创build了一个名为mpich2_12的附加环境。 粘贴在下面

 pe_name mpich_12 slots 999 user_lists sge_user xuser_lists NONE start_proc_args /opt/gridengine/mpi/startmpi.sh -catch_rsh $pe_hostfile stop_proc_args /opt/gridengine/mpi/stopmpi.sh allocation_rule 12 control_slaves TRUE job_is_first_task FALSE urgency_slots min accounting_summary TRUE 

请注意,allocation_rule设置为12,这意味着作业必须在节点上使用12个内核。 如果您提交了一个请求48个CPU的作业,它将等待并获取4个FULL节点。

我仍然使用-l excl=True选项,但是现在我怀疑这是不相关的。

如果我有只需要一个CPU的工作(我这样做),我将它们提交到相同的队列,但没有-l exel=True选项,并使用我的原始pe_environment ,其中有allocation_rule = 'fillup'提交allocation_rule = 'fillup'任何作业与mpich_12环境将等待,直到有完整的节点空闲。 我的集群现在工作得好多了。