如何使用 SGE 在集群上保留完整的节点?
我并不想一台机器有 2 个处理器,另一台机器有 3 个处理器,等等。我有一个四核集群,我想保留 4 台完整的机器,每台机器有 4 个插槽。我不能只指定我想要 16 个插槽,因为这不能保证我在 4 台机器上每台都有 4 个插槽。
将分配规则改为 FILL_UP 是不够的,因为如果没有完全空闲的机器,SGE 会尽可能地“填满”负载最低的机器,而不是等待 4 台空闲的机器,然后然后安排任务。
有什么办法可以做到这一点吗?有没有更好的地方可以提出这个问题?
答案1
SGE 在这方面表现得很奇怪,而且我还没有找到在一般情况下做到这一点的好方法。如果您知道所需节点的内存大小,您可以做的一件事就是在保留几乎等于节点全部容量的内存量的同时执行 qsub。这将确保它抓取一个没有其他任何程序在其上运行的系统。
答案2
我想我找到了一种方法,但它可能不适用于像我这样的旧 SGE。新版本的 SGE 似乎内置了独家调度功能。
我考虑过另一种可能性,但很容易出错,即使用 qlogin 而不是 qsub,并在每台所需的四核机器上手动预留 4 个插槽。可以理解的是,自动执行这一操作并不特别容易或有趣。
最后,也许这是可以使用主机组的情况。例如,创建一个包含 4 台四核机器的主机组,然后 qsubbing 到队列的这个特定子集,请求的处理器数量等于组中的最大总数。不幸的是,这有点像硬编码,有很多缺点,例如必须等待人们腾出特定的硬编码主机组,并且如果您想切换到 8 台而不是 4 台机器,则需要进行更改等。
答案3
似乎有这个隐藏的命令行请求要添加:
-l excl=true
但是您必须将其配置到您的 SGE 或 OpenGridScheduler 中,方法是将其添加到复杂值列表 (qconf -mc) 并启用每个单独的主机 (qconf -me hostname)
总之:
类型:
qconf -mc
并添加以下行:
exclusive excl BOOL EXCL YES YES 0 1000
然后:
qconf -me <host_name>
然后编辑 complex_values 行使其内容:
complex_values exclusive=true
如果其中已有任何特定于主机的复杂值,则只需用逗号将它们分隔开。
答案4
我们将分配规则设置为节点上可用的插槽数(在本例中为 4)。这意味着您只能使用 n*4 个 CPU 启动作业,但它将实现预期结果:16 个 CPU 将分配为 4 个节点,每个节点有 4 个 CPU。