TL; DR:在计划作业时,是否有任何方法可以使SGE在服务器之间轮循,而不是在可能的情况下将所有作业分配给同一服务器?
详细信息:
我有一个大型的计算过程,其中包含许多较小的工作。我正在使用SGE在群集中的多个服务器之间分配工作。
该过程在不同的时间点需要不同数量的任务(从技术上讲,它是作业的DAG)。有时并行作业的数量非常大(集群中每个CPU约1个),有时却非常小(每个服务器约1个)。 DAG是动态的且不统一,因此要确定在任何给定点有/将要进行多少并行作业并不容易。
作业使用大量CPU,但也执行少量的IO(尤其是在作业启动和关闭时)。他们访问连接到所有计算服务器的共享NFS服务器。每个计算服务器具有较窄的连接(10Gb / s),但是NFS服务器具有通向通信交换机的多个较宽的连接(40Gbs)。不确定交换机主干的带宽是多少,但是它是一个怪物,因此应该很高。
为了获得最佳性能,应在可能的情况下在不同服务器上安排作业。也就是说,如果我有20台服务器,每台服务器有20个处理器,则提交20个作业应在每个服务器上运行一个作业。提交40个作业应在每个作业上运行2个,依此类推。提交400个作业将使整个群集饱和。
但是,SGE有害于最大程度地降低I / O性能。提交20个作业将在单个服务器上安排所有作业。因此,当其他19台带宽为190Gb的计算机闲置时,它们都为一个仅10Gb的网络连接而战。
我可以强制以多种方式(使用资源,使用特殊队列,使用并行环境以及指定“ -t 1-”等)在不同的服务器上执行每个作业。但是,这意味着我只能在每个服务器上期间运行一个作业。当DAG打开并产生许多作业时,这些作业将停止等待完全免费的服务器,而每台计算机的20个处理器中有19个将保持空闲状态。
我需要的是一种告诉SGE将作业按轮循顺序分配给具有可用插槽的下一台服务器的方法。更好的方法是将作业分配给负载最少的服务器(最大数量的未使用插槽,或最大部分的未使用插槽,或最小数量的已使用插槽,等等)。但是一个简单的死循环就可以解决问题。
与SGE的将每个作业与上一个作业在同一台服务器上运行的策略相比,这似乎是一种更为明智的策略 ,这对我来说是最糟糕的策略。
我查看了SGE的配置选项,但是找不到任何修改调度策略的方法。也就是说,SGE的文档并不十分容易浏览,所以我很容易错过一些东西。
有人知道任何方法使SGE沿着这些路线将其调度策略更改为轮询或最小负载或任何吗?
谢谢!
答案 0 :(得分:1)
对于SGE并行环境(allocation_rule
文件),只需将$round_robin
更改为sge_pe
:
allocation_rule
The allocation rule is interpreted by the scheduler thread
and helps the scheduler to decide how to distribute parallel
processes among the available machines. If, for instance, a
parallel environment is built for shared memory applications
only, all parallel processes have to be assigned to a single
machine, no matter how much suitable machines are available.
If, however, the parallel environment follows the distri-
buted memory paradigm, an even distribution of processes
among machines may be favorable.
The current version of the scheduler only understands the
following allocation rules:
<int>: An integer number fixing the number of processes
per host. If the number is 1, all processes have
to reside on different hosts. If the special
denominator $pe_slots is used, the full range of
processes as specified with the qsub(1) -pe switch
has to be allocated on a single host (no matter
which value belonging to the range is finally
chosen for the job to be allocated).
$fill_up: Starting from the best suitable host/queue, all
available slots are allocated. Further hosts and
queues are "filled up" as long as a job still
requires slots for parallel tasks.
$round_robin:
From all suitable hosts a single slot is allocated
until all tasks requested by the parallel job are
dispatched. If more tasks are requested than suit-
able hosts are found, allocation starts again from
the first host. The allocation scheme walks
through suitable hosts in a best-suitable-first
order.
来源:http://gridscheduler.sourceforge.net/htmlman/htmlman5/sge_pe.html