我试图使用 LSF 将作业提交到 LSF 中使用最少的机器
bsub -R "order[ut]"
它按预期工作,但所有作业(背靠背提交)最终都在同一个主机(使用最少的主机)中,因此机器负载很重,最终导致作业性能不佳。有没有办法将连续提交的作业分散到使用最少的机器上?或者一种计算机器上使用了多少个插槽的方法?
根据您的描述,很难确定,但我猜您所看到的是由 LSF 调度周期的性质引起的影响。以下是关于订单字符串的 LSF 文档的摘录:
http://www-01.ibm.com/support/knowledgecenter/SSETD4_9.1.3/lsf_admin/order_string.dita
假设主机 h1 存在于集群中,拥有 110 个单位的可消耗资源“res”,而主机 h2 拥有 20 个该资源(例如,“res”可以是新的批次内置资源槽)。假设这两个作业在同一个调度周期中处于挂起状态并被调度器考虑,作业1将首先被调度:
Job1: bsub -R “maxmem>1000” -R “order[res] rusage[res=100]” -q q1 sleep 10000
Job2:bsub -R“mem<1000”-R“order[res] rusage[res=10]”-q q2 sleep 10000
在调度周期的早期,通过获取集群中的所有主机或在任何询问的主机列表 (-m) 中列出的主机并按照资源要求字符串的 order 部分对它们进行排序来构建候选主机列表。假设作业的有序候选主机列表在排序后如下所示:
工作1:{h1,h7,h4,h10}
作业2:{h1,h2}
这意味着 h1 最终成为两个作业的候选主机列表中最高的“分辨率”主机。仅在以后的调度中,每个作业将被分配一个运行的主机和来自这些主机的资源。
假设 Job1 计划登陆主机 h1,因此将分配 100 个“资源”。然后当考虑 Job2 时,它也可能被安排在主机 h1 上,因为它的候选主机列表看起来仍然相同。也就是说,它没有考虑在同一调度周期内分配给 Job1 的 100 个“资源”。
简而言之,您一次提交一堆作业并要求候选主机按资源“ut”排序,但在单个调度周期内,主机不会重新排序,因为作业已安排给它们。如果您将作业提交间隔开,以便将它们分别安排在不同的周期中,您会看到作业被分派到不同的主机。
现在,该文档的页面还继续描述如何强制 LSF 为每个作业在周期内重新排序主机,只需添加一个“!”即可。在订单字符串中:
bsub -R "order[!ut]"
我会警告您,如果您的集群中有很多作业,这可能会显着减慢调度速度。
此外,我不能 100% 确定这是否适用于资源“ut”(因为它的值不会随着作业的安排而改变),您可能想尝试添加的内置资源“槽”我相信的最新版本:
bsub -R "order[!slots]"
编辑
我的几个同事想出了另一种方法来绕过这种行为,而不使用“!” 字符串中的符号order
,即设置JOB_ACCEPT_INTERVAL
参数lsb.params
为1。
这将执行每分钟分配给任何特定主机的 1 个作业的限制,这将使ut
资源有时间刷新和平衡主机之间的工作负载。